Copy & Paste vs. Špagety

Kit

Re:Copy & Paste vs. Špagety
« Odpověď #30 kdy: 16. 07. 2016, 22:31:41 »
Jaký používáš šablonovací systém? Ty části mohou být jednotlivé položky formuláře. Třeba

Kód: [Vybrat]
<div class="form-group">
    <label for="{{id}}">{{label}}</label>
    <input type="{{type}}" class="form-control" id="{{id}}" name="{{name}}">
  </div>

Každopádně všechny divy jsou vždy otevřené a uzavřené ve stejné části.  Určitě je mnoho způsobů jak tohle řešit. Makra se mi osvědčila asi nejvíc. Jsem v téhle oblasti samouk, rád dovím jiná řešení.

Aha, tak na tohle bych měl jen jednu šablonu, kterou bych řídil tokem dat. Používám XSLT. V té šabloně by bylo 6 komponent část1..část6 a volaly by se podle pořadí vstupních dat, např.
Kód: [Vybrat]
<post>
<username id="username" label="část1" name="jmeno"/>
<password label="část2" name="heslo"/>
<password label="část4" name="heslo2"/>
<captcha label="část5"/>
</post>
Napsal jsem to pro přehlednost ve formátu XML. Ve skutečnosti té šabloně předávám datový strom.
Ve výstupu se pak vygeneruje i potřebná bižuterie pro výstupní HTML.

Těch 6 komponent šablony tady nebudu rozepisovat, ale je to v jednom souboru na cca 25 řádek. Při zpracování se vezme se první node, tedy <username> a na něj se použije komponenta s atributem select="username", která vygeneruje výstup viz výše. Jen místo {{id}} se napíše @id apod. Vezme se další node, a aplikuje se šablona select="password" a tak dále. To všechno však samostatně dělá datový procesor, který zvládá i rekurzi ve vstupních datech. To vše je zabaleno v elementu <form method="POST"> a pokud chceš, tak i v <div class="form-group">


Petr M

  • ***
  • 105
    • Zobrazit profil
    • E-mail
Re:Copy & Paste vs. Špagety
« Odpověď #31 kdy: 18. 07. 2016, 21:37:09 »
Jenom dodám, že v klasickým kódu (C apod.) se to řeší pomocí dependency injection. Ta je základem efektivního řešení třeba pro takový věci, jako jednoduchý operační systém (předání vykonávané funkce do context switche), hierarchický stavový automat (řeší to dynamicky hierarchie), u univerzálníchtřídících algoritmů se tak dá měnit za běhu porovnávací funkce, v objektovce je na tom principu postavená VMT a dá se s tím užít ještě další obrovský kopec srandy. A pěkně učesat kód, samožřejmě.

Řekněme, že máme dvě čísla, který mají být ořezány na rozsah -9999 až +9999, má s nimi být udělána nějaká neznámá operace a výsledek ořezán na na stejný rozsah. Takže to ořezání si vytkneme do funkce
Kód: [Vybrat]
int orez(int a) {
if(a < -9999) return -9999;
if(a > 9999) return 9999
else return a
}
V příkladu je to jenom jako společná část kódu, která se nemění, s DI zatím nemá co do činění, ale opakující se část ve funkci by měla být samozřejmost.

Vlastní operace bude asi nejaká funkce, která si vezme dva inty a vrátí int. Takže ukazatel na ni bude jednoduše
Kód: [Vybrat]
int(*funkce)(int a, int b);

a vlastní implementace funkcí pro jednotlivý operace budou třeba
Kód: [Vybrat]
int soucet(int a, int b) {return a+b;}
int rozdil(int a, int b) {return a-b;}
Těch může být, kolik je potřeba. Rozhoduje jenom počet a typ parametrů a typ návratové hodnoty.

Pak se to všechno bude volat z programu nějak slepený a zapouzdřený, dáme to tedy do funkce. Ta si vezme tři parametry, operaci a dva operandy. Vrací zase int.
Kód: [Vybrat]
int mojeOperace(funkce typ, int a, int b) {
  int a1 = orez(a);
  int b1 = orez(b);
  int x = funkce(a1, b1);
  return orez(x);
}

No a nakonec jak to celý použít. Prostě, jako volání funkce.
Kód: [Vybrat]
int main() {
  int a = 100; int b = 200;
  printf("Soucet je %d", mojeOperace(&soucet, a, b);
  printf("Rozdil je %d", mojeOperace(&rozdil, a, b); 
  return 0;
}

Zkus vymyslet, jak s pomocí mojeOperace() uděláš x=a^2/b bez toho, že bys v ní samotné změnil jediný řádek kódu  ;)

gl

Re:Copy & Paste vs. Špagety
« Odpověď #32 kdy: 19. 07. 2016, 22:47:09 »
Jaký používáš šablonovací systém? Ty části mohou být jednotlivé položky formuláře. Třeba

Kód: [Vybrat]
<div class="form-group">
    <label for="{{id}}">{{label}}</label>
    <input type="{{type}}" class="form-control" id="{{id}}" name="{{name}}">
  </div>

Každopádně všechny divy jsou vždy otevřené a uzavřené ve stejné části.  Určitě je mnoho způsobů jak tohle řešit. Makra se mi osvědčila asi nejvíc. Jsem v téhle oblasti samouk, rád dovím jiná řešení.

Aha, tak na tohle bych měl jen jednu šablonu, kterou bych řídil tokem dat. Používám XSLT. V té šabloně by bylo 6 komponent část1..část6 a volaly by se podle pořadí vstupních dat, např.
Kód: [Vybrat]
<post>
<username id="username" label="část1" name="jmeno"/>
<password label="část2" name="heslo"/>
<password label="část4" name="heslo2"/>
<captcha label="část5"/>
</post>
Napsal jsem to pro přehlednost ve formátu XML. Ve skutečnosti té šabloně předávám datový strom.
Ve výstupu se pak vygeneruje i potřebná bižuterie pro výstupní HTML.

Těch 6 komponent šablony tady nebudu rozepisovat, ale je to v jednom souboru na cca 25 řádek. Při zpracování se vezme se první node, tedy <username> a na něj se použije komponenta s atributem select="username", která vygeneruje výstup viz výše. Jen místo {{id}} se napíše @id apod. Vezme se další node, a aplikuje se šablona select="password" a tak dále. To všechno však samostatně dělá datový procesor, který zvládá i rekurzi ve vstupních datech. To vše je zabaleno v elementu <form method="POST"> a pokud chceš, tak i v <div class="form-group">

Dík za odpověď. Docela se mi to líbí. Možnou nevýhodu vidím v tom, že není na první pohled tak dobře odlišitelné co je html a co šablonovací jazyk. Ale jde asi o zvyk.

Kit

Re:Copy & Paste vs. Špagety
« Odpověď #33 kdy: 19. 07. 2016, 23:42:01 »
Dík za odpověď. Docela se mi to líbí. Možnou nevýhodu vidím v tom, že není na první pohled tak dobře odlišitelné co je html a co šablonovací jazyk. Ale jde asi o zvyk.

Je to odlišeno prefixem u XML značek. Každá komponenta šablony začíná například <xsl:template ... Právě tohle je vytýkáno XSLT, vypadá to totiž hrozně ukecaně. S kvalitním editorem je to však pohodička. HTML značky jsou bez prefixu. Jsou povinně párové, jinak se šablona nezkompiluje.

Teoreticky je možné v tom udělat celou aplikaci, ale odporovalo by to zvyklostem rozdělení do vrstev. Zkusil jsem v tom například generování SQL dotazů (struktura DB byla v XML) a fungovalo to docela hezky. Na založení DB při instalaci aplikace je to perfektní. Je to vlastně virtuální procesor, do kterého z jedné strany sypeš DOM a z druhé strany lezou serializovaná data.