abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 3
    dnes 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 0
    dnes 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    dnes 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    dnes 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    dnes 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    včera 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    včera 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (72%)
     (9%)
     (2%)
     (17%)
    Celkem 754 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: PHP - jaký návrhový vzor použít

    20.11.2014 04:56 fp
    PHP - jaký návrhový vzor použít
    Přečteno: 802×

    Ahoj, píšu v PHP aplikaci, která bude přes SOAP komunikovat s klientem, který bude v příkazovém řádku. Hodiny jsem strávil přemýšlením o používání různých návrhových vzorů pro všechny možné účely - DI, data mapper, active record, factory, ... Chtěl bych co nejjednodušeji vyřešit typově následující situaci:

    Databáze v postgresql

    třídy:

    Plan, Kroky
    - v tabulkách v databázi je uložený nějaký plán, který obsahuje nějaké kroky. V databázi realizované několika tabulkami. V PHP chci přímo pracovat s plánem jako celkem => vytvořit plán, uložit/načíst z/do databáze.

    Přikláním se k tomu, řešit to takto:

    Třída Plany:
    
    - vytváří nové
    - načítá z db
    - ukládá do db
    
    Poté práce s ní cca takto:
    
    Application::getInstance()->getPlany()->...
    
    To je v podstatě kombinace Data Mapper s Factory. Jenže to by teoreticky nemělo být a data mapper by zase měl pracovat jen s jednou tabulkou.

    Nejsem zastáncem používání "zrovna frčících" návrhových vzorů, které po přečtení různých článků stejně každý používá tím svým jediným "správným způsobem". Rád bych to udělal co nejjednodušší, aby se mi to pak dobře upravovalo. Nějaká ohromná vrstevnatá architektura by mi podle mě spíš přidělala práci. Jenže zase s tímto nemám nějaké zkušenosti. Rád si nechám poradit. Jak byste to řešili vy?

    Odpovědi

    Konqui avatar 20.11.2014 10:14 Konqui | skóre: 18 | blog: Konqui | Rožnov pod Radhoštěm
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Návrhové vzory nejsou primárně určeny k obecnému použití v přesně daných situacích. Jen nastiňují řešení dané problematiky daným způsobem. V praxi se návrhové vzory přizpůsobují/kombinují/nepoužívají.

    Dobře napsaná aplikace nestaví na definovaných návrhových vzorech, ale bere si z nich příklad a inspiraci.

    Neexistuje nějaké stanovené pravidlo "na tohle použij tenhle vzor", spíše čím více zkušenosti programátor/architekt zná, tím lépe aplikaci navrhne. A to ani moc nesouvisí s návrhovými vzory.
    Open/save dialogy z GTK+ jsou nejkřiklavější ukázkou toho nejdebilnějšího software, co vůbec může existovat.
    20.11.2014 14:25 Ivan Nový
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    nejdříve si navrhněte rozhraní I_Plan s operacemi addStep, removeStep, getSteps, rozhraní I_Model s operacemi find, load, save a rozhraní I_Step s operací find, eval a implementujte je na objektech Plan, Step. Pomocí rozhraní I_Step v konstruktoru třídy Plan předejte konkretní implementaci kroku. Rozhraní I_Model použijete pro práci s tabulkou jak pro třídu Plan, tak pro třídu Step. Tím získáte implementaci nezávislou na uložení dat v konkrétní databázi. Implementaci rozhraní I_Model můžete vyčlenit do tříd PlanModel, StepModel a ty předávat v konstruktoru do třídy Plan, resp. Model. V budoucnosti různými implementacemi rozhraní I_Model, můžete realizovat uložení dat v různých db, nebo typech souborů, klidně v XML pro import, či export atp.
    20.11.2014 14:52 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Tady ještě někdo používá maďarskou notaci? Prefix "I_" se před název interface už nedává. Smysl názvů "I_Plan", "I_Model" apod. mi uniká - nic neříkají o tom, co implementace má umět.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    20.11.2014 15:18 Ivan Nový
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Tak jistě, pojmenování tříd se dá vylepšit. Třeba delší DataModel, a místo Plan, třeba PlanStep ...
    20.11.2014 15:21 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Nepsal jsem o nesprávném pojmenování implementace, ale rozhraní - tedy interface.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    20.11.2014 16:32 Ivan Nový
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Aha, to jsem přehlédl, o názvech rozhraní samozřejmě platí něco obdobného. Jen tak v rychlosti jsem zvolil hodně univerzální názvy, aby příklad zůstal abstraktní.
    Josef Kufner avatar 20.11.2014 19:16 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Application::getInstance()->getPlany()->
    Tohle je špatně hned z několika důvodů.

    V první řadě je špatný nápad používat globální proměnné a singletony (globální proměnná schovaná v objektu). Značí to špatnou/žádnou implementaci dependency injection. Ten výraz by měl začínat na $this.

    getPlany() je takové ošklivé. Lepší je mít objekt ve stylu úložiště (manager), které bude mít metodu na nalezení plánu a na získání seznamu plánů podle daných kritérií. Většina implementací ORM a podobných módních zvrhlostí jsou v tomhle dost nešikovné.

    Dále pak to moc nepřeháněj s operátorem '->', neboť takový řetěz mnoha a mnoha volání je často obtížné dešifrovat.
    try {
        $plan = $this->planManager->findPlan($plan_id);
        foreach ($plan->steps as $step) {
            // ...
        }
    }
    catch (PlanNotFoundException $ex) {
        // ...
    }
    $filters = $_GET; // něco v tom smyslu
    $list = $this->planManager->listPlans($filters);
    if (empty($list)) {
        echo "Nejsou.\n";
    } else foreach ($list as $plan) {
        echo "<li>", $plan->title, "</li>\n"; // jen pro ilustraci
    }
    Hello world ! Segmentation fault (core dumped)
    20.11.2014 19:54 fp
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Implementaci Dependency Injection dělat nechci (i když mi to pořád ještě vrtá hlavou). S DI se teď roztrh pytel a její různé implementace se začaly objevovat vč. takových, že "aplikace se pokusí uhodnout, co tam podstrčit" či "konfigurace v konfiguračním yaml souboru vč. inicializace proměnných". To mi přijde hodně ošklivé. Přehlednějsí mi to přijde bez ní. Koukal jem do různých zdrojáků různých opensource PHP projektů a tam se dost často objevovalo něco ve stylu AplikacniKontejner::getDatabase(), ...

    Pokud bych měl takto "schovaný" PlanManager, kde by vznikaly nové plány? Volat přímo v aplikaci "$plan = new Plan(...)" a ten pak předávat PlanManageru k uložení mi připadá takové divné.
    20.11.2014 20:15 Ivan Nový
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    No výhoda toho uspořádání je, že třída, která obklopuje takový PlanManager, je na něm nezávislá, používá jen jeho rozhraní a můžete do ní strčit jakoukoliv variantu PlanManageru. jeden třeba co kroky ukládá v csv, jiný v XML a ještě jiný co je ukládá v MySQL. A k PlanManageru si můžete přidat statickou funkci getInstance a místo new PlanManager můžete volat PlanManager::getInstance() třeba takto
         // Vytvoření a uložení plánu do XML dokumentu
         Plan::getInstance(XMLPlanManager::getInstance(), XMLStepManager::getInstance())
            ->name('Plan 9)
            ->addStep('Krok 1')
            ->addStep('Krok 2')
            ->addStep('Krok 3')
            ->save();
         // a nebo
         Plan::getInstance(PDOPlanManager::getInstance(), PDOStepManager::getInstance())
            ->name('Plan 9)
            ->addStep('Krok 1')
            ->addStep('Krok 2')
            ->addStep('Krok 3')
            ->save();
    
    20.11.2014 20:24 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Nic z toho nefunguje...
    PHP Fatal error:  Class 'Plan' not found
    PHP Fatal error:  Class 'XMLPlanManager' not found
    PHP Fatal error:  Class 'XMLStepManager' not found
    PHP Fatal error:  Class 'PDOPlanManager' not found
    PHP Fatal error:  Class 'PDOStepManager' not found
    
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    21.11.2014 12:14 Ivan Nový
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Tak zase na druhé straně je někdy lepší, tato fatální chyba, která přesně lokalizuje co kde chybí (analogie statického typování), zvláště když máte Plan::getInstance(), použito jen na jednom místě programu, než nějaký DI kontejner, který vám podstrčí někam nějakou kravinu a vy nevíte kde, projeví se to pak třeba jen těžce lokalizovatelnou náhodnou chybou. DI paradoxně z dynamického jazyka PHP dělá statický a ze statického, jako Java, dělá dynamický :-)
    21.11.2014 12:48 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Do testů dávám úmyslně i chybné SQL dotazy, dotazy na neexistující sloupce, neexistující metody apod. a aplikace si s tím musí poradit. Je to užitečnější, než všechna statická typování dohromady.

    Aplikace s DI kontejnerem se obvykle testuje dost blbě, proto DI kontejnery raději nepoužívám vůbec.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    21.11.2014 17:28 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Do testů dávám úmyslně i chybné SQL dotazy, dotazy na neexistující sloupce, neexistující metody apod. a aplikace si s tím musí poradit. Je to užitečnější, než všechna statická typování dohromady.
    Z mého pohledu zbytečné, rozumný staticky typovaný jazyk by vás toho ušetřil.
    21.11.2014 18:05 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    To by mě zajímalo, jak by se třeba takový kompilátor Javy vypořádal s SQL dotazem
    SELLECT * FROM tabulka
    Vždyť to vůbec není v jeho kompetenci. Testy jsou nezbytné.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    21.11.2014 18:56 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    To by mě zajímalo, jak by se třeba takový kompilátor Javy vypořádal s SQL dotazem
    Právě proto jsem psal slovo "rozumný".

    Staticky typované jazyky s makry nebo něčím podobným – např. poskytovateli typů (type providers) to dokáží. Pár konkrétních příkladů:
    • V OCamlu existuje knihovna PG'OCaml. Při kompilaci se preprocesor připojí k databázi, ověří SQL příkazy a jejich výsledky vhodně natypuje.
    • F# 3.0 má SQL poskytovatele typů, který se umí připojit k databázi a vygenerovat třídu, jenž reprezentuje strukturu databáze. Dotazy na databázi se pak provádí pomocí dané třídy.
    • Podpora pro některé SQL konstrukce je přímo zabudována (příklad) v jazyku Ur/Web.
    21.11.2014 19:30 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Takový preprocesing si raději udělám jako plugin do editoru a nebudu zbytečně kombinovat jazyky a knihovny, které pro výsledek nepotřebuji.

    I po kompilaci se přece může stát, že mi někdo změní strukturu databáze. SQL dotaz, který dosud fungoval, najednou selže. Proto se píší testy, které musí selhat, aby se zjistilo, jak se s tím aplikace vypořádá.

    Jak může ta třída v F# tušit, jaké budu dělat dotazy? Jak se takový F# modul přidává do javovské aplikace?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    21.11.2014 20:04 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    I po kompilaci se přece může stát, že mi někdo změní strukturu databáze.
    Ano, pak bude vyhozena výjimka a aplikace s ní naloží jako s kteroukoli neodchycenou výjimkou – tj. stále nevidím důvod, proč testovat chybné SQL dotazy. Přijde mi to podobné, jako byste testoval, co se stane, když některé metody zmizí nebo se jim změní signatura.
    Jak může ta třída v F# tušit, jaké budu dělat dotazy?
    Je podporována pouze podmnožina SQL dotazů. Kromě toho ta třída dovoluje volat uložené procedury.
    Jak se takový F# modul přidává do javovské aplikace?
    Těžko.
    21.11.2014 20:56 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Ano, pak bude vyhozena výjimka a aplikace s ní naloží jako s kteroukoli neodchycenou výjimkou
    Pokud aplikace vyhazuje výjimky, musím v ní i testovat, jestli je vyhazuje správně a jak se při zachytávání výjimky chová. Aplikace nemusí dělat nic z toho, co není testováno.
    Přijde mi to podobné, jako byste testoval, co se stane, když některé metody zmizí nebo se jim změní signatura.
    To samozřejmě testuji také.
    Jak může ta třída v F# tušit, jaké budu dělat dotazy?
    Je podporována pouze podmnožina SQL dotazů.
    Podmnožina mě nezajímá. Chci kompletní sadu SQL dotazů.
    Jak se takový F# modul přidává do javovské aplikace?
    Těžko.
    V tom případě F# vypadává ze hry.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    21.11.2014 21:28 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Přijde mi to podobné, jako byste testoval, co se stane, když některé metody zmizí nebo se jim změní signatura.
    To samozřejmě testuji také.
    Opět byste si ušetřil práci, kdybyste použil rozumný jazyk.
    V tom případě F# vypadává ze hry.
    Podobné věci má i Scala – viz sqlτyped.
    21.11.2014 21:38 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Opět byste si ušetřil práci, kdybyste použil rozumný jazyk.
    Neexistuje žádný "rozumný jazyk", který by sám otestoval logické chyby. Jednotkové testy mohu z editoru spouštět třeba 5× za minutu, klidně i po každém napsaném řádku.

    Vyvíjet něco pro Javu, Scalu nebo pro F# jen proto, abych to nakonec převedl do požadovaného PHP? To je příliš velká oklika. To už je daleko jednodušší naučit můj editor generovat SQL dotazy reflexí z testovací databáze a pak si je upravit dle aktuální potřeby.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    21.11.2014 21:53 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Neexistuje žádný "rozumný jazyk", který by sám otestoval logické chyby. Jednotkové testy mohu z editoru spouštět třeba 5× za minutu, klidně i po každém napsaném řádku.
    S tím souhlasím. Já ale mluvím o něčem jiném. A to, že existují určité vlastnosti, které může snadno ověřovat kompilátor, tudíž je zbytečné je testovat, stačí jen použít vhodný programovací jazyk.
    21.11.2014 21:58 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Je zbytečné hledat vhodný jazyk, stačí testovat. Kompilátor stejně neověří vše, co ověřit potřebuji. Testy jsou prostě jednodušší na použití, než nějaké metaprogramování přes dekorátory.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    22.11.2014 15:15 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Je zbytečné hledat vhodný jazyk, stačí testovat. Kompilátor stejně neověří vše, co ověřit potřebuji.
    Testování bohužel nestačí – příkladem jsou nedeterministické programy nebo programy, jenž nejste schopen otestovat na všech možných vstupech. Na druhé straně ověřovat všechny vlastnosti pomocí typového systému je velmi nákladné. Proto se používá kombinace obojího. Ostatně výhod statického typování si všiml i autor Pythonu.
    Testy jsou prostě jednodušší na použití, než nějaké metaprogramování přes dekorátory.
    To není přes dekorátory. Je to kód, který se spouští při kompilaci a vygeneruje jiný kód. V principu je to velmi jednoduché.
    22.11.2014 15:25 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    To není přes dekorátory. Je to kód, který se spouští při kompilaci a vygeneruje jiný kód. V principu je to velmi jednoduché.
    Takže v principu ten kompilátor F# dělá totéž, co lepší editor pro libovolný jazyk.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    22.11.2014 15:51 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Takže v principu ten kompilátor F# dělá totéž, co lepší editor pro libovolný jazyk.
    V tomto případě ano. Výhodou je nezávislost na editoru.

    Kromě toho si to umí poradit i se situacemi, kdy je informační zdroj příliš rozsáhlý a kdy by generovaný kód byl příliš velký (dokonce to může fungovat i v případech, kdy počet metod nebo počet typů není omezený).
    22.11.2014 16:05 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Přiznávám, že jsem na svém editoru závislý. Na druhou stranu mi funguje všude, takže z toho obavu nemám. Nezávislost na editoru nevyměním za závislost na F# - raději budu závislý na editoru než na nějakém kompilátoru, který mi všude nepojede.

    Co je to "příliš rozsáhlý" informační zdroj? Že se ani jeho struktura nevejde do RAM?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    22.11.2014 19:29 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Že se ani jeho struktura nevejde do RAM?
    Ano, ta struktura může být klidně nekonečná.
    22.11.2014 20:00 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Počet tabulek v databázích nebývá příliš omezen, ale víc než několik tisíc tabulek snad nikdo nedělá. Podobně jako nikdo nedělá stovky sloupců v tabulce (max. desítky). Taková struktura se do RAM v pohodě vejde.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    22.11.2014 19:43 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Ještě dodám citaci z článku Strongly-Typed Language Support for Internet-Scale Information Sources (strana 48):
    The second option, code generation, is also problematic: it adds yet another step to the build process, which means that automated builds must have the tool or its artifacts, it interacts badly with source control, particularly when the generated code is large and should be cached and shared among a development team, and it leads to either code bloat or the need for (yet another!) tool for pruning the compiled artifacts*.

    * Note that this last point is not a hypothetical: the authors have been informed of cases where the generated code for an enterprise system is so large that it cannot fit within the limits of a .NET process.
    22.11.2014 20:04 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    To je ale jen důsledek chybného návrhu databáze. Nemyslím si, že by to striktně typovaný jazyk mohl nějak zachránit.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    22.11.2014 23:27 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Záleží, jak ta data prezentujete. Například typový poskytovatel pro Freebase nabízí i vlastnosti pro jednotlivé záznamy v databázi. S doplňováním kódu lze tedy psát výrazy data.Society.Government.Politicians.IndividualsAZ.V.``Václav Havel``.Education.
    23.11.2014 00:05 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    To vypadá strašně, ale v NoSQL se to jistě použít dá.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 21.11.2014 19:44 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    To je sice hezké, ale pořád to nemá šanci se vypořádat s generovanými SQL dotazy, kterých je dle mé zkušenosti ve webových aplikacích značná část.

    Je užitečné kontrolovat očekávanou strukturu databáze proti skutečnosti, ale pokud se to děje při kompilaci, je to na nic, neboť tou dobou to bude mít přístup maximálně na testovací server a struktura produkční databáze se bude měnit až při deploy po otestování.

    Tedy je potřeba mít možnost dle zakompilovaného modelu v aplikaci ověřit aktuálnost databáze, ale nemá smysl z databáze generovat model. Navíc pokud se mění struktura databáze, je obvykle potřeba aktualizovat i data (např. vygenerovat data do nového sloupce, nebo je konvertovat do nového tvaru) a na tom si jakákoliv automatika vyláme zuby.
    Hello world ! Segmentation fault (core dumped)
    21.11.2014 20:09 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    To je sice hezké, ale pořád to nemá šanci se vypořádat s generovanými SQL dotazy, kterých je dle mé zkušenosti ve webových aplikacích značná část.
    Co myslíte generovanými SQL dotazy?
    Josef Kufner avatar 21.11.2014 20:25 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Že si ten select před provedením poslepuješ z malých dílků dle aktuální potřeby.
    Hello world ! Segmentation fault (core dumped)
    21.11.2014 21:11 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Například v F# dostanete pro každou tabulku IQueryable<T>, takže dotazy lze do určité míry skládat z dílků.
    21.11.2014 21:17 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    A k čemu je to dobré, když nepotřebuji interface pro tabulku, ale pro doménu?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    22.11.2014 14:41 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Je to dobré k pokládání dotazů do databáze.
    22.11.2014 14:53 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Na to mi přece stačí reflexe v editoru.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    22.11.2014 15:17 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Obávám se, že reflexe nestačí, když je SQL dotaz, slovy pana Kufnera, generovaný.
    22.11.2014 15:35 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Obávám se, že výměna PHP za F# neprojde. F# mi dle popisu nenabízí nic, co by PHP neumělo a navíc na většině hostingů stejně není podporován.

    Byla to jen akademická debata o výhodách statického typování, která mě nijak nepřesvědčila.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    21.11.2014 20:02 Ivan Nový
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    SQL příkazy jsou z hlediska Javy pouhá data a ty mají být uloženy v db a před uložením verifikovány. Něco jako db.execute("SELECT a FROM x"); by se v programu nemělo vůbec vyskytovat. Ale pouze ve formě x.getA() kde teprve to getA příkaz SELECT načte z databáze (třeba ve formě XML souborů). Když princip DI a podobné domyslíte do důsledků.
    Josef Kufner avatar 21.11.2014 18:44 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Vůbec ne. Testy by měly zkontrolovat i to, že program umí slušně selhat, a že hozená výjimka od rozbitého selectu bude řádně zalogována.
    Hello world ! Segmentation fault (core dumped)
    20.11.2014 20:16 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Nepleť si DI s DI kontejnerem.

    Dependency Injection je velmi užitečným vzorem. Jeho implementace je triviální a není k tomu potřebná žádná knihovna.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 20.11.2014 20:36 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Tak, tak. "Chytrost" některých kontejnerů je značně protivná a mnohdy víc překáží než pomáhá. Na druhou stranu jednoduchý DI kontejner je jen taková naleštěná factory.
    Hello world ! Segmentation fault (core dumped)
    20.11.2014 20:53 fp
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Jo, už jsem to pochopil, našel jsem pár příkladů a vlastě DI používám jen tím, že nějaká objekt podstrkuji do konstruktoru druhémum, třeba DBConnection. Nicméně asi začnu používat jeden systémový kontejner - ten to sice jen obalí, ale vypadá to líp :-)
    Josef Kufner avatar 20.11.2014 20:39 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Koukal jem do různých zdrojáků různých opensource PHP projektů a tam se dost často objevovalo něco ve stylu AplikacniKontejner::getDatabase(), ...
    Jo, když se začalo více mluvit o návrhových vzorech, singleton byl jedním z těch základních. Chvliku trvalo, než lidem došlo, že to vlastně až tak dobrý nápad není. Dnes už je považován za anti-pattern.
    Hello world ! Segmentation fault (core dumped)
    Josef Kufner avatar 20.11.2014 20:43 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Pokud bych měl takto "schovaný" PlanManager, kde by vznikaly nové plány?
    Ten PlanManager by měl mít factory metodu na vytváření nových plánů. V jednoduchém případě to bude jen vracet new Plan($this). Často je žádoucí (ale ne vždy), aby takový objekt znal svého tvůrce a mohl ho používat (proto to $this). Sám uvidíš, co novému plánu bude potřeba předat.
    Hello world ! Segmentation fault (core dumped)
    20.11.2014 20:03 Ivan Nový
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Možná ještě místo $this->planManager->findPlan() rovnou $this->findPlan(), která by eventuelně využívala $this->planManager
    Josef Kufner avatar 20.11.2014 20:35 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Ne.
    Hello world ! Segmentation fault (core dumped)
    20.11.2014 21:02 fp
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Takže jestli to dobře chápu, implementace by byla nějaká taková:
    
    $configuration = new Config();
    $container = new AppContainer($configuration);
    
    $container->getServiceSoapServer()->run();
    
    AppContainer {
    ...
    
    public function getServiceSoapServer() {
      // ... testovani zda instance soap serveru existuje ... pokud ne pak:
      return new SoapServer($this->getServicePlanManager(), $this->getServiceXY(), ...)
    }
    
    ...
    
    uvnitř SoapServer:
    
    $this->planManager->create()
    ...
    $this->planManager->findById()
    ...
    }
    
    To už vypadá lépe. Nebo mi něco uniká :) a dělám někde brutální chybu v nepochopení patternu?
    Josef Kufner avatar 20.11.2014 21:31 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Jo, něco takového. Ale moc to s tím kontejnerem nepřeháněj – hodně věcí ho nepotřebuje a vystačí si s jednou věcí z něj.
    Hello world ! Segmentation fault (core dumped)
    20.11.2014 21:37 fp
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Tak teď už to zase nechápu. Když to založím na systémovém kontejneru, který mi dodává závislosti, tak nemá smysl ho nějak obcházet.
    20.11.2014 21:43 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Když máš v ruce kladivo, tak i když všechno vypadá jako hřebík, realita je jiná.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 20.11.2014 21:50 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Ten kontejner není nic jiného než kupa globálních proměnných zabalená do vlastního jmenného prostoru. Je to trochu lepší, ale pořád to je hnus.

    Dependency injection se snaží o eliminaci všech takových globálních udělátek. Globální kontejner by tedy měl být používán (pokud vůbec) jen na úrovni front controlleru a v omezené míře na úrovni controlleru. Neměl by (většinou) prosakovat do modelu, ani do view.
    Hello world ! Segmentation fault (core dumped)
    20.11.2014 23:47 fp
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Však o to přeci jde, pracovat s modely. getServicePlanManager vrací právě model a getServiceSoapServer vrací mix(controller,view - nebudu u totoho rozlišovat). Tak je to myšleno, že by se to chovat nemělo? Nebo je myšleno to, že by pak už neměla být další vrstva (další DI kontejner) uvnitř PlanManageru?
    Josef Kufner avatar 21.11.2014 00:22 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Pointa je v tom, že by žádný DI kontejner v aplikaci být neměl a tudíž ani žádné metody jako getServiceCokoliv().

    Nejlepší současné řešení je držet DI kontejner jen co nejmenší a používat ho jen v omezené části aplikace. Tedy že ostatní části přímo dostanou to, co potřebují, a nebudou žádný kontejner používat.

    Ono DI kontejner není žádná výhra a je to pořád celkem mizerné řešení, i když je jedno z nejlepších nyní známých. Snad někdo brzy vymyslí něco lepšího.
    Hello world ! Segmentation fault (core dumped)
    21.11.2014 19:02 Logik
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Osobně jsem dospěl k modelu s IMHO přijatelným poměrem cena/výkon:

    Mám jeden sigleton DI kontejner. A vytvářené objekty jsou napsány s nepovinnými závislostmi tak, že když se neuvedou explicitně, vezmou se z toho singletonu.

    Pro účely unit testů atd... to jde snadno mockovat, a přitom se to dá snadno a přitom člověk může rychle napsat "špinavou aplikaci", když mu nejde o čistotu řešení, ale o rychlost - a ta "špinavá aplikace" jde snadno "opravit".
    Josef Kufner avatar 21.11.2014 19:44 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Jo, toto je takový rozumný přístup a v současné době asi nejlepší. I když k té automatice jsem trošku nedůvěřivý.

    Ale i tak je potřeba si hlídat, kde všude se ten kontejner používá, neboť to kompiluje použití kódu v jiných aplikacích, kde je jiný kontejner.
    Hello world ! Segmentation fault (core dumped)
    21.11.2014 19:53 Kit | skóre: 45 | Brno
    Rozbalit Rozbalit vše Re: PHP - jaký návrhový vzor použít
    Místo DI kontejneru používám model. Namockovat se v něm dá cokoli, protože všechno dostává přes DI.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.