Traits a jejich používání rubrika: Programování: PHP
Ahoj,
píšu knihovnu pro generování php kódu a mám třídu pro generování atributů a třídu pro generování metod a obě třídy mají atribut visibility. Abych nemusel v obou třídách psát atribut, gettery (isPublic, isProtected, isPrivate) a settery, tak jsem si pro to vytvořil Trait, který obě třídy používají.
Co si myslíte o používání Trait obecně a v tomhle konkrétním případě?
Vyřešili by jste to případně nějak jinak? Vložili by jste do nich třídu místo Traitu a delegovali na ní volání?
Díky za odpovědi.
S malym odstupem na pochopeni toho API bych volil asi moznost nechat tridu na generovani atributu a tridu na generovani metod, at se o vygenerovani visibility staraji samy. Na jejich public rozhrani nebudou ani isPublic
/isPrivate
/isProtected
, ani getter na nejaky objekt Visibility
, ktery by ty tri metody obsahoval.
Pokud vystupem obou trid ma byt vygenerovany atribut nebo metoda, at je vygenerovany uz s visibilitou, aniz by se na ni musel volajici dotazovat explicitne. Interne si to muze ta trida resit jak chce - muze to byt skutecne nejaka instance Visibility
, nebo to muze byt trait ciste pro code reuse, nebo protected metody base class. Je to jedno, protoze konzument tech trid by o tom ani nemel vedet.
Klicova myslenka pro tenhle design je vyhybani se "chatty interfaces", tzn. chci na instanci zavolat jednu vec a jen jednou, ne se s ni bavit pres nekolik method callu, abych se ja rozhodoval, co ma vlastne delat.
V hypotetickem pripade, ze treba metoda dostane nejaky novy visibility mod (treba neco jako internal/package-private), staci to pak zmenit v implementaci te tridy (nebo jeste lip v implementaci injectnute Visibility
) namisto zmeny kazdeho pouziti napric vsemi projekty.
Komentáře
- Taco : Tímhle přístupem a postupným refactoringem se dostaneš k AST :-) — 15.11.2016
- Honza Břešťan : Kdyz se to aplikuje na vsechno, tak jo - ono taky jak jinak to obecne generovat nez traverzovanim AST. S tim refactoringem se to ale nemusi hrotit, jen mi to v tomhle pripade prijde jako moznost, jak vyresit predlozeny design problem a zaroven zjednodusit interakci mezi objekty, coz je win-win. — 15.11.2016
Pro zobrazení všech 7 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře