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

Byl vydán Docker 1.13. Přehled novinek na YouTube a v poznámkách k vydání na GitHubu. Docker umožňuje běh aplikací v softwarových kontejnerech (Wikipedia).

Ladislav Hagara | Komentářů: 0
včera 15:51 | Komunita

Mozilla.cz informuje, že nástroje pro webové vývojáře se možná oddělí od Firefoxu a stanou doplňkem. Nástroje pro webové vývojáře prošly velkým přepisem a tým, který se stará o jejich vývoj, by uvítal možnost jejich častějších aktualizacích nezávisle na vydávání nových verzí Firefoxu.

Ladislav Hagara | Komentářů: 1
včera 07:00 | Humor

Čtenářům AbcLinuxu vše nejlepší k dnešnímu Dni zvýšení povědomí o tučňácích (Penguin Awareness Day).

Ladislav Hagara | Komentářů: 0
včera 06:00 | Komunita

Bylo spuštěno hlasování o přednáškách a workshopech pro letošní InstallFest, jenž proběhne o víkendu 4. a 5. března v Praze. Současně byla oznámena změna místa. InstallFest se letos vrací zpět na Karlovo náměstí do budovy E.

Ladislav Hagara | Komentářů: 0
včera 02:48 | Komunita

Greg Kroah-Hartman potvrdil, že Linux 4.9 je jádrem s prodlouženou upstream podporou (LTS, Long Term Support). Podpora je plánována do ledna 2019. Aktuální jádra s prodlouženou podporou jsou tedy 3.2, 3.4, 3.10, 3.12, 3.16, 3.18, 4.1, 4.4 a 4.9.

Ladislav Hagara | Komentářů: 0
včera 00:11 | Zajímavý článek

Výrobce síťových prvků, společnost Netgear, spustila nový program, který slibuje vývojářům, expertům, ale i běžným uživatelům vyplacení finanční odměny za nalezení bezpečnostních chyby v jejich produktech. Za nalezení zranitelnosti v hardware, API nebo mobilní aplikaci nabízí odměnu od 150 do 15 tisíc dolarů (dle závažnosti).

Michal Makovec | Komentářů: 0
včera 00:08 | Pozvánky

V sobotu 18. 2. se v Praze v prostorách VŠE uskuteční od 9:30 již 4. ročník největší české konference o open source redakčním systému WordPress (WP) - WordCamp Praha 2017.

… více »
smíťa | Komentářů: 0
19.1. 23:58 | Komunita

Kryptoměnová komunita zahájila nový rok spuštěním projektu Blockchain.cz, jehož cílem je kolektivně nalézt ideální překlad pro čím dál frekventovanější slovo „blockchain“. Přispět návrhem může kdokoli. Sběr bude trvat až do konce září 2017. Následně bude probíhat dvoutýdenní veřejné hlasování, které bude zakončeno výběrem toho nejlepšího návrhu.

xHire | Komentářů: 8
19.1. 15:55 | Bezpečnostní upozornění

Společnost Oracle vydala čtvrtletní bezpečnostní aktualizaci svých softwarových produktů (CPU, Critical Patch Update). Opraveno je celkově 270 bezpečnostních chyb. V Oracle Java SE je například opraveno 17 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 16 z nich. V Oracle MySQL je opraveno 27 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 5 z nich.

Ladislav Hagara | Komentářů: 0
19.1. 02:48 | Nová verze

Po půl roce od vydání verze 9.0 (zprávička) byla vydána verze 10.0 zvukového serveru PulseAudio. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 35
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (10%)
 (2%)
 (73%)
 (3%)
 (11%)
Celkem 343 hlasů
 Komentářů: 24, poslední 17.1. 10:14
    Rozcestník
    Reklama

    Dotaz: Getter a Setter v PHP

    25.2.2015 13:41 Marky
    Getter a Setter v PHP
    Přečteno: 876×
    Ahoj, už tři dny mi nedá spát Kit-ova citace

    "Když vývojář napíše getter/setter jako public, poruší tím zapouzdření objektu se všemi důsledky."

    Copak to jde udělat private ? K čemu by pak takový getter měl sloužil a hlavně jak bych pak dostal data z těch class, když potřebuji z jedné metody získat více hodnot?

    Řešení dotazu:


    Odpovědi

    25.2.2015 16:18 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Pokud má třída 3 privátní atributy, 3 gettery, 3 settery a žádnou další metodu, jedná se o 3 nezávislé věci, které třída dělá. Proto by měla být rozdělena do 3 nezávislých tříd. Setter je pak nahrazen konstruktorem, getter prezentační metodou.

    Pokud je atribut privat a je k němu napsán public getter a public setter, v konečném důsledku se ten atribut chová jako public. A to je až na výjimky (messengery) zpravidla nežádoucí.

    V PHP téměř nikdy nepotřebuji manipulovat s jednotlivými atributy objektu. Proto ani gettery/settery nedělám. Jednoduše je nepotřebuji. Vždy pracuji s objektem jako celkem, jinak by to bylo porušením SRP.

    Pokud potřebuji z jedné metody dostat více hodnot, uložím je do objektu další třídy nebo v jednodušších případech použiji zmíněný messenger.

    Použití nezávislých setterů s sebou rovněž nese riziko nekonzistence objektu. Pokud například chceš změnit jméno i příjmení, změníš jméno a než změníš příjmení, tak se někdo zeptá na stav objektu. V tu chvíli je tam nové jméno, ale staré příjmení. A to je problém, který se může projevit i u dvou getterů, které jdou po sobě. Mezitím se stav objektu mohl změnit.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    rADOn avatar 25.2.2015 16:48 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Pokud je atribut privat a je k němu napsán public getter a public setter, v konečném důsledku se ten atribut chová jako public.
    Je tu jeden rozdil – pokud se neco zmeni a ty chces ten atribut ziskat jinym zpusobem, treba ho spocitat z jinych, vytahnout z cache nebo cokoliv, musis opravit potencialne hodne kodu. Pokud jazyk nema zpusob jak zahakovat cteni/nastavovani atributu, tak je psani get/set metod rozumny zpusob jak byt predem pripraven. Kdyz jsou to "nezavisle veci" tak je to samozrejme zbytecne, ale treba v prikladu ktery uvadis jsou jmeno a prijimeni na sobe zavisle. Takze si bud udelas setter ktery nastavi oboji, nebo udelas dva settery ale opatris je vzajemnym zamykanim… v kazdem pripade budes chtit aby samotny atribut byl private aby ti na nej nikdo nesahal.

    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    25.2.2015 17:07 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Jenže já na ty privátní atributy nesahám, takže nic nemusím opravovat ani zamykat.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    25.2.2015 16:40 Mercuriuz | skóre: 16 | blog: Mercuriuz | V hospodě =)
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Je to jen vtípek... myslím
    Čistě teoreticky můžeš gettery/settery udělat protected a přístup k nim řešit přes child classu, např. pokud child classa poskytuje metody pro zpracování hodnot, může je takto předávat parentovi který zapouzdřuje výsledek.
    Každopádně dělat private všechno, na co nemá chytat nic jiného než classa samotná je velmi užitečný "zlozvyk"

    class Car
    {
        private $VIN,
                $color,
                $owner;
    
        private function convertColorToRgb($hexColor)
        {
            /* funkce která zajistí convert */
            return $rgb;
        }
    
        protected function getData()
        {
            return array("VIN" => $VIN, "color" => $color, "owner" => $owner);
        }
    
        protected function setVIN($vin)
        {
            $this->VIN = $vin;
        }
    
        protected function setColor($color)
        {
            $this->color = $this->convertColorToRgb($color);
        }
    
        protected function setOwner($owner)
        {
            $this->owner = $owner;
        }
    }
    
    class CarLoader extends Car
    {
        public function loadCar($vin)
        {
            $this->setVIN($vin);
            $data = $this->getDatabaseData($vin)
            $this->setColor($data['color']);
            $this->setOwner($data['owner']);
        }
    
        private function getDatabaseData($vin)
        {
            /* funkce která načte auto z databáze a uloží hodnoty do lokálních proměnných $color a $owner */
            return array("color" => $color, "owner" => $owner);
        }
    }
    
    class CarToXml extends Car
    {
        public function getXml()
        {
            $data = $this->getData();
            /* funkce která z dat v proměnné $data udělá xml */
            $return $xml;
        }
    }
    


    Je to samozřejmě jen příklad, jde o to, že child classy přesně ví, co mají do parenta posílat za data a jakým způsobem s ními pracovat, ani jeden setter/getter není z venku dostupný a stejně jde dělat vše co je potřeba.
    Linux users everywhere, raise your keyboards into the air, we´re warriors, warriors of the world.
    25.2.2015 16:47 Mercuriuz | skóre: 16 | blog: Mercuriuz | V hospodě =)
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    $ před return ve funkci getXml() je samozřejmě jen typo
    Linux users everywhere, raise your keyboards into the air, we´re warriors, warriors of the world.
    25.2.2015 16:51 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    No nazdar... Jako vtípek je to ale docela dobré. Jenom trochu ... nepoužitelné.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    25.2.2015 17:17 Mercuriuz | skóre: 16 | blog: Mercuriuz | V hospodě =)
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    no tak nejvhodnější příklad to zrovna není, ale nic lepšího sem zrovna nevymyslel
    Linux users everywhere, raise your keyboards into the air, we´re warriors, warriors of the world.
    25.2.2015 17:33 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Co třeba tohle? Trochu jsem to předělal podle sebe.
    class Car {
        private $vin;
        private $color;
        private $owner;
        private $db;
    
        function __construct($db, $vin) {
            $this->db = $db;
            $this->vin = $vin;
            $data = $this->findCar($vin);
            $this->color = self::convertColorToRgb($data['color']);
            $this->owner = $data['owner'];
        }
    
        private function findCar($vin) {
            /* funkce která načte auto z databáze a uloží hodnoty do lokálních proměnných $color a $owner */
            return $select->fetch(); //array("color" => $color, "owner" => $owner);
        }
    
        private static function convertColorToRgb($hexColor) {
            /* funkce která zajistí convert */
            return $rgb;
        }
    
        function __toString() {
            /* funkce která z dat v proměnných $vin, $color a $owner udělá $xml */
            return $xml;
        }
    }
    
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    25.2.2015 18:04 DarkKnight | skóre: 24
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    A co kdyz nechce pouzivat Active Record? Co kdyz se nehodi do navrhu architektury? Co kdyz potrebuju hloupy model, ale s kontrolou vstupu?
    25.2.2015 18:24 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Tak si udělej hloupý model s kontrolou vstupu. Tohle není Active Record, protože neumožňuje modifikaci v DB.

    Je to hodně zjednodušená verze architektury, kterou používám. V reálu tam proměnnou $data a příslušné atributy vůbec nemám. View (který mám v jiné třídě) dostane záznam přímo z DB přes messengera. Konverze barev, data, času apod. do HTML či XML je jeho starost.

    V daném případě jsem považoval za zbytečné to dělit do svých čtyř vrstev a napsal jsem to do jedné třídy. Vadí to moc?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 25.2.2015 22:18 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    K tomhule 3 připomínky:
    1. Celkem není důvod nepoužít getter/setter například pro tu barvu. Zapouzdření není svatá kráva. Pokud budou ty gettery/settery napsaný tak, že nemůžou dostat objekt do nekozistentního stavu, tak v tom opravdu nevidim problém. Pokud by existovala třída Color, která by sama o sobě zajišťovala konzistentní uložení barvy, tak by klidně Car mohlo mít barvu jako veřejný atribut, pokud nejsou na barvu nějaké další omezující podmínky.
    2. Funkce convertColorToRgb nemá v třídě Car co pohledávat, vzhledem k tomu, že se stará o konverzi barev. Taky se mi na ní nelíbí, že je statická, ale přitom zamíchaná mezi nestatické.
    3. Funkce findCar mi tam taky moc nesedí, čekal bych, že bude vracet instanci Car a že bude statická nebo úplně mimo třídu Car.
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 05:11 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    1. Nevidím důvod, proč by barva měla mít vlastní getter/setter. Není potřebný, není to Active Record.
    2. Ta funkce je součástí zadání. V reálu bych ji refaktoroval např. do Color::convertToRgb(), protože s třídou Car nesouvisí. Statická metoda přitom mezi nestatickými ničemu nevadí.
    3. Souhlasím, refaktorování této metody jsem nedotáhl. Už ten název findCar() si zaslouží přejmenovat na find().
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 10:04 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Nevidím důvod, proč by barva měla mít vlastní getter/setter. Není potřebný, není to Active Record.
    Je otázka, k čemu teda vlastně vůbec ta třída informaci o barvě má.

    Dejme tomu, že budu chtít načíst auto, zobrazit jeho barvu, případně ji změnit a zase ho uložit. Jak to uděláš bez getterů/setterů?
    Statická metoda přitom mezi nestatickými ničemu nevadí.
    No je to otázka stylu. Mně to přijde podobné, jako míchat private a public metody. Technicky vzato to ničemu nevadí, ale přehlednost to opravdu nezvyšuje...
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 10:23 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Nevidím důvod, proč by barva měla mít vlastní getter/setter. Není potřebný, není to Active Record.
    Je otázka, k čemu teda vlastně vůbec ta třída informaci o barvě má.
    Nevím, tu si vymyslel Mercuriuz. Třeba proto, aby ji prezentoval na webu?
    Dejme tomu, že budu chtít načíst auto, zobrazit jeho barvu, případně ji změnit a zase ho uložit. Jak to uděláš bez getterů/setterů?
    Načtení auta a zobrazení barvy už tady máme. Zápis nové barvy bude v metodě Color::update()
    Statická metoda přitom mezi nestatickými ničemu nevadí.
    No je to otázka stylu. Mně to přijde podobné, jako míchat private a public metody. Technicky vzato to ničemu nevadí, ale přehlednost to opravdu nezvyšuje...
    Je zvykem psát nejprve public a pak privat metody. Hodláš mě buzerovat za to, že jsem tady přehodil pořadí?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 10:46 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Načtení auta a zobrazení barvy už tady máme.
    Jestli tím myslíš to view co dostává záznam z DB, tak to zní jako docela hnus :-D
    Zápis nové barvy bude v metodě Color::update()
    Což je setter :-D
    Je zvykem psát nejprve public a pak privat metody. Hodláš mě buzerovat za to, že jsem tady přehodil pořadí?
    Ne, to určitě ne, je to detail. Mně je jedno, jaký konvence kdo dodržuje, dokud je to konzistentní a čitelný.
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 11:01 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Zápis nové barvy bude v metodě Color::update()
    Což je setter :-D
    Nevím, jestli se to dá označit jako setter, když to zapisuje do databáze. Setter by přece neměl mít postranní efekty.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 11:31 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Přestávám tomu rozumět... Public settery jsou fuj, ale vzít to oklikou přes databázi, o které by nějaká třída Color IMHO vůbec neměla vědět, je ok :-D

    Jinak ale objekty nemusí vůbec být ukládány do databáze, to je v podstatě specielní případ. Takže jak nastavíš tu barvu bez databáze a bez setteru?
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 11:36 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Však tu barvu nastavuji do databáze. Jinam ji nedávám, protože ji nikde jinde nepotřebuji.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 11:50 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To, že se v tvém konkrétním případě rozhodneš tu barvu neukládat do objektu, ale procedurálně někam jinam (do databáze), s otázkou nemá nic společného.

    Značná část (řekl bych naprostá většina) objektů nikdy nebude uložena do databáze, ale přitom potřebuju měnit jejich stav. Jak to chceš udělat bez public setterů mi fakt není jasný.
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 11:53 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Proč potřebuješ měnit stav atributů objektu, který vzápětí zahodíš? Bez uložení do databáze taková změna nemá žádný smysl.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 12:07 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Wtf? To, že objekt neukládám do databáze, přece neznamená, že ho hned zahodim.

    Dám radši konkrétní případ: V jednom projektu generuju strom položek na základě dat z databáze. Výstupní strom má o dost jinou strukturu než data v databázi, jednak protože stromy se do databáze typicky neukládají moc dobře a zadruhé protože data se určitým způsobem transformují před odesláním do aplikace u klienta. Součástí výsledného stromu objektů jsou všelijaké atributy, vč. tuším i té barvy, které během zpracování data potřebuju nastavovat (přímo nebo přes settery). Výsledné objekty se serializují do jsonu a posílají přes rest api. Nevidim, proč by měly být tyhle settery špatně.

    Jiný příklad, tentokrát mimo web, protože ten tvůj výrok zní dost obecně: QColor::setAlpha() - opět nevidim, proč by takovýhle setter měl být špatně a čím ho nahradit.
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 12:38 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Místo setterů obvykle používám konstruktory. Obvykle se tím view dost zjednoduší.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    26.2.2015 11:33 Radek Miček | skóre: 23 | blog: radekm_blog
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Setter by přece neměl mít postranní efekty.
    BTW i vytvoření objektu je side effect.
    26.2.2015 11:27 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Načtení auta a zobrazení barvy už tady máme.
    Jestli tím myslíš to view co dostává záznam z DB, tak to zní jako docela hnus :-D
    Můj view vždy dostane přímý výstup z PDO, do objektu třídy Car se nic neukládá. Tady je to trochu odlišně a zpětně to už předělat nemohu.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 11:41 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Njn, to ale pak není OOP návrh. Třída Car tam je pak k čemu?
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 11:50 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Třída Car je servisní vrstvou k databázi.

    Už jsem psal, že to co tady mám v jedné třídě, mám v reálu ve čtyřech vrstvách. Jediné, co si objekt třídy Car drží jako atribut, je $vin. Nemá ani databázi - tu vždy dostane od modelu.

    Mám tu třídu refaktorovat a poslat ji sem znovu?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 11:54 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Třída Car je servisní vrstvou k databázi.
    To znamená, že ji používáš na co?
    Mám tu třídu refaktorovat a poslat ji sem znovu?
    No jestli to pomůže objsanit, k čemu ta třída je...
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 12:31 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Používám ji pro manipulaci s persistentními daty domény Car.
    class Car implements Insertable, Findable, Updatable, Deletable {
        private $data;
    
        function __construct(array $data) {
            $this->data = clone (object) $data;
        }
    
        function find(PDO $db) {
            $select = $db->prepare("SELECT * FROM car WHERE vin=?");
            $select->execute(array($this->data->vin));
            return $select->fetch(PDO::FETCH_OBJ);
        }
    
    /* Podobně i
        function insert ...
        function update ...
        function delete ...
    */
    }
    Zbytek je práce modelu, view a controlleru.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 12:51 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Jediný, čim se tahle třída liší od libovolné jiné třídy reprezentující objekt v databázi, je to jméno tabulky - car - a jméno sloupečku s primárním klíčem (předpokládám) - vin. Jestli neobsahuje žádné vlastní chování, tak je v podstatě zbytečná.
    Zbytek je práce modelu, view a controlleru.
    Takže tam máš ještě nějakou modelovou třídu Car?
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 13:08 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Ta třída je vlastně adaptérem. V principu nepracuje s tabulkou car, ale s doménou Car, což v daném případě vypadá jako totéž. Jakmile však do domény Car přidám další tabulky s podmínkami a joiny, už tak zbytečně vypadat nebude. Také obsluhuje výjimky při práci s databází.

    Model je jen jeden, drží databázi a objekt třídy Car se do něj injektuje. Model přidá tu svou databázi do parametru volané metody.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 13:23 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    V aplikačních objektech řešíš joiny a výjimky databáze, ve view řešíš PDO, model je jen jeden (Wtf? To je jako veškerá logika apliace v jedný třídě?), všechno je propojený se vším, tomu se odborně říká spaghetti code...

    Ale jo, taky jsem takový věci napsal... Nedávno jsem musel jednu takovou aplikaci dešpagetizovat...

    Přidej si tam nějaký gettery/settery a hned to bude lepší ;-) Ne, to si dělám srandu, spíš ORM framework to chce...
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 13:38 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Logika domény je v jedné třídě. Těch domén je obvykle víc než tabulek a běžně se překrývají.

    View o PDO nemá ani potuchy. Jak jsi na to přišel?

    Jak jsi přišel na to, že všechno je propojené se vším? To bych se do svých limitních 65 řádek/třídu nevešel.

    K čemu mi bude ORM framework, když mám své domény? Konfigurace ORM je mnohem složitější a hůř udržovatelná.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 13:52 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    View o PDO nemá ani potuchy. Jak jsi na to přišel?
    "View (který mám v jiné třídě) dostane záznam přímo z DB přes messengera" ?
    Jak jsi přišel na to, že všechno je propojené se vším? To bych se do svých limitních 65 řádek/třídu nevešel.
    Takže i ten model má 65 řádek? Moc si neumim představit, jak v 65 řádcích napsat něco užitečnýho aniž by se to muselo rozdělit na bambilion tříd...
    K čemu mi bude ORM framework, když mám své domény? Konfigurace ORM je mnohem složitější a hůř udržovatelná.
    ORM je k tomu, že nemusíš (tolik) řešit databázi v rámci aplikace. Psát hromadu SQL queries pro každej objekt, kterej má bejt persistovanej do DB je zbytečná práce. Náročnost konfigurace ORM záleží na ORM vrstvě, existují i zeroconf ORM (např.).
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 14:08 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    View o PDO nemá ani potuchy. Jak jsi na to přišel?
    "View (který mám v jiné třídě) dostane záznam přímo z DB přes messengera" ?
    No a? Jak to souvisí s PDO?
    Jak jsi přišel na to, že všechno je propojené se vším? To bych se do svých limitních 65 řádek/třídu nevešel.
    Takže i ten model má 65 řádek? Moc si neumim představit, jak v 65 řádcích napsat něco užitečnýho aniž by se to muselo rozdělit na bambilion tříd...
    Když si na to zvykneš, tak už si ani nevzpomeneš na doby, kdy jsi je psal delší.
    K čemu mi bude ORM framework, když mám své domény? Konfigurace ORM je mnohem složitější a hůř udržovatelná.
    ORM je k tomu, že nemusíš (tolik) řešit databázi v rámci aplikace. Psát hromadu SQL queries pro každej objekt, kterej má bejt persistovanej do DB je zbytečná práce. Náročnost konfigurace ORM záleží na ORM vrstvě, existují i zeroconf ORM (např.).
    Pro každou doménu mám obvykle 1-5 SQL dotazů. To se mi nezdá zas tak moc a dobře se to spravuje. Navíc se mi nechce do modelu tahat nějaké konfigurační parametry pro ORM. Nějak to nakonfigurovat musíš, aby věděl, jaké máš tabulky a sloupce v nich. Můj model nic takového nepotřebuje, struktura databáze ho nezajímá. Všechno deleguje na domény.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 14:46 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    No a? Jak to souvisí s PDO?
    No jestli jsem to správně pochopil, tak do view posíláš, co vyleze z PDO. Což je přinejmenším zvláštní - na jednu stranu krituješ gettery/settry, že porušují zapouzdření, ale na druhou stranu ti nevadí posílat do view holý data z PDO, který zapouzředný nejsou vůbec nijak.
    Když si na to zvykneš, tak už si ani nevzpomeneš na doby, kdy jsi je psal delší.
    Hlavně nevidim důvod, proč si na to zvykat. Ten tvůj model fakt má <65 řádek?
    Pro každou doménu mám obvykle 1-5 SQL dotazů. To se mi nezdá zas tak moc a dobře se to spravuje.
    Například budeš muset 1-5 dotazů upravit při každé změně dotyčné 'domény', tj. přidání/odebrání položky apod. Což neříkám, že je nějaká tragédie, ale dělat by se mi to stejně nechtělo...
    Navíc se mi nechce do modelu tahat nějaké konfigurační parametry pro ORM. Nějak to nakonfigurovat musíš, aby věděl, jaké máš tabulky a sloupce v nich.
    Jak říkám, záleží to na ORM vrstvě. Některý mají šílenou konfiguraci. Jiný mají konfiguraci, která je IMHO příjemnější než psát N*5 dotazů. Ten zeroconf ORM, co jsem linkoval, skutečně žádnou konfiguraci nemá, protože schéma generuje automaticky z modelových objektů přes reflexi. Takže když přidám atribut do modelové třídy, ORM vrstva automaticky přidá sloupek do příslušné tabulky, a podobně.

    echo -e "\e[1;2r\e[?2l"
    26.2.2015 15:11 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    No a? Jak to souvisí s PDO?
    No jestli jsem to správně pochopil, tak do view posíláš, co vyleze z PDO. Což je přinejmenším zvláštní - na jednu stranu krituješ gettery/settry, že porušují zapouzdření, ale na druhou stranu ti nevadí posílat do view holý data z PDO, který zapouzředný nejsou vůbec nijak.
    Je to messenger, který zapouzdření nepotřebuje a nepotřebuje ani gettery. Výstup z libovolného getteru také nebývá zapouzřený.
    Když si na to zvykneš, tak už si ani nevzpomeneš na doby, kdy jsi je psal delší.
    Hlavně nevidim důvod, proč si na to zvykat. Ten tvůj model fakt má <65 řádek?
    36.
    Pro každou doménu mám obvykle 1-5 SQL dotazů. To se mi nezdá zas tak moc a dobře se to spravuje.
    Například budeš muset 1-5 dotazů upravit při každé změně dotyčné 'domény', tj. přidání/odebrání položky apod. Což neříkám, že je nějaká tragédie, ale dělat by se mi to stejně nechtělo...
    Totéž bych musel udělat i v případě ORM. Prašť jako bouchni. Obvykle stačí modifikovat pouze ten SQL dotaz a nic víc. Doména se přizpůsobí reflexí.
    Navíc se mi nechce do modelu tahat nějaké konfigurační parametry pro ORM. Nějak to nakonfigurovat musíš, aby věděl, jaké máš tabulky a sloupce v nich.
    Jak říkám, záleží to na ORM vrstvě. Některý mají šílenou konfiguraci. Jiný mají konfiguraci, která je IMHO příjemnější než psát N*5 dotazů. Ten zeroconf ORM, co jsem linkoval, skutečně žádnou konfiguraci nemá, protože schéma generuje automaticky z modelových objektů přes reflexi. Takže když přidám atribut do modelové třídy, ORM vrstva automaticky přidá sloupek do příslušné tabulky, a podobně.
    To jako to ORM modifikuje strukturu tabulek v databázi? No nazdar. Další důvod pro to nepoužívat ORM. Proč se všichni toho SQL tak bojí, že potřebují ORM?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 16:04 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Je to messenger, který zapouzdření nepotřebuje a nepotřebuje ani gettery.
    Já nemluvil o messengeru ale o těch datech, který "messenguje", ty zapouzdřený asi nebudou, jestli to správně chápu. Další věc je, že když ti ty data neprochází přes model, tak nemáš moc možnost je nějak zpracovat/tranformovat/apod...
    To jako to ORM modifikuje strukturu tabulek v databázi? No nazdar.
    Ano, tohle ORM upravuje schéma podle potřeby, v čem je problém?
    Proč se všichni toho SQL tak bojí, že potřebují ORM?
    Nevim jak ostatní, já osobně se SQL nebojím, spíš jde o to, že mě nebaví, vnímám to jako zdržení. Vždyť je to jen způsob, jak uložit data. IMHO méně babrání se s databází = více času pro aplikační logiku. Pro ilustraci třída Car napsaná pro RedBean ORM:

    class Car implements RedBean_SimpleModel {
    	const table = 'car';
    
    	public static function find($vin) {
    		// Minimalistický SQL snippet:
    		return R::findOne(self::name, 'vin = ?', array($vin));
    	}
    
    	// CRUD funkce netřeba psát, stačí použít
    	// R::store($car) pro update, R::trash($car) pro delete apod.
    
    	// ...
    	// zde může být logika modelu Car
    	// ...
    }
    
    To máme nějakých 6 řádek kódu nebo kolik :-D Tvůj přístup je ale zjevně jiný, soustředíš se hlavně na data v DB spíš než na OOP apod... Tím určitě nechci říct, že to je špatně, jestli ti to vyhovuje, tak prosim, ale není to úplně pozice, ze které by měl někdo vynášet obecné soudy o getterech/setterech a zapouzdření, zejména, když sám zapouzdření moc nepoužívá ;-)
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 17:36 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Je to messenger, který zapouzdření nepotřebuje a nepotřebuje ani gettery.
    Já nemluvil o messengeru ale o těch datech, který "messenguje", ty zapouzdřený asi nebudou, jestli to správně chápu. Další věc je, že když ti ty data neprochází přes model, tak nemáš moc možnost je nějak zpracovat/tranformovat/apod...
    Máš zapouzdřená data, která získáš getterem? Asi ne, tak nekritizuj můj messenger.

    Data prochází přes model, ale nevidím důvod, proč by je měl model jakkoli zpracovat/tranformovat/apod. To není jeho účelem. Má se starat pouze o správu externích datových zdrojů a to dělá.
    To jako to ORM modifikuje strukturu tabulek v databázi? No nazdar.
    Ano, tohle ORM upravuje schéma podle potřeby, v čem je problém?
    Problém je v tom, že zpravidla nechci nebo ani nesmím modifikovat strukturu databáze, protože je na ni napojena další aplikace, kterou bych takovým činem mohl nabořit.
    Proč se všichni toho SQL tak bojí, že potřebují ORM?
    Nevim jak ostatní, já osobně se SQL nebojím, spíš jde o to, že mě nebaví, vnímám to jako zdržení. Vždyť je to jen způsob, jak uložit data. IMHO méně babrání se s databází = více času pro aplikační logiku.
    Vnímám to přesně obráceně. Proč bych se měl babrat s aplikační logikou v PHP, když mi to udělá databáze jedním dotazem a ještě se přitom sama postará o kolize?
    Pro ilustraci třída Car napsaná pro RedBean ORM: To máme nějakých 6 řádek kódu nebo kolik :-D
    To jsme na tom stejně s ORM i bez něj. Navíc ti tam chybí ta databáze, asi ji máš globální. To bych nesnesl.
    Tvůj přístup je ale zjevně jiný, soustředíš se hlavně na data v DB spíš než na OOP apod... Tím určitě nechci říct, že to je špatně, jestli ti to vyhovuje, tak prosim, ale není to úplně pozice, ze které by měl někdo vynášet obecné soudy o getterech/setterech a zapouzdření, zejména, když sám zapouzdření moc nepoužívá ;-)
    Tam, kde máš dvojici getter+setter, mám plnohodnotnou třídu. Zapouzdření používám i tam, kde ty ho nemáš.

    Práce s daty v DB je pohodlnější než v PHP. Je také spolehlivější a výkonnější.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 18:27 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Máš zapouzdřená data, která získáš getterem? Asi ne, tak nekritizuj můj messenger.
    Data získaná getterem typicky zapouzdřená jsou, protože to jsou buď primitivní hodnoty, nebo něco složitějšího, a pak je to zapouzdřeno v objektu nějaké třídy (třeba ta Color apod.).

    Tvůj Messenger jsem nekritizoval, jen jsem napsal, že posílá nezapouzdřená data, to ale nemusí být špatně.
    Data prochází přes model, ale nevidím důvod, proč by je měl model jakkoli zpracovat/tranformovat/apod. To není jeho účelem. Má se starat pouze o správu externích datových zdrojů a to dělá.
    V MVC je model jádro aplikace, obsahuje veškerou aplikační logiku a zpracovávat data je jeho účelem.
    Problém je v tom, že zpravidla nechci nebo ani nesmím modifikovat strukturu databáze, protože je na ni napojena další aplikace, kterou bych takovým činem mohl nabořit.
    Ok, tak to potom jo, ale já jsem tímhle omezen nebyl. Nicméně ten framework umožňuje uzamčení schématu, což v produkčním prostředí je stejně potřeba udělat, protože jinak by šel výkon do kytek. Takže do schméatu nezasahuje, pokud to nedovolíš.
    Proč bych se měl babrat s aplikační logikou v PHP, když mi to udělá databáze jedním dotazem a ještě se přitom sama postará o kolize?
    Protože v SQL máš jen velmi omezené možnosti aplikační logiky. V některých případech to může stačit (to, co popisuješ, vypadá jako dosti tenká vrstva nad DB). V mém případě jsem potřeboval s daty dělat různý věci, vč. třeba grafových operací, SQL by mi nestačilo ani náhodou... Jinak o schopnosti databází (rychlost hledání, detekce kolizí, apod.) pochopitelně nepřijdu ani s ORM, to by jinak nemělo smysl vůbec db používat ;-)
    To jsme na tom stejně s ORM i bez něj. Navíc ti tam chybí ta databáze, asi ji máš globální. To bych nesnesl.
    U tebe vidím těch řádků o dost více, zejména pokud by se měly doimplementovat ty ostatní CRUD funkce. Jestli je databáze globální záleží u tohohle ORM podle způsobu použití, v nejjednodušším případně se používá jedna globální DB a statické funkce, je ale možné používat objektové API a/nebo více DB. Ta aplikace, co jsem řešil, používá DB dvě.
    Tam, kde máš dvojici getter+setter, mám plnohodnotnou třídu. Zapouzdření používám i tam, kde ty ho nemáš.
    Zatím jsem v tom tvém návrhu nenašel jediný příklad zapouzdření. Například o té třídě Car výše se asi těžko dát říct, že data o autě zapouzdřuje, když s těmi daty pracuješ někde jinde úplně mimo rozhraní té třídy Car. Vždyť ta třída ani vlastně pořádně neví, jaký data drží, takže tam o nějakém zapouzdření moc nemůže být řeč...

    Znovu připomínám, že to nemusí být nutně špatně, naopak je klidně možné, že to tak je lepší.
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 19:06 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    V MVC je model jádro aplikace, obsahuje veškerou aplikační logiku a zpracovávat data je jeho účelem.
    Používám MVCS, ve kterém servisní vrstva (obsluha domén) dělá aplikační logiku a částečně přebírá původní funkci modelu. Pokud by to bylo pro ni moc práce, přidal bych další mezivrstvu. Model je ve své podstatě zakonzervován a už se nemění.
    U tebe vidím těch řádků o dost více, zejména pokud by se měly doimplementovat ty ostatní CRUD funkce. Jestli je databáze globální záleží u tohohle ORM podle způsobu použití, v nejjednodušším případně se používá jedna globální DB a statické funkce, je ale možné používat objektové API a/nebo více DB. Ta aplikace, co jsem řešil, používá DB dvě.
    Ty řádky jsem tam expandoval ze své obsluhy databáze, aby to neztratilo logiku. Ve skutečnosti těch řádek mám stejně.
    Zatím jsem v tom tvém návrhu nenašel jediný příklad zapouzdření. Například o té třídě Car výše se asi těžko dát říct, že data o autě zapouzdřuje, když s těmi daty pracuješ někde jinde úplně mimo rozhraní té třídy Car. Vždyť ta třída ani vlastně pořádně neví, jaký data drží, takže tam o nějakém zapouzdření moc nemůže být řeč...

    Znovu připomínám, že to nemusí být nutně špatně, naopak je klidně možné, že to tak je lepší.
    To byl účel. Reflexe se občas hodí - z toho messengeru přímo generuji atributy do DOMu. Pokud do SELECTu v doméně přidám jeden sloupec, ihned se mi objeví ve výstupním stromu. Úplně stejně bych generoval JSON.

    Možná tě mate hvězdička v mém SELECTu. Ve skutečnosti tam mám definici sloupců ve stejné struktuře, kterou potřebuji ve view, včetně správných názvů atributů. Formátování výstupních dat, jejich seskupování a případnou lokalizaci řeší výstupní šablona ve view.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 20:07 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    No takže tahle aplikace je spíš takový zobrazovač+editor dané databáze, jinak to nedělá vůbec nic...
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 20:16 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Myslíš si snad, že takových aplikací je méně než 90 % celého webu? Dělal jsem to tak, abych to mohl libovolně rozšiřovat na všech vrstvách a přitom nemusel zasahovat do již hotových částí.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 20:44 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Myslíš si snad, že takových aplikací je méně než 90 % celého webu?
    Ano ;-) Můžeš se třeba zamyslet, jak by se bez aplikační logiky realizovala tahle diskuse... (Protip: moc to nejde).
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 20:53 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Co na tom nejde? Vždyť na takové diskuzi té aplikační logiky moc není. Jeden SELECT do databáze, 8 řádek uspořádání do stromu a šup s tím do šablony. K tomu zápis nového příspěvku s mezináhledem a nějaká administrace.

    Nejvíc práce je s bižuterií okolo, ale té aplikační logiky tady fakt moc není.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 21:14 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    No nevim, jestli bys to narval do 8 řádků, myslim, že spíš ne. Ty komentáře AFAIK nejsou v DB ve stejném pořadí jako je vidíš v diskusi. Nicméně i těch 8 řádků už mi přijde jako aplikační logika moc velká na to, aby se to povalovalo někde v rámci nějakého God objectu (Messenger apod.). Další věc je, že by to mělo být schopno rekurzivně mazat celé podstromy, že, to máme dalších pár řádků, které by se neměly někde náhodně povalovat...
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 21:27 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Kdysi jsem napsal takovou hračku: Prezentace stromové struktury z databáze a jak vidíš, není to nic extra složitého.

    Je otázkou, zda je lepší rekurzívně mazat podstromy nebo uvolněné větve nechat zakořenit. V každém případě se se stromovou strukturou v relační databázi pracuje docela blbě.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 02:44 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Je otázkou, zda je lepší rekurzívně mazat podstromy nebo uvolněné větve nechat zakořenit.
    Ábíčko umí afaik oboje. V každém případě ale na tyhle věci je potřeba obslužný kód, který už řadím do aplikační logiky...
    echo -e "\e[1;2r\e[?2l"
    27.2.2015 06:31 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To je jen implementační detail, protože to závisí na typu použité databáze. Případně to můžeš přenechat svému ORM.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 10:04 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Jj, RB v tomhle ohledu má nějaké funkce...
    echo -e "\e[1;2r\e[?2l"
    27.2.2015 10:19 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Také se to dá udělat rekurzívním SQL dotazem.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    26.2.2015 20:40 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Vždyť ta třída (Car) ani vlastně pořádně neví, jaký data drží, takže tam o nějakém zapouzdření moc nemůže být řeč...
    Ale ví. Drží $vin toho auta a nejen to. Drží i nová data pro insert() či update().
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 20:54 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Drží proměnnou $data, tzn. nějaký data, možná ví o $vin, ale jinak o těch datech nic netuší. Anebo tuší, ale pak jsi neříkal pravdu ohledně toho počtu řádků...
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 21:03 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Musí si ta vstupní data sanitovat, zvalidovat a ošetřit chybějící položky. To je tak 20 řádek navíc, takže se do těch 65 řádek na třídu stále v pohodě vejdu. I kdybych se nevešel, tak je to soft-limit, podobně jako 80 sloupců je také soft-limit.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    27.2.2015 13:15 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Njn, to ale pak není OOP návrh. Třída Car tam je pak k čemu?
    Existuje ještě jedno pravidlo: OOP se s relačními databázemi nemá rádo. Vždy mezi nimi musí být kus procedurálního kódu. Někdo použije ORM framework, někdo si napíše vlastní wrapper na 50 řádcích.

    Třída Car se tedy na jednu stranu chová objektově (viz polymorfní metody find, insert, update) a na druhou stranu (směrem k DB) relačně. Některé aspekty zvládne PDO a něco musí udělat wrapper. Nemůže si dovolit chovat moc objektově (viz Active Record), protože udržování cache je náročné. Proto jsem povinnost držet data ponechal primárně na databázi a sekundárně v controlleru či view.

    Balíky dat si mezi sebou posílají přes messengery. Vzhledem k tomu, že to jsou kopie, může si s nimi příjemce dělat co chce a není nutné je nijak zapouzdřovat.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 17:39 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Existuje ještě jedno pravidlo: OOP se s relačními databázemi nemá rádo.
    Tak to souhlas, oni any ty beans v RedBeanPHP nejsou zapouzdřený, když se odečte automatické generování schématu, modely a další fíčury, tak je to dost podobný těm tvým balíkům s reflexí...

    Technicky vzato by se ty beans daly zapouzdřit důslednějc, ale imho to nemá moc cenu... Beztak pedantické schovávání všeho do private už dost vychází z módy ;-)
    echo -e "\e[1;2r\e[?2l"
    25.2.2015 17:44 OldFrog {Ondra Nemecek} | skóre: 25 | blog: Žabákův notes | Praha
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    A což teprve public třídy, to je teprv svinstvo! :-D Člověk se vystavuje riziku, že tu třídu někdo použije!

    Nad tím by se měl každý zamyslet...
    -- OldFrog
    25.2.2015 17:49 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Hele, běž si trolit jinam a udělej si tam privátní interface.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    25.2.2015 18:33 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    BTW: Zapomněl jsem dát smajlík :-) Tebe za trolla nepovažuji.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    25.2.2015 18:07 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Tak to mě už několikrát napadlo, když tak někdy čtu Kit-a.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    kralуk avatar 25.2.2015 22:20 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    +1. Proč někteří lidé berou poučky z teorie OOP jako náboženská přikázání?
    echo -e "\e[1;2r\e[?2l"
    25.2.2015 22:49 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    On je to mnohem užší pohled (náboženství) než „teorie OOP“, ale aspoň je veselo… ;-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    26.2.2015 05:27 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    A proč je někdo potřebuje za každou cenu obcházet přes gettery/settery?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 10:02 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Gettery/settery nejsou obcházení ;-)
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 10:26 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Je to veřejný přístup dovnitř objektu. Je to tedy porušení zapouzdření.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 10:42 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To je IMHO zcela nicneříkající průpovídka, vzhledem k tomu, že pravděpodobně používáme trochu jinou definici zapouzdření. Mně nepřijde, že ty funkce, který jsi například napsal výše u toho auta, by zasahovaly dovnitř objektu míň než gettery/settery.

    Ale určitě se nechci hádat o definice, to nemá moc smysl, zkus radši popsat případ, kdy getter/setter povede k nečemu negativnímu a co konkrétně to negativum je.
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 10:51 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Nadužívání getterů/setterů vede ke tvorbě tzv. anemických modelů. Tedy takových, které samy o sobě nic neumí a je nutné dělat kolem nich servisní třídy, aby byly nějak použitelné. Výsledkem je procedurální kód, který je zbytečně líný.

    U getterů/setterů se také blbě dělá polymorfismus. Pokud getter nazvu getColor(), stěží ho mohu použít k získání jména majitele auta.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 26.2.2015 11:24 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Ok, takže nadužívání getterů/setterů není dobrý, s tím celkem souhlasim, ono nadužívání víceméně čehokoli není dobrý ;-) Ale to ten tvůj citát moc nepodpoří.
    echo -e "\e[1;2r\e[?2l"
    26.2.2015 11:29 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To není citát, ale výrok.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    27.2.2015 18:49 Matlák
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Pokud getter nazvu getColor(), stěží ho mohu použít k získání jména majitele auta.

    To zní dost divoce... inu PHP. Já mám tedy raději, když jsou všechny operace nad každým objektem přesně definované. A asi mi ani nevadí, když má třída 150 řádků nebo víc, když je o sobě schopná všechno říct už kompilátoru.
    27.2.2015 19:13 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To nijak nesouvisí s PHP. Jak tedy pojmenuješ metodu v interface, pokud ho bude používat třída Car i třída Owner a má poskytovat v textové podobě informaci i stavu objektu?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 20:21 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To zní jako něco jako toString(), nebo co má ten interface dělat?
    echo -e "\e[1;2r\e[?2l"
    27.2.2015 20:35 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Poznal jsi to správně, ale kdybys měl toString() blokováno pro jiný účel nebo potřeboval jiný typ návratové hodnoty, např. nějaký token? Hmm, pak bys to asi nazval getToken() nebo asToken(). Tak tedy dvojici [klíč=>hodnota].

    Jinak interface nic nedělá, pouze popisuje vlastnosti rozhraní.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 20:41 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Neboj, vím, co je interface :-D Interface sice sám o sobě nic nedělá, ale popisuje nějaké chování. Jinak ale moc nechápu, kam tím vším směřuješ, to, že se metoda pojmenuje pokudmožno smysluplně je snad samozřejmé, ne?
    echo -e "\e[1;2r\e[?2l"
    27.2.2015 20:50 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To ano, ale název metody getColor(), který by měl být společný pro třídy Car i Owner na třídu Owner nepasuje. Podobně by nepasoval společný název metody getName().

    Mířím k polymorfismu, který se v případě getterů/setterů nedá dost dobře použít.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 20:54 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Proč by jako měl být společný pro ty dvě třídy? To IMHO nikdo nechtěl.

    Jinak pokud by tenhle getter měl být společný pro víc tříd, může být definováno rozhraní Colorable s metodami setColor() a getColor(), například...
    echo -e "\e[1;2r\e[?2l"
    27.2.2015 21:17 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Například metodu $model->find() mám společnou pro hledání objektu v databázi. Svým způsobem je také getter, jen má jako atribut objekt, podle kterého se hledá. Přitom model netuší, ve které tabulce, resp. doméně bude ta data hledat. To mu dodá ten objekt.

    Místo $model->findCar($id) a $model->findOwner($id) mám tedy $model->find($car) nebo $model->find($owner). Výstup nacpu do DOMu nebo do JSONu dle potřeby a nemusím se zajímat o to, co jsem vlastně z databáze vytáhl. Polymorfismus a reflexe se postará o zbytek.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 23:15 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    No a? Nějak mi není jasný, co to má společného s diskusí. Gettery/settery nejsou určený na tahání dat z DB.
    echo -e "\e[1;2r\e[?2l"
    27.2.2015 23:26 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Gettery/settery nejsou určený na tahání dat z DB.
    ... protože jsou k ničemu.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 23:34 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    :-D :-D

    Dával jsem tu příklad setteru, máš možnost vysvětlit, proč je k ničemu a jak mám bez něj nastavit alpha hodnotu pixelu v pixmapě...
    echo -e "\e[1;2r\e[?2l"
    27.2.2015 23:45 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    To mám kvůli tomu přepisovat celou třídu?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 27.2.2015 23:56 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Nemusíš. Stačí vysvětlit. Nebo třeba na kousku (pseudo)kódu:

    pixmap.pixel(0, 0).setAlpha(128);

    Opravdu nevidim, proč by měl bejt ten setter špatně. Nepřipadá mi k ničemu. Jasně, alpha by se u barvy mohla nastavovat v konstruktoru, ale tady už je vytvořená.
    echo -e "\e[1;2r\e[?2l"
    28.2.2015 00:03 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Opravdu netuším, proč bych měl jednomu pixelu nastavovat průhlednost, ale budiž:
    pixmap.pixel(0, 0).Alpha = 128;
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 28.2.2015 00:10 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Dva problémy: 1) alpha je private (navíc nemusí vůbec existovat jako samostatný atribut, barva může být uložena v jednom integeru apod.), 2) tímhle způsobem bys mohl nastavit neplatnou barvu:

    pixmap.pixel(0, 0).Alpha = 9001;

    A jsme mimo povolený rozsah 0-255.
    echo -e "\e[1;2r\e[?2l"
    28.2.2015 00:17 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Pořád jsi nenapsal, proč by se alpha mělo měnit. Jaká je příčina této změny. Vždyť pixmap netuší, proč má měnit průhlednost. Jaká událost nastala?
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 28.2.2015 00:27 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Však taky pixmap tu změnu průhlednosti nezpůsobuje. Může to být například součástí nějakého vykreslovacího algoritmu, který potřebuje měnit alpha složku některých pixelů.

    Jestli ti to připadá nesmyslné, můžeme uvažovat setter pro celý pixel na pixmapě:

    pixmap.setPixel(x, y, color);

    Příkladem použití může být třeba algoritmus vykreslující přímku do té pixmapy.

    Bereš to jako příklad, nebo mě donutíš najít příklad setteru v nějakém kódu online?
    echo -e "\e[1;2r\e[?2l"
    28.2.2015 09:48 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Myslel jsem si, že poznáš setter napsaný v jiné syntaxi. Tím oba problémy odpadají. Lepší by však bylo tu konstantu zapouzdřit do Alpha, aby se platnost alfy mohla ověřit už při kompilaci.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 28.2.2015 11:27 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Myslel jsem si, že poznáš setter napsaný v jiné syntaxi.
    Myslel jsem si, že to není setter, protože jsem se ptal, čím ty blbé settery, které jsou tak k ničemu, nahradit. Nenapadlo mě, že navrhneš nahrazení setteru setterem.
    Lepší by však bylo tu konstantu zapouzdřit do Alpha, aby se platnost alfy mohla ověřit už při kompilaci.
    1) Platnost se neověří při kompilaci, protože hodnota je dynamická.
    2) I kdyby dynamická nebyla, možnost ověřit ji staticky je úplně stejná v konstruktoru jako v setteru, konstruktor je member funkce úplně stejně jako setter.
    3) I když se alpha zapoudří do nějaké další třídy kvůli ověření rozsahu, stále ji potřebuju do třídy Color dostat setterem.
    echo -e "\e[1;2r\e[?2l"
    28.2.2015 13:36 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Ono je to u procedurálního kusu kódu vcelku jedno, zda tam setter je či není.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    kralуk avatar 28.2.2015 16:38 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    :-D
    echo -e "\e[1;2r\e[?2l"
    25.2.2015 18:13 Marky
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Díky za info, zajímavé čtení.. Znamená to tedy, že když mám cca 50 class v celém webu a nemám tam ani jeden return, dělám to špatně?
    25.2.2015 18:27 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Je to přinejmenším velmi zvláštní. Zřejmě v těch třídách používáš příkaz echo.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    25.2.2015 18:49 Marky
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Příkaz echo mám v celém projektu pouze jednou a to přímo ve View kterýn ty sračky vypisuji :-D
    25.2.2015 18:55 Kit
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Takže jednotlivé komponenty sázíš do nějakého veřejně dostupného objektu nebo ho do nich injektuješ?
    25.2.2015 19:10 Marky
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Ano, sázím to do objektu který předávám příslušným class jako parametr. Je to strašně přehledné na nějaké úpravy. Čili mám pouze jeden objekt (jiné pro žádnou class nevytvářím, nepotřebuji je) a jedno již zmiňované echo. Sice vše funguje absolutně bez problému, zabraná paměť max < 1MB. Otázka ale je to ostatní, a to je to, co nevím :-(
    25.2.2015 19:51 Kit | skóre: 37 | Brno
    Rozbalit Rozbalit vše Re: Getter a Setter v PHP
    Pokud to funguje a vyhovuje ti to, nevidím problém.

    Pokud to někde vystavíš, rád se na to podívám.
    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.