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