Kdyby\Doctrine a MagicAccessors – používat, nebo ne?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
chikeet
Člen | 160
+
0
-

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
+
0
-

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
+
+3
-

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
+
+4
-

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…