Kal - A Clean Alternative to JavaScript Without Callbacks
Egy JavaScriptre forduló aszinkron nyelv a callback hell nélkül
■ H | K | Sze | Cs | P | Szo | V |
---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 1 | 2 | 3 | 4 | 5 |
Pont be akartam küldeni én is
Legközelebb megtartóztatom
Nem értem
yield
nyelvi elemre hasonlít a Kal szintaktikában await
.Ezekkel pontosan ekvivalens lenne, ha a futtatókörnyezet alapértelmezésben elrejtené előlünk az aszinkron hívásokat, és egy adatbázis-lekérdezésnél úgy viselkedne, mintha az szinkron lenne. Érdemes összehasonlítani a három módot:
Kal:
wait for user from db.users.findOne {name: userName}
Yield-del:
var user = yield db.users.findOne({name: userName});
Szinkron:
var user = db.users.findOne({name: userName});
Roppant hasonlítanak.
Minden a szinkron kód mellett szól, mert ehhez nem kell új szintaktikát (
yield
) vagy új nyelvet (Kal) bevezetni.Az egyedüli ami ellene szól
A
yield
és await for
jelentése nem teljesen azonos (utóbbi inkább a C#await
kulcsszavának felel meg)Szerintem ő arra gondolt,
Csak a szintaktika által arról "ne tudjon". Valósítsa meg úgy mint ha szinkron lenne.
szerk: én se tartom elképzelhetőnek.
A háttérben minden maradna
yield
és await
for jelentése nem teljesen azonosAz aszinkronnak pont az a
Az ilyen waites és egyéb megoldások értelme az alábbi:
Ezt szerintem szinkron hívás
fread()
függvényét. Ha elkezdesz beolvasni egy fájlt, akkor az operációs rendszer lefagy, az egeret nem tudod mozgatni, billentyűleütésre nem reagál a gép? Vagy csak ez is egy rejtett aszinkron hívás, aminek a végén visszakerül a vezérlés a függvényedbe? A fordító honnan tudja, melyik ponton akarod feldolgozni az eredményét?Az alkalmazás
Vagy csak ez is egy rejtett
Szerintem érdemes kicsit az event-driven és a többszálú programozásnak is utánaolvasnod, hogy rendesen megértsd mi megy a háttérben, és milyen problémákra milyen megoldások vannak a különböző nyelvekben.
Nézem az erlangot, olvasgatok
Érdemes megnézni a
Az alapján, amit eddig
Az egyszálú környezet
"Egy webszerver nem ilyen
Ha már itt tartunk, pont múltkor volt egy vitám egy tipikus PHP utálóval, akinek mindegy miről van szó, ha PHP, mert akkor már szar. (Jó, valljuk be, PHP-vel valóban vannak komoly bajok). Meg lassú. Nos, múltkor méricskéltem, átlag 80-85% adatbázis-lekérdezés a PHP kódhoz viszonyítva.
A PHP nem tökéletes, de ahogy
... ha a futtatókörnyezet
Én nem tudom, azért a wait for, vagy valami szerintem nem baj ha ott van. Szeretek tudni róla ha valami aszinkron módon történik, főleg ha épp ciklusban vagyok.
Mondjuk nekem tetszik a Kal megvalósítása. A ciklusoknál meg kifejezetten. Ezt eltudnám viselni a futtató környezetben.
Amire még kíváncsi lennék a jövőben, hogy az erőforrások elérésének korlátozására építenek-e be megoldásokat. Olyasmikre gondolok mint a Pool, hogy a párhuzamos mégis mennyire legyen párhuzamos.
Szeretek tudni róla ha valami
Tegyük fel, hogy az aszinkron
A válasz tehát az, hogy jó esetben beszélő programokat írunk, amik forrását olvasva x idő múlva is megérted, hogy mit csinál. Ha elrejted az aszinkron hívást, az információ óhatatlanul elveszik, és a jövőben ezt technical debt címszó alatt csúnyán meg fogod fizetni.
Pontosan milyen
Ha ciklusban vagyok, és elkezdem pörgetni a ciklust akkor szinkron módon feltételezem, hogy a végrehajtandó feladatok egymásutániságát. Amíg ha aszinkron vagyok ezek párhuzamosak lesznek. NodeJS-ben nálam szinte mindig hamarabb lefut maga a ciklus, mint ahogy az első eredményt megkapnám. Főleg DB lekérdezésnél.
Egyszer ha a ciklusom 100-at fordul akkor az 100 konkurens lekérdezés DBMS felé per látogató.
Egy saját megvalósításban is elő példa:
A felhasználó elküld egy videó fájl feltöltő form-ot.
El kezdődik a feldolgozás. Amint feltöltötte a videót, én máris megjelenítem neki az eredmény oldalt. De ez előtt még elindítom a videó átkonvertálását. Ez aszinkron történik. A felhasználót már nem érinti. Nehezen tudok itt elképzelni szinkron kódot.
Itt programozóként a szinkron kód engem jobban zavarna. (NodeJS)
Szerintem a wait for, yield, paralell, series kulcsszavak nagyon is hasznosak lennének egy szinkronnak tűnő kódban.
Szerk.: Azt belátom így is szervezhetem a kódot. Van egy fajta beidegződés már az aszinkron kódolás által.
A példád nem a legjobb, mert
Bár nem teljesen vagyok
Ha így van, akkor nem értem,
Hát vannak speciális sql
Én is így tudom. Ha jól látom
Ha jól látom bevett szokás párhuzamosan több kapcsolatot fenntartani és egy pool-ból kiszolgálni, ha nincs szabad kapcsolat akkor a kérések várakoznak.
(Bár én fenn DBMS alatt konkrétan a MongoDB-re gondoltam)
A példád nem a legjobb, mert
Igen, itt is külön processz de az csak egy feladat. Ott kilép egy másik szálra, de oda is tér vissza ha megvan vele (callback) és megy tovább a feldolgozás. Én addigra már a választ rég vissza küldtem a felhasználónak.
Konkrétan a MongoDB-ről van szó. Amúgy nem rontok neki párhuzamosan 100 lekérdezéssel. Csak azért írtam, hogy na különbség adódhat már 100 lekérdezésnél ha az párhuzamos vagy szinkron.
Itt pool-t építek be és tudom szabályozni a lekérdezésekből, hogy mennyit küldjek egyszerre párhuzamosan. Pl.: 5-8 párhuzamos kérés, ha egy végez mehet a következő. (Bár mondjuk néhány driver megoldja)
Cache miss vs scriptnyelvek
Mondjuk hogy ciklusban általánosságban nem feltétlenül éri meg adatbázishoz fordulni, azzal egyetértek. Meg azzal is, hogy drága a cache miss. De itt nem a cache miss ideje lesz a sok úgyse. Akkora cache misst úgyse tudsz produkálni, hogy össze lehessen vetni az adat hálón átrángatásával :) De szerintem ez a téma elég nagy ugrás a scriptnyelvektől. A vasat kihajtó kód készítése egy külön szakma, amit nagyon kevesen értenek jól, és teljesen más architektúra kell hozzá, mint pl egy átlagos weboldalhoz. De ha már, akkor a node.js architektúrája ehhez kicsit közelebb áll, mint pl a php.
Ezzel mit akarsz mondani?
Ha viszont valóban úgy működik, hogy a lekéréseket sorban, egymás után szolgálja ki, akkor ez nem gond. Ez valószínűleg így van, mert eszembe jutott, hogy pl. MySQL-ben van a
thread_concurrency
nevű beállítás, amit a magok számának kétszeresére célszerű állítani, azaz valószínű ennyi szálon mehet egyszerre lekérdezés párhuzamosan. Ebben az esetben viszont érdemes elgondolkozni azon, van-e értelme sok kérést egyszerre indítani, és hogy mit is nyerünk vele, főleg akkor, ha olyan adatbázisból kérdezünk le, ahol az adatok fizikailag egy tárolón vannak.Nem, hanem azt, hogy nem éri
minél előbb elindítasz egy
mysqli_multi_query()
, és akkor a kódnak sem kell széttöredeznie.Na ez pont ideális téma lenne
Minden nyelv
Az olyan nyelvekben, amik nem tudnak szálakat kezelni, vagy az nagyon bonyolult lenne, egy tökéletes megoldás. Szerintem nem szabad ezt elrejteni ezt a viselkedést a programozó elől, mert nem fogja tudni, hogy mire számítson, amikor először meglátja a kódot, és megpróbál benne mondjuk egy hibát felderíteni. Inkább legyünk beszédesek a működéssel kapcsolatban, mint elrejtsünk fontos részleteket. Főleg igaz ez akkor, ha a nyelvtől idegen ez a fajta működés (és valószínűleg a nyelvek jelentős részétől ez nagyon idegen).
Szerintem egy kicsit bele kéne ásnod magad az esemény vezérelt programozásba, és akkor megváltozna a véleményed, hogy miért is jó ez a megközelítés.
Aszinkron
- indítasz egy IO eseményt
- feliratkozol az onEseményComplete vezérlőre egy callback függvénnyel
- a függvényed futása leáll, a programod elalszik
- a vezérlés átkerül a node-hoz, amely futtatja a többi szálat
- az IO esemény befejeződik, kiváltódik az onEseményComplete
- a rendszer meghívja a callback-et
Az általam felvázolt rejtett aszinkron így működik:
- indítasz egy IO eseményt
- a függvényed futása leáll, a programod elalszik
- a vezérlés átkerül a node-hoz, amely futtatja a többi szálat
- az IO esemény befejeződik
- a vezérlés visszakerül az eredeti függvénybe
Ez utóbbi kísértetiesen hasonlít a
yield
-es megoldásra, csak nem kell hozzáyield
.Ha elindítok egy adatbáziskérést, azt azért teszem, mert szükségem van az adatokra. A programom addig nem tud továbblépni, amíg ezeket az adatokat meg nem kapom, mert ezek szükségesek a futáshoz.
A kérdésem számodra is adott: mi az a plusz információ, amit az hordoz számomra, hogy tudom: a rendszer aszinkron módon kéri le az adatbázisból az adatokat? Továbbá ezt az információt hogyan tudom felhasználni?
Lefagy
Ha elindítok egy
Amíg te az #1-es user
Nem értem, mit nem lehet
- indítasz egy IO eseményt
- a függvényed futása leáll, a programod elalszik
- a vezérlés átkerül a node-hoz, amely futtatja a többi szálat
Tehát hol állítom pontosan, hogy a node rejtett aszinkron módban nem tud tovább futni, és további ezer felhasználót kiszolgálni, vagy akár az alkalmazásom további párhuzamos szálait továbbfuttatni?
többi szálat
Lényegtelen. Amit eddig írtam
Erlang
Go
Igen, ez egy fokkal jobb,
Típusosság
Egy típusrendszer majd minden
A go-ra azt mondják, hogy
Leszámítva, hogy azt ígérte,
Ugyanitt szívesen veszem, ha valaki tud olyan modern, magasszintű, erősen statikusan tipizált, fordított nyelvet, amiben nincsenek kivételek, ellenben lehetőleg több értékkel is vissza lehet térni, vagy legalábbis vannak kimenő paraméterek vagy mutatók.
mi a baj a kivételekkel? mit
Az a baj velük, hogy egy
A Java ellenőrzött kivételei egy jó kezdeményezés volt, de a kivitelezés csapnivaló: egyrészt nem kizárólagos, másrészt a szabványos könyvtár tele van olyan semmitmondó kivételekkel (
IOException
), amikkel semmit nem lehet kezdeni, harmadrészt a kivételkezelés szintakszisa áttekinthetetlenné teszi a kódot, miközben a gyakorlatban a kivételek rég nem kivételes helyzetek jelzésére szolgálnak, pusztán csak másodlagos visszatérési értékek (lásdInteger.parseInt()
).Hogy mit használnék helyette? Thompsonék is rájöttek arra, amire én, és pont ugyanúgy oldották meg, ahogy én szeretném: több értékkel való visszatéréssel, ahol az egyik egy státuszkód. A Goban ez így is működik, kivéve, hogy utólag mégis került bele egy
panic()
-recover()
páros, ami effektív egythrow
-catch
, és így megint semmi garanciád nincs arra, hogy idegen kód hívásakor nem pukkad ki a lufi.Nem teljesen értem, mondjuk
$data, $error =
switch
helyén mondjuk mintaillesztés állna.Nekem a kettő tök egyformának
Mert egyformák is. A
Java esetében - ha jól tudom
Java esetében - ha jól tudom
Ezek volnának az ellenőrzött kivételek, de vannak ellenőrizetlenek is, előbbieknek pedig elég rossz a megítélése a közösségben, így aztán semmit nem javítanak a helyzeten.
Hogy érted, hogy tesztelve vannak? Egy ilyen függvényhívás lehet, hogy teliholdkor dob csak kivételt. Nem tudsz teljeskörűen tesztelni.
Ha nem lehet teljeskörűen
Annyira nem reális mondjuk a
A külső könyvtárakat
Checked vs unchecked
Itt van egy leírás a két típus közötti különbségről.
A lényeg:
Checked exceptions: Represent invalid conditions in areas outside the immediate control of the program (invalid user input, database problems, network outages, absent files)
Ha keresel a témában, a
Na ez a téma már tényleg
Röviden: Én nem hiszek a fekete-fehérben, szerintem a checked exception nem buta dolog, de találkoztam én is olyan kóddal, ahol kicsit átestek a ló túloldalára. De szerintem az jó dolog, ha egy API meg tudja mondani milyen hibákra kell a hívójának felkészüljön, és ezek lekezelése ki is van kényszerítve a fordító által. Hogy mást ne mondjak, így reviewn pl könnyen el lehet kapni egy rossz hibakezelést, míg ha unchecked, akkor a reviewer adott esetben nem is tudja, hogy milyen exception jöhet az adott helyen, csak ha jól ismeri a hívott APIt. Na ez tényleg messzire visz :)
A fordító jó, de mindent nem tud. Például az NPE és egyéb szintaktikailag helyes, mégis hibásan működő kódot nem tud kiszűrni.
Nem azért, nem kötöszködni akarok, de ha
A típusosság, és az ezt maradéktalanul ellenőrző fordítók nagyon jó alternatíva.
Ez egy jó nagy butaság, már
A típusosság és a fordítók ellen meg senki nem érvelt.
Nem haragszom, félreértettük egymást
Azt a végtelenül messzi távolságot bizony át kell tudni hidalni, az üzleti logikából kell tudni készíteni minél kevesebb 0-1-et.
Szóval szerintem (is) tényleg itt hagyjuk, mert túl messzire visz.
Exception vs hibakód
Exceptionnel definiálhatsz olyan pontokat a programodban (pl global exception handlerek), ahol bármilyen hibát elkaphatsz mélyebbről, mégis be tudod azonosítani pontosan, hogy a program melyik pontján történt a hiba, ami infót egy hibakód már nem tud szolgáltatni.
A javas hivatkozásokkal kapcsolatosan:
Az
Integer.parseInt()
egyébként ugye nem is checked exceptiont dob, jogosan. És szerintem az kivételes eset, hogy egy nem valid szám stringet adsz oda neki. Ez nem validációra való.Ami az
IOException
-t illeti, ahol van értelme tovább ragozni, ott tovább is van (plFileNotFoundException
)Azzal viszont nagyon egyetértek, hogy nem ész nélkül kell exceptiont dobálni (pl azért, mert exceptiont dobni drága muri). Általános érvényű szabályként elmondható, hogy ha egy metódus olyan választ akar szolgáltatni, ami kizárólag a hívója számára hordoz információt, az ne exception legyen. Tehát a
Arra soha nem lehet
De arra lehet garanciám, hogy ha a program nem is helyesen, de kiszámíthatóan viselkedik, és ezt a függvény felülete és a fordító garantálja, ha nincsenek kivételek. Ha vannak kivételek, akkor bármelyik könyvtári függvény hívásakor összeomolhat a programom, illetve bármikor átadhatja a vezérlést valahova a hívási fában feljebb, az én szándékom nélkül.
Ezt sosem értem, mire alapozzák az emberek. Az
if
szinte minden nyelvben egy egyszerűbb szerkezet, mint atry-catch
. Ha felkészülsz minden hibalehetőségre, akkor még ha ugyanolyan komplex szintakszis is mindkettő, pont ugyanannyiif
-et kell írnod, minttry
-t. El kell fogadni, hogy a hibakezelés bizony kódba kerül.A dolog nyitja valószínűleg az, hogy a kivételek rászoktatták a fejlesztőket arra, hogy írunk egy nagy
try
-t a program tetején, aztán hadd szóljon. Csak ez nem hibakezelés.Az ilyen handlerek már semmit nem tudnak kezdeni a hibával azon kívül, hogy naplózzák. Azonosítani pedig a hibakód helyét is lehetne, attól, hogy visszatérési értékként, a stack visszapörgetése nélkül adod át a hibaobjektumot, pont ugyanazt tárolhatod benne, mint egy kivételben.
Integer.parseInt()
egyébként ugye nem is checked exceptiont dob, jogosan. És szerintem az kivételes eset, hogy egy nem valid szám stringet adsz oda neki. Ez nem validációra való.Pedig itt épp hogy ellenőrzött kivételt kellene dobnia. Az, hogy a külső forrásból érkező adatban szám helyett egyéb karakter van, a legkevésbé sem különleges eset. Külön validáló függvény pedig nincs, és erőforráspazarló is volna kétszer megcsinálni ugyanazt (először validálni, aztán parsolni).
IOException
-t illeti, ahol van értelme tovább ragozni, ott tovább is vanA baj az, hogy az
IOException
-nek nincs közlésértéke. Be akarsz zárni egy socketet, kapsz egyIOException
-t. Mégis mi a bánatos tücsköt kellene vele csinálni?Hány példát tudsz erre összeszedni? Már azon kívül, hogy naplózol vagy hibaüzenetet jelenítesz meg a felhasználónak?
Ha vannak kivételek, akkor
Ez igaz az unchecked exceptionökre, de nem igaz a checked exceptionökre, mert az része a szignatúrának. Az unchecked exceptionök tipikusan runtime (jellemzően programozói) hibákra valók, mint pl az említett
NumberFormatException
.close()
miatt kikényszerítettflush()
nem sikerült.Az ilyen handlerek már semmit
Ennek éppen a fordítottja igaz: a legtöbb olyan hibát, amivel tudsz mást is kezdeni azon kívül, hogy naplózod, jóval magasabb szinten tudod csak lekezelni. A hibás user inputból származó problémákat (pl. nem létező id) azon a ponton tudod csak értelmesen lekezelni, ahol az inputot beolvastad (egy MVC webalkalmazásnál ez tipikusan a kontroller), nem azon a ponton, ahol megpróbálsz kezdeni valamit az adatbázisból kiolvasott tömbbel, csakhogy az üres. A súlyos hibáknál meg (pl. nem elérhető egy service) az egész aktuális műveletből ki kell hátrálni, ami szintén jellemzően sok absztrakciós szinttel feljebb ugrást jelent.
Másrészt meg nem árt, ha sok kitépni való haj áll rendelkezésre, hogyha minden egyes tömbhivatkozásnál státuszokat kell majd kiolvasgatnod, hogy hátha nem is volt olyan elem. Nem véletlen, hogy még az egyébként igen compile-time-ellenőrzés-barát Java is lényegében kihátrált a checked exceptionok mögül.
Több adat
Ha neked nem tetszik ez a szemlélet, nem kell használni, létezik annyi más nyelv és rendszer, ami elrejti előled ezt.
Például kell neked több
Ha neked nem tetszik ez a
wait
/yield
használatával vagy rejtett aszinkron működéssel)?Ha elindítok egy
Kivéve ha te szúrod be vagy frissíted őket. Abban az esetben nem szükséges megvárni.
Amúgy a lekérdezésnél is mehetsz tovább, mert jöhet az adat több forrásból is. Tipikus példa erre a MongoDB ahol kell egy plusz lekérdezés a join-hoz. Illetve rendelkezésedre állhat még ez előző lekérdezés megérkezte előtt is az az adat ami a második lekérdezéshez kell. (Nálam eléggé sok az ilyen)
Speciel en nem banom, ha
Ettől függetlenül én is
,csak példát írtam arra, hogy van olyan eset amikor nem feltétlen van rá szükség. Logolás, stb.
A probléma ott van, hogy csak
Plusz az általad vázolt megoldásban honnan tudja a program, hogy neki most el kell engednie a vezérlést (várakoznia kell)? Ezzel ugyanott vagyunk, mintha szálakkal bohóckodnánk:
Lehet, hogy a probléma figyelmen kívül hagyása nagyon kényelmes (mert tényleg sokkal egyszerűbb lenne, ha szinkronnak álcázva működne minden!), de valójában sok egyéb olyan problémát generál, ami miatt nem érdemes ebbe az irányba mozdulni. Én még nem találkoztam ilyen jellegű ES kezdeményezéssel (pedig figyelemmel kísérem az ES6-7 feature-öket).
Nem foglalkoztam túl sokat
Lehet, hogy Istvánra kell
Okés, akkor majd beszélünk
Az a gond, hogy a JavaScript
Itt gondolok csak arra, hogy miket kell művelni egy osztály elkészítéséhez, annak örökléséhez, annak buktatói stb. Akkor még a callback-ek egymásba ágyazásáról nem beszéltünk. Valójában nagyon nehéz szétszedni a kódot rendeltetése szerint.
Vannak már törekvések ezek kijavítására ES6, de én személy szerint úgy érzem a JavaScript még gyerekcipőben jár, de jó úton jár ahhoz, hogy PHP dicsőségeire törjön rövid időn belül.
Hozzá teszem ez saját szubjektív véleményem.
Hát nem tudom, én egyelőre js
Js-nél a core-ban vannak hátrányos dolgok, de ezeket nagyon kevés kóddal át lehet hidalni. Requirejs/commonjs és osztály örököltetős kód kell. Aszinkronra is van jópár áthidalós megoldás, majd lehet, hogy én is csinálok sajátot, ha jobban belefolyok. Elképzelésem már van a témáról, de most más foglalkoztat. Időt csináltam, töröltem a játékot, amivel tolni szoktam. :D
engem ez a problémamegoldás
A smartynak az a szerepe,
Nekem ez a bizalom teljes hiányát jelenti a sitebuilder felé, aki a sablonokat készíti, ha meg nem bízol meg más munkájában, akkor miért dolgozol vele csapatban?
Nincs mindig lehetőséged
Hát ezeknek a kódját utólag
A js-el kapcsolatban nekem kifejezetten nem tetszik az, hogy ugyanígy új nyelveket próbálnak csinálni, amik js-re fordulnak, ahelyett, hogy az aktuális problémákat js-ben oldanák meg. Elég sok tisztán js alapú megoldás van erre az aszinkron kód formázási problémára, de ha ezt valaki nem tartja elégnek, akkor nyugodtan javasolhat a nyelv fejlesztőinek új nyelvi elemet. Szerintem nem véletlen, hogy ezek az új nyelvek, mint pl coffeescript, typescript, stb... annyira nem terjedtek el. A script nyelveknek az az előnye, hogy nem kell őket befordítani, ezek a nyelvek pedig pont ezt az előnyt veszik el, cserébe viszont nem sokkal nyújtanak többet, debuggolni viszont sokkal nehezebb őket.
Egy közepesnél nagyobb
Ott a pont :-P Úgy látszik én
Hát ezeknek a kódját utólag
Az adatokat a megjelenésüktől külön kell választani, erre a smarty kezdetnek jó, de úgy általában a php mint sablonnyelv rossz választás, mert csak szerveroldalon fut.
így akár verziókezelésre sem
Már hogy ne volna szükség???
Sajnos nem, viszont amikor meg kellene 1-2 dolog, akkor inkább hátráltat, mintsem segít. Teljesen felesleges plusz réteg a smarty.
Jó, hát verziókezelésre
Én is úgy gondolom, hogy felesleges plusz réteg. Sosem tetszett, ha valaki új nyelvet akart építeni egy létező fölé, teljesen feleslegesnek érzem. Kicsit olyan ez, mint a bábeli zűrzavar... (Régebben én is elkövettem ugyanezt a hibát.)
A smartynak az is előnye,
A php igazából alkalmatlan a hatékony sablonozásra.
Én nem igazán vagyok sablon
A php igazából alkalmatlan a
Bizony. A PHP lehet, hogy sablonnyelvnek indult húsz éve (abban az időben, amikor a C még egy jó alkalmazásfejlesztési nyelvnek számított), de a mai sablonnyelvek kritériumaitól messze elmarad. Nincsenek benne blokk függvények, nincs olvasható filter szintaxis, nincs autoescape, nem lehet sablonokat leszármaztatni egymásból, a legtipikusabb sablonos feladatokat (mint pl. iteráció az első és az utolsó sor speciális kezelésével, üres lista esetén default értékkel) nem támogatja normálisan; messze elmarad használhatóságban a Smarty, Twig, Moustache és társaitól.
Hát ennyire nem folytam bele.
Nyilván meg lehet oldani
<?php echo
dolgot ne említsük).És vannak dolgok, amikre a
Hát vannak nyelvek, amik még barátságtalanabbak, nem tartom vészesnek azt az echo-t. Én mondjuk inkább dom fa szerűen szoktam html-t építeni, és nem sablonozok, de ez ízlés kérdése. Valahogy nem szeretem, ha a logika egy része adatfájlokban van csak azért, hogy sablonok legyenek.
Nyilván nem szeretném én megoldani, ha nem az én feladatom. Én úgy gondolom, hogyha egy sitebuilder képes megtanulni a smarty-t, akkor a php sem lehet olyan nagy falat neki, de lehet, hogy tévedek.
További hátránya ezeknek a nyelveknek, hogy egyik napról a másikra eltűnhet a support, bár azért ez már kevésbé valószínű, mint js esetében. Szintén hátránya, hogy ami van support, az sem teljes körű, pl egy automatikus kiegészítést kicsikarni belőlük gondolom nem egyszerű. Talán bizonyos IDE-k esetében már ezt is megoldották, nem nyomoztam utána. Én mindenesetre maradok a php-s view rétegnél, és azon belül a php kóddal épített html-nél, mert nekem az "tisztább szárazabb érzés".