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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 1
včera 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 5
včera 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

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

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
včera 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
1.12. 15:16 | Komunita

Na GOG.com začal zimní výprodej. Řada zlevněných her běží oficiálně také na Linuxu. Hru Neverwinter Nights Diamond lze dva dny získat zdarma. Hra dle stránek GOG.com na Linuxu neběží. Pomocí návodu ji lze ale rozběhnout také na Linuxu [Gaming On Linux].

Ladislav Hagara | Komentářů: 1
1.12. 13:14 | Bezpečnostní upozornění

Byla vydána verze 2.7.1 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Řešeno je několik bezpečnostních problémů. Aktualizován byl především Tor Browser na verzi 6.0.7. Tor Browser je postaven na Firefoxu ESR (Extended Support Release) a právě ve Firefoxu byla nalezena a opravena vážná bezpečnostní chyba MFSA 2016-92 (CVE-2016-9079, Firefox SVG Animation

… více »
Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 759 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Getter a Setter v PHP

25.2.2015 13:41 Marky
Getter a Setter v PHP
Přečteno: 864×
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: 36 | 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: 36 | 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: 36 | 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: 36 | 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: 36 | 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.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 05:11 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 10:23 Kit | skóre: 36 | 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ý.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 11:01 Kit | skóre: 36 | 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?
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 11:36 Kit | skóre: 36 | 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ý.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 11:53 Kit | skóre: 36 | 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.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 12:38 Kit | skóre: 36 | 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: 36 | 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?
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 11:50 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 12:31 Kit | skóre: 36 | 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?
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 13:08 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 13:38 Kit | skóre: 36 | 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ř.).
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 14:08 Kit | skóre: 36 | 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ě.

Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 15:11 Kit | skóre: 36 | 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á ;-)
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 17:36 Kit | skóre: 36 | 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ší.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 19:06 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 20:16 Kit | skóre: 36 | 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).
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 20:53 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 21:27 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
27.2.2015 06:31 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
27.2.2015 10:19 Kit | skóre: 36 | 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: 36 | 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ů...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 21:03 Kit | skóre: 36 | 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: 36 | 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 ;-)
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
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: 36 | 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: 36 | 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í?
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
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: 36 | 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í ;-)
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 10:26 Kit | skóre: 36 | 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.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 10:51 Kit | skóre: 36 | 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ří.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
26.2.2015 11:29 Kit | skóre: 36 | 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: 36 | 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?
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
27.2.2015 20:35 Kit | skóre: 36 | 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?
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
27.2.2015 20:50 Kit | skóre: 36 | 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...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
27.2.2015 21:17 Kit | skóre: 36 | 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.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
27.2.2015 23:26 Kit | skóre: 36 | 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ě...
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
27.2.2015 23:45 Kit | skóre: 36 | 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á.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
28.2.2015 00:03 Kit | skóre: 36 | 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.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
28.2.2015 00:17 Kit | skóre: 36 | 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?
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
28.2.2015 09:48 Kit | skóre: 36 | 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.
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
28.2.2015 13:36 Kit | skóre: 36 | 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
Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
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: 36 | 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: 36 | 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.