Nette\Object – setters a getters
- piler
- Člen | 111
Pouzivam k jednemu projektu cele Nette a mam model Members. Je zdedeny z Nette\Object a ma protected/private atributy ako: $memberId, $username, $email…
pouzite:
<?php
$member = new Member;
$member->username = $username;
?>
Vyhodi vynimku, lebo nie je definovany ani getter a ani setter. Ked bude mat tento objekt napr. 25 atributov, tak budem musiet napisat 50 metod, v ktorych sa nic zvlastne nedeje.
Predtym som to automatizoval pomocou __set, &__get, ale kedze tieto metody su zadeklarovane v Nette\Objekt, tak ich prepisovat nechcem.
Ako to riesite vy, alebo ako sa jednoducho vyriesit, aby som nemusel pisat setters a getters, ktore vlastne nic poriadne nerobia?
Dik
- Ondřej Brejla
- Člen | 746
Přistupování k private a protected atributům z venku je chyba. To ti snad začne křičet i samotné php, ne jen Nette. Každopádně řešení je používat settery a gettery, protože to je good practise a mělo by to tak být. Skrývání implementace jako jeden ze základních stavebních kamenů OOP ;-) Navíc pokud si je definuješ, tak pak můžes k atributům přistupovat tak, jak popisuješ, protože se o zavolání getterů a setterů postará Nette.
Rozhodně doporučuji gettery a settery používat.
- Patrik Votoček
- Člen | 2221
mějme příklad:
class Foo extends Object
{
public $foo1;
private $foo2;
protected $foo3;
}
pokud get a set metody pro foo2
a foo3
budou
vypadat jenom takto (uvádím pouze foo2 protože pro foo3 by to bylo
stejné):
class Foo extends Object
{
...
public function getFoo2()
{
return $this->foo2;
}
public function setFoo2($value)
{
$this->foo2 = $value;
}
}
Tak asi moc nemá smysl mít ony proměnné jako
private/protected a jednoduše z nich udělám
public. (get a set metody musejí být public aby Nette\Object fungovalo tak jak
má).
pokud by tam ale byla nějáká „složitější“ rutina ale i tak by byla
u všech get a set metod stejná tak upravím __set($name, $value)
a &__get($name)
metody. Pokud je ale u všech metod jiná
rutina tak se tomu že to budu muset napsat Xkrát nevyhnu… :-(
Edit: 2 Warden: on se ale ptá jestli je pro lepší napsat 25× stejný
getter a setter nebo jestli upravit\doplnit __set
a
&__get
metody Nette\Object.
Editoval vrtak-cz (16. 6. 2009 0:21)
- piler
- Člen | 111
Warden napsal(a):
Přistupování k private a protected atributům z venku je chyba. To ti snad začne křičet i samotné php, ne jen Nette. Každopádně řešení je používat settery a gettery, protože to je good practise a mělo by to tak být. Skrývání implementace jako jeden ze základních stavebních kamenů OOP ;-) Navíc pokud si je definuješ, tak pak můžes k atributům přistupovat tak, jak popisuješ, protože se o zavolání getterů a setterů postará Nette.
Rozhodně doporučuji gettery a settery používat.
Myslel som to tak, ze by som pristupoval k nim pomocou __set a __get a kebyze som potreboval specialnu set metodu, napr. setPassword(), kde by som pouzil napr. md5(), tak by sa zavolala tato metoda…ale ostatne by sa volali pomocou __set a __get…
Cize navrhujes/navrhujete, ze by som mal napisat 25 setters a 25 getters ak mam 25 atributov?
- piler
- Člen | 111
vrtak-cz napsal(a):
mějme příklad:
class Foo extends Object { public $foo1; private $foo2; protected $foo3; }
pokud get a set metody pro
foo2
afoo3
budou vypadat jenom takto (uvádím pouze foo2 protože pro foo3 by to bylo stejné):class Foo extends Object { ... public function getFoo2() { return $this->foo2; } public function setFoo2($value) { $this->foo2 = $value; } }
Tak asi moc nemá smysl mít ony proměnné jako private/protected a jednoduše z nich udělám public. (get a set metody musejí být public aby Nette\Object fungovalo tak jak má).
pokud by tam ale byla nějáká „složitější“ rutina ale i tak by byla u všech get a set metod stejná tak upravím__set($name, $value)
a&__get($name)
metody. Pokud je ale u všech metod jiná rutina tak se tomu že to budu muset napsat Xkrát nevyhnu… :-(
Prave tie public sa mi pozdavaju, lebo ich nepotrebujem nijak osetrovat a opodobne…ale je to asi proti principom OOP…
- jasir
- Člen | 746
Prave tie public sa mi pozdavaju, lebo ich nepotrebujem nijak osetrovat a opodobne…ale je to asi proti principom OOP…
No a vždyť je používej. Gettery/Settery můžeš bezbolestně přidat
později,
až zjistíš, že
- a) potřebuješ read-only properties → změníš public na private a napíšeš getter
- b) potřebuješ nějakou komplikovanější akci při přiřazení/čtení z property (například caching, inicializaci, kontrolu parametrů apod.) → změníš public na private a napíšeš getter a setter
Editoval jasir (16. 6. 2009 0:31)
- Patrik Votoček
- Člen | 2221
Jenom doplním že to co jsem psal platí pouze pokud nechceš read-only.
Pokud chceš read-only tak se spoustě getterů nebo upravě
&__get
metody nevyhneš. Navíc pokud máš gettery a settery
tak jak jsem napsal tak stejně „děláš“ z oněch
protected/private metod public.
- Ondřej Brejla
- Člen | 746
piler napsal(a):
Myslel som to tak, ze by som pristupoval k nim pomocou __set a __get a kebyze som potreboval specialnu set metodu, napr. setPassword(), kde by som pouzil napr. md5(), tak by sa zavolala tato metoda…ale ostatne by sa volali pomocou __set a __get…
Cize navrhujes/navrhujete, ze by som mal napisat 25 setters a 25 getters ak mam 25 atributov?
Já public atributy nepoužívám ze zásady, protože mi to přijde prasárna a trošičku to smrdí. Já osobně bych těch 25 metod klidně napsal…ale jak říkám, já to tak dělám z přesvědčení a ze zvyku.
Už jen ten klid z toho, že mám atributy private a k nim settery…vím, že jinak než přes tu jednu metodu se tam ta data prostě nedostanou, takže vstupy si můžu ošetřit jak potřebuju. Ikdyž zrovna při první implemetaci vstupy neošetřuju, třeba za měsíc budu chtít a pak implementovat setter a dohledávat kde používám public atribut přímo? Ne děkuji :)
- jasir
- Člen | 746
Warden napsal(a):
Já public atributy nepoužívám ze zásady, protože mi to přijde prasárna a trošičku to smrdí. Já osobně bych těch 25 metod klidně napsal…ale jak říkám, já to tak dělám z přesvědčení a ze zvyku.
Už jen ten klid z toho, že mám atributy private a k nim settery…vím, že jinak než přes tu jednu metodu se tam ta data prostě nedostanou, takže vstupy si můžu ošetřit jak potřebuju. Ikdyž zrovna při první implemetaci vstupy neošetřuju, třeba za měsíc budu chtít a pak implementovat setter a dohledávat kde používám public atribut přímo? Ne děkuji :)
Když používáš Nette\Object a syntactic sugar $obj->publicAttribute, můžeš přeci změnit public → get/set bez jakéhokoliv dohledávání, ne?
- Ondřej Brejla
- Člen | 746
jasir napsal(a):
Když používáš Nette\Object a syntactic sugar $obj->publicAttribute, můžeš přeci změnit public → get/set bez jakéhokoliv dohledávání, ne?
Samo, to jistě můžeš. Já popisuju spíš obecný princip. Ne vždy a ne všude můžu mít k dispozici Nette\Object. Zvyknu si používat tento sugar, začnu psát aplikaci v něčem jiném a ono to tu najednou není. Já to třeba ani v Nette aplikacích nepoužívám, právě z tohoto důvodu. Ale je to zvyk.
- piler
- Člen | 111
Warden napsal(a):
jasir napsal(a):
Když používáš Nette\Object a syntactic sugar $obj->publicAttribute, můžeš přeci změnit public → get/set bez jakéhokoliv dohledávání, ne?
Samo, to jistě můžeš. Já popisuju spíš obecný princip. Ne vždy a ne všude můžu mít k dispozici Nette\Object. Zvyknu si používat tento sugar, začnu psát aplikaci v něčem jiném a ono to tu najednou není. Já to třeba ani v Nette aplikacích nepoužívám, právě z tohoto důvodu. Ale je to zvyk.
Takze to asi mozme uzavriet s tym, ze sa doporucuje pisat setters a getters pre kazdy attribut, ktory by som chcel menit „navonok“ triedy.
Hladal som ine riesenie, ako si usetrit cas pisanim. Este mi napadlo. Pouzivam Eclipse. Existuje nejaka extensions, ktora automaticky vygeneruje setters a getters na zaklade atributov?
Dik za rady.
- Ondřej Brejla
- Člen | 746
Eclipse neznám, ale v NetBeans to jde a v Aptana Studiu, mám dojem, taktéž…myslím, že v Eclipse by to taky mělo jít…to je docela základní funkčnost.
Editoval Warden (16. 6. 2009 13:01)
- nAS
- Člen | 277
piler napsal(a):
Prave tie public sa mi pozdavaju, lebo ich nepotrebujem nijak osetrovat a opodobne…ale je to asi proti principom OOP…
Já nechápu, proč by to mělo být proti principům OOP. Vždyť public proměnné jsou úplně normální mechanismus, který je určen k tomu aby se používal. Je nesmyslné psát prázdné gettery a settery, když tu proměnnou mohu definovat jako public.
Warden napsal(a):
Už jen ten klid z toho, že mám atributy private a k nim settery…vím, že jinak než přes tu jednu metodu se tam ta data prostě nedostanou, takže vstupy si můžu ošetřit jak potřebuju. Ikdyž zrovna při první implemetaci vstupy neošetřuju, třeba za měsíc budu chtít a pak implementovat setter a dohledávat kde používám public atribut přímo? Ne děkuji :)
Pokud to v té první implementaci přímo neošetříš, tak je to asi z důvodu, aby to bylo rychle a přehledně. Takže nevidím důvod proč nepoužít public. A až to budeš chtít lépe ošetřit, tak se ti určitě budou lépe hledat public proměnné, než procházet hromadu getterů a setterů a zjišťovat, který je dostatečně zabezpečený a který ne.
Já si myslím, že gettery a settery jsou velmi užitečná věc, sám je využívám velmi často, ale je nesmysl psát prázdné gettery a settery, když mohu proměnnou definovat jako public. Mě to připadá, jako kdyby si někdo zakázal používat v názvech proměnných půlku písmen – úplně zbytečné omezení, které ničemu nepomůže.
Edit: I v samotném Nette se používají public proměnné.
Editoval nAS (16. 6. 2009 15:24)
- Ondřej Brejla
- Člen | 746
nAS napsal(a):
Pokud to v té první implementaci přímo neošetříš, tak je to asi z důvodu, aby to bylo rychle a přehledně. Takže nevidím důvod proč nepoužít public.
To je trošku hloupost ne? Obcházet „řekněme správný (lepší slovo mě nenapadá, proto ty uvozovky)“ návrh pod záminkou „rychlosti a přehlednosti“? To mi řekni, co je na tom přehledné.
A až to budeš chtít lépe ošetřit, tak se ti určitě budou lépe hledat public proměnné, než procházet hromadu getterů a setterů a zjišťovat, který je dostatečně zabezpečený a který ne.
Taky zajímavá myšlenka…myslíš, že se ti bude lépe hledat použití X public atributů v X souborech a jejich přepisování na použití metod, než úprava jedné metody v jednom souboru?
Já si myslím, že gettery a settery jsou velmi užitečná věc, sám je využívám velmi často, ale je nesmysl psát prázdné gettery a settery, když mohu proměnnou definovat jako public. Mě to připadá, jako kdyby si někdo zakázal používat v názvech proměnných půlku písmen – úplně zbytečné omezení, které ničemu nepomůže.
Ne půlku písmen, ale třeba velké písmeno na začátku metody. Taky je to jen zvyk. Nikde není napsané, že to tak být nesmí a přesto to tak většina lidí nepoužívá a proč? Protože to má jakýsi smysl, stejně jako settery a getter a nepoužívání veřejných proměnných ;-)
Edit: I v samotném Nette se používají public proměnné.
Nikdo neříkal, že se v Nette nepoužívají :-) Nicméně to, že se nepoužívají v Nette přeci nic neznamená. To nemá nic společného s obecnými návyky.
Každopádně jsem jen poukazoval na své důvody a své zvyky. Každý má samozřejmě jiné. Nikomu je nenutím.
Ale přestaňme tu flamovat, to přeci není účel. Snad jsme pilerovi problematiku alespoň trochu osvětlili. Over.
- Honza Marek
- Člen | 1664
Warden napsal(a):
Taky zajímavá myšlenka…myslíš, že se ti bude lépe hledat použití X public atributů v X souborech a jejich přepisování na použití metod, než úprava jedné metody v jednom souboru?
Právě že když použiješ Nette\Object, tak to těch X souborů vůbec nepozná :-D
- Honza Marek
- Člen | 1664
piler: Nikdo ti nebrání přepsat si __get a __set, pokud to potřebuješ.
Já to dělám občas třeba takto:
public function &__get($name)
{
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
return parent::__get($name);
}
- Ondřej Brejla
- Člen | 746
Honza M. napsal(a):
Právě že když použiješ Nette\Object, tak to těch X souborů vůbec nepozná :-D
viz. můj post výše :-) Diskuse se přesunula do jinčí roviny. Ale už to nerozvádějme, fakt to smrdí zbytečným flamem, dík ;-)
- Honza Marek
- Člen | 1664
Ale ten můj druhý příspěvek je podle mě zas vysoce hodnotný, tak mám na jeden šťourací nárok, ne? :-D
- Patrik Votoček
- Člen | 2221
Warden napsal(a):
nAS napsal(a):
Pokud to v té první implementaci přímo neošetříš, tak je to asi z důvodu, aby to bylo rychle a přehledně. Takže nevidím důvod proč nepoužít public.To je trošku hloupost ne? Obcházet „řekněme správný (lepší slovo mě nenapadá, proto ty uvozovky)“ návrh pod záminkou „rychlosti a přehlednosti“? To mi řekni, co je na tom přehledné.
A kde je řečeno že „správný“ návrh je nepoužívat OOP v PHP naplno? (nepoužívat public)
A až to budeš chtít lépe ošetřit, tak se ti určitě budou lépe hledat public proměnné, než procházet hromadu getterů a setterů a zjišťovat, který je dostatečně zabezpečený a který ne.
Taky zajímavá myšlenka…myslíš, že se ti bude lépe hledat použití X public atributů v X souborech a jejich přepisování na použití metod, než úprava jedné metody v jednom souboru?
Proto je tu &__get
a __set
aby jsi nemusel! (Nette\Object ti to jenom
zjednodušší). Aneb chci přidat ošetření pro vlastnost. Najdu definování
vlastnosti jako public přepíšu na protected/private dopíšu setter a getter.
Nevím co je na tom měnění v X souborech?
Já si myslím, že gettery a settery jsou velmi užitečná věc, sám je využívám velmi často, ale je nesmysl psát prázdné gettery a settery, když mohu proměnnou definovat jako public. Mě to připadá, jako kdyby si někdo zakázal používat v názvech proměnných půlku písmen – úplně zbytečné omezení, které ničemu nepomůže.
Ne půlku písmen, ale třeba velké písmeno na začátku metody. Taky je to jen zvyk. Nikde není napsané, že to tak být nesmí a přesto to tak většina lidí nepoužívá a proč? Protože to má jakýsi smysl, stejně jako settery a getter a nepoužívání veřejných proměnných ;-)
To je to samé jako proč X% programátorů píše aplikace anglicky. A né česky s diakritikou v názvech proměnných. Právě ten smysl se snažím najít.
Edit: kdybych náhodou i přez to všechno co jsem tady psal chtěl někde použí všechny vlastnosti jako protected/private s „prázdnými“ gettery a settery (i když důvoud doopravdy nenalézám). Tak bych to řešil takto:
...
public function &__get($name)
{
switch ($name)
{
case 'foo1':
case 'foo2':
return $this->$name;
break;
default:
return parent::__get($name);
break;
}
}
public function __set($name, $value)
{
switch ($name)
{
case 'foo1':
case 'foo2':
$this->$name = $value;
break;
default:
return parent::__set($name, $value);
break;
}
}
...
Pro Nette\Object
Editoval vrtak-cz (16. 6. 2009 18:41)
- Ondřej Brejla
- Člen | 746
Opět jako u Honzy M…už se neřešilo pouze php a Nette\Object, není třeba opakovat co bylo řečeno :-) Doporučuji přečíst celý thread :-) Už tu flamovat nebudu, pokud si přejete něco mi sdělit, případně se hádat a pod, tak prosím na mail, jabber nebo icq, vše v profilu :-)
- xificurk
- Člen | 121
Warden:
Asi si stejně neodpustím poznámku – pokud použiješ „prázdné“ settery a gettery (o kterých prohlašuješ, že je to čistý návrh), tak máš naprosto shodné chování, jako kdybys použil public property (o které prohlašuješ, že je fuj fuj) – pravda, v případě getterů a setterů jsou tam navíc ty metody getXXX() a setXXX(), ale to už je v celku nepodstatný detail.
Rozdíl mezi public property a použitím prázdných getterů/setterů tedy rozhodně není v nějaké čistotě návrhu, ale pouze v počtu napsaných řádků kódu (a tím pádem i rychlosti provádění).
- Ondřej Brejla
- Člen | 746
xificurk napsal(a):
Napsal bych private msg, ale jaksi tu asi není, nebo ji nemůžu najít.
Pokud použiju prázdné settery a gettery, tak samozřejmě mám naprosto stejné chování, jako kdybych použil public property. Já to přeci nepopírám. Jen jsem poukazoval na to, že pokud se za nějaký čas rozhodnu, že by public být neměly, je jedno z jakého důvodu, tak pozdější refaktoring je zbytečně složitější. Proto je používám hned a mám pokoj. Toť asi vše.
Editoval Warden (17. 6. 2009 1:19)
- Patrik Votoček
- Člen | 2221
Předem se omlouvám za to že to tu už je trochu flame ale doopravdy mě to zajímá.
V čem je ten refaktoring složitější?
Aneb jak jsem psal zde:
vrtak-cz napsal(a):
A až to budeš chtít lépe ošetřit, tak se ti určitě budou lépe hledat public proměnné, než procházet hromadu getterů a setterů a zjišťovat, který je dostatečně zabezpečený a který ne.
Taky zajímavá myšlenka…myslíš, že se ti bude lépe hledat použití X public atributů v X souborech a jejich přepisování na použití metod, než úprava jedné metody v jednom souboru?
Proto je tu
&__get
a__set
aby jsi nemusel! (Nette\Object ti to jenom zjednodušší). Aneb chci přidat ošetření pro vlastnost. Najdu definování vlastnosti jako public přepíšu na protected/private dopíšu setter a getter. Nevím co je na tom měnění v X souborech?
- xificurk
- Člen | 121
Warden napsal(a):
Napsal bych private msg, ale jaksi tu asi není, nebo ji nemůžu najít.
Myslím, že tahle problematika zajímá víc lidí ;-)
Pokud použiju prázdné settery a gettery, tak samozřejmě mám naprosto stejné chování, jako kdybych použil public property. Já to přeci nepopírám. Jen jsem poukazoval na to, že pokud se za nějaký čas rozhodnu, že by public být neměly, je jedno z jakého důvodu, tak pozdější refaktoring je zbytečně složitější. Proto je používám hned a mám pokoj. Toť asi vše.
Jenže já tu zbytečnou složitost nevidím… v zásadě mě napadají dva důvody refaktoringu:
- Zapomenuté ošetření vstupu/výstupu
- public property: musím nahradit public → private a napsat komplet getter/setter.
- prázdné g/s: můžu využít již napsané prázdné g/s (které ale v kódu do teď byly zbytečně) a prostě jen ošetřím vstupy/výstupy.
Shrnutí: Celkově (původní kódování+refaktoring) jsem v případě a) napsal asi o 4 písmenka kódu víc.
- Změna z veřejně přístupné vlastnosti na neveřejnou
- public property: musím nahradit public → private (nebo protected).
- prázdné g/s: mažu prázdné g/s.
Shrnutí: Celkově jsem v případě b) naprosto zbytečně psal prázdné g/s.
Přehlédl jsem něco? Ještě možná se podívat na to, když žádný refactoring není:
- původní kód
Oproti public property mám dvě „prázdné“ metody navíc.
Zpátky k jádru pudla, k otázce – jakou máš definici „správného“ návrhu?
To je trošku hloupost ne? Obcházet „řekněme správný (lepší slovo mě nenapadá, proto ty uvozovky)“ návrh pod záminkou „rychlosti a přehlednosti“? To mi řekni, co je na tom přehledné.
Zatím mi totiž přijde, že pro public property mluví rychlost a přehlednost kódu a pro prázdné g/s to, že je to tak „správně“ :-)
- Honza Marek
- Člen | 1664
Taky můžem ukončit tuhle debatu s tim, že jsme oproti Wardenovi ve značné přesile a to by mohlo jako argument stačit :-)
- Patrik Votoček
- Člen | 2221
To je právě to čeho nechci docílit… Rád bych věděl proč Warden obhajuje to co obhajuje.
- Ondřej Brejla
- Člen | 746
vrtak-cz napsal(a):
Už jednou jsem ti psal (a napíšu to znovu :-), že se nebavíme pouze
o php, ale obecně (viz. ty posty výše)…
EDIT: to není na ten post přede mnou, ten byl jen rychlejší
v odesílání :-)
xificurk napsal(a):
Myslím, že tahle problematika zajímá víc lidí ;-)
Tím jsem pouze chtěl zamezit flamování, pořeším to rád :-)
Jenže já tu zbytečnou složitost nevidím… v zásadě mě napadají dva důvody refaktoringu:
- Zapomenuté ošetření vstupu/výstupu
- public property: musím nahradit public → private a napsat komplet getter/setter.
- prázdné g/s: můžu využít již napsané prázdné g/s (které ale v kódu do teď byly zbytečně) a prostě jen ošetřím vstupy/výstupy.
Shrnutí: Celkově (původní kódování+refaktoring) jsem v případě a) napsal asi o 4 písmenka kódu víc.
Tady já vidím to zesložitění, v dohledávání použití public property v různých třídách. Imho je to napsání getterů a setterů (ikdyž prázdných), rychlejší.
- Změna z veřejně přístupné vlastnosti na neveřejnou
- public property: musím nahradit public → private (nebo protected).
- prázdné g/s: mažu prázdné g/s.
Shrnutí: Celkově jsem v případě b) naprosto zbytečně psal prázdné g/s.
Tady nic mazat nemusím. Pokud mám klasické private atributy, které používám interně v objektu, tak k těm žádné g/s nemám. G/s mám k „public“ atributům…k těm, ke kterým chci přistupovat z venčí.
Přehlédl jsem něco? Ještě možná se podívat na to, když žádný refactoring není:
- původní kód
Oproti public property mám dvě „prázdné“ metody navíc.
Ano, mám dvě metody navíc.
Zpátky k jádru pudla, k otázce – jakou máš definici „správného“ návrhu?
Zatím mi totiž přijde, že pro public property mluví rychlost a přehlednost kódu a pro prázdné g/s to, že je to tak „správně“ :-)
Pro prázdné g/s mluví moje spokojenost, že vím naprosto přesně odkud mi do objektu tečou data, mám jasný vstupní bod a to mě uspokojuje :-) Přehlednější mi prpperty právě moc nepřijdou. Ta větší rychlost tu bude, nicméně asi nebude tak závratna…přeci jen jsme v době 2, 4 a více jader s buh ví kolik paměti a já nevím s čím vším :-)
Snad ti to jako odpověď bude stačit :-)
Ono už ani není o čem se moc debatovat, já se furt snažím vysvětlovat svůj názor a když ho někomu vysvětlím, tak přijde někdo další a začne to samé od začátku :-D Snad už bylo vše řečeno :-)
Honza M. napsal(a):
Taky můžem ukončit tuhle debatu s tim, že jsme oproti Wardenovi ve značné přesile a to by mohlo jako argument stačit :-)
To je slovo :-D Ono to tu všechno pramení nejspíš z nějakého špatného prvnotního pochopení, kdy jsem popisoval opravdu svůj přístup k určitým věcem s určitými důvody a všichni se na mě sesypali, jak když kážu nějaká nesmyslná dogmata :-)
Fuj to jsou hrozné slohovky :-)
Editoval Warden (17. 6. 2009 10:36)
- Patrik Votoček
- Člen | 2221
Jo skoro všechno beru a chápu ale tohle prostě nechápu:
Warden napsal(a):
Tady já vidím to zesložitění, v dohledávání použití public property v různých třídách. Imho je to napsání getterů a setterů (ikdyž prázdných), rychlejší.
Můžeš uvést příklad? To je totiž to proč jsem napsal ty ostatní příspěvky.
- Ondřej Brejla
- Člen | 746
Pokud mám projekt o desítkách, stovkách tříd a tuto používám třeba ve třiceti a v těchto třiceti nastavuji public atribut této třídy, tak v okamžiku, kdy chci mít tento vstup kontrolovaný (tedy musím zajistit setter), tak musím procházet třídy a hledat, kde všude vlastně ten atribut nastavuju a přepsat to na použití setteru. A to proto, protože zrovna nepoužívám php a nemám k dispozici __set() (případně hotový Nette\Object). Nedej bože, když se aplikace vyvíjí distribuovaně a já nemám přístup ke všem zdrojovým kódům. Ostatní programátoři třeba jen využívají api mojí třídy.
Upřesnil jsem to trošku? Snad ano.
Editoval Warden (17. 6. 2009 13:26)
- Honza Marek
- Člen | 1664
Takže když máš Nette\Object, tak vyrábíš prázdné gettery a settery jen tak ze zvyku aniž bys k tomu měl důvod. Je to tak?
- Ondřej Brejla
- Člen | 746
Ze zvyku je vyrábím a ze zvyku je i explicitně používám. Stejně jako
ze zvyku nepoužívám public property. Tzn nepoužívám
$foo->bar = foobar;
kde je private $bar;
s Nette\Object sugar.