Kdyby\Doctrine a MagicAccessors – používat, nebo ne?
- chikeet
- Člen | 160
Zdravím,
zajímalo by mě, jaké jsou aktuální best practices ohledně
MagicAccessors – striktně používat gettery a settery pro všechny
properties, nebo jen tam, kde je to opravdu třeba?
Řeším to proto, že tohle
/**
* @return string
*/
public function getName(){
return $this->name;
}
mi přijde jako poměrně zbytečný kód, který jen nafukuje entitu a snižuje její přehlednost. U setterů nebo třeba getterů pro DateTime apod. reálný přínos chápu, ale nutit se vypisovat úplně všechno mi přijde jako zbytečná sebebuzerace, která je navíc ve výsledku i lehce kontraproduktivní.
Může mi prosím někdo vysvětlit, proč MagicAccessors nepoužívat? Návyky, jistota, že budu mít všechno explicitně pořešené, …? Potřebuju argumenty, proč se k tomu snažit dokopat :-)
Edit: pardon, vypadlo mi v původní otázce „striktně používat gettery a settery“, napraveno.
Editoval chikeet (24. 11. 2016 18:39)
- Oli
- Člen | 1215
MagicAccessor bych nedoporučil používat, protože to není čisté, na první pohled není jasné co se děje (nebo nemusí být). Odpověď je třeba i tady: http://stackoverflow.com/…-set-and-get.
A hlavně, jestli používáš cokoli jiného než poznámkový blok, tak to umí vygenerovat getry, sentry i konstruktor. Popravdě psát ručně třeba 10 setrů a getrů na třídu je čistej masochismus. :-)
- newPOPE
- Člen | 648
To je debata dost na dlho a dostat sa k rieseniu je slepa ulicka.
Nielenze magic accessors nie su okej ale takisto ani get/set. Lepsie je take metody ani nemat. Vela sa o tom pristupe hovori v Domain Driven Development-e. Doporucujem si o tom nieco precitat.
Skor by som pouzival logicke nazvy metod napr.
class Foo {
private $bar;
public function bar() {
return $this->bar;
}
public function updateBar() {
$this->bar = $bar;
}
}
Ono cele to stoji a pada na znovupouzitelnosti. Settery nie su znovupouzitelne z podstaty. Ked budes mat setter pre ulicu, cislo, mesto tak zistis, ze je lepsie to zabalit ako adresu a tu tam proste dat celu ako napr. value object ako mat 3settery.
- leninzprahy
- Člen | 150
Používání magických metod, jak už název napovídá, je určitá magie, a přijde mi rozumné se tomu vyhnout, kdykoliv to jen jde.
A jak píše @newPOPE, není ani úplně šťastné pro každou entitu napsat/vygenerovat setry a getry pro všechny atributy.
Osobně se mi nejvíce osvědčil přístup, kdy metody pro čtení/zápis do entity píšu až ve chvíli, kdy je potřebuji.
Například entita uživatel, má atributy jméno a příjmení, ale všude se vypisuje celé jméno, takže entita má jen metodu
public function getFullName() {
return $this->firstName . ' ' . $this->lastName;
}
jestli se jmenuje getFullName
nebo jen fullName
už
záleží jen na konvenci
nebo pro úpravu jsou funkce
public function update($data) {
$this->firstName = $data->firstName;
$this->lastName = $data->lastName;
}
public function activate() {
$this->active = true;
}
public function deactivate() {
$this->active = false;
}
tento přístup navíc dovolí používat deklaraci návratových hodnot, což u magických metod nejde…