Nette 3.0 a final classy / metody
- artvandal
- Člen | 6
Ahoj vsichni,
prevadim pomerne velky projekt na novou verzi nette, a nejvetsi pain je pro me spousta final trid a metod. Mohl byste mi prosim nekdo, kdo o tom neco vi, vysvetlit v cem je ten prinos? Mne to zatim prijde jen ochrana proti pouzitelnosti. Uz jednou tam final keywordy byly a David je pak smazal (a je pravda, ze nejspis proto, ze jsme na ne dost picovali:)). Mam ted problem s mockovanim v testech, musim duplikovat zbytecne kod a nektere veci nejsem schopny nahradit vubec.
Diky za odpoved
- artvandal
- Člen | 6
Prave ze jsem nechtel zabihat do podrobnosti, zajimalo me to obecne.
Jeden priklad za vsechny, mame pretizeneho Nette\Security\Usera, krome identity v nem mame jeste DB entitu. A meli jsme i pretizeny logout(). V pripade ze se vymazavala identita, vymazavali jsme i entitu. A to ted nejsem schopny udelat. Sice je tam callback onLoggedOut, ale ten nereflektuje vstupni promenou, takze musim entitu vymazavat vzdy.
A pri mockovani: je final metoda isLoggedIn() takze uz ji nemuzu pretizit a vracet si v testech co potrebuji. Musel jsem udelat workaround, ze mocknu IUSerStorage a vracim si hodnotu v isAuthenticated(). Jde to, ale …
Framework pouzivam, protoze mi zjednodussuje praci. Final keywordy mi ji ale zeslozituji, a ja uplne nechapu proc. Proto se ptam. Diky:)
Editoval artvandal (17. 6. 2020 9:36)
- David Grudl
- Nette Core | 8227
Pokud tě to zajímá čistě obecně, tak final metody a třídy usnadňují život tvůrcům, protože ví, které třídy nikdo nedědí a které metody nepřepisuje, takže jim mohou měnit signaturu apod a není to BC break.
- CZechBoY
- Člen | 3608
No tak on je BC break, kterej uděláš tím, že změníš signaturu a
někdo tu metodu dědí. Potom je ještě BC break že někdo tu metodu volá a
když změníš signaturu tak ji může volat špatně (špatný typ
parametrů/return typ/málo/hodně parametrů záleží na konkrétní
změně).
Takže ve výsledku mi není moc jasný čemu se tím pomůže.
- David Grudl
- Nette Core | 8227
@CZechBoY určitě existují tisíce článků, které ti to vysvětlí podrobně a přesně. Zkrátka bez final bych měl při vývoji hodně svázané ruce a uživatelé by si stěžovali na BC breaky.
- artvandal
- Člen | 6
David Grudl napsal(a):
@CZechBoY určitě existují tisíce článků, které ti to vysvětlí podrobně a přesně. Zkrátka bez final bych měl při vývoji hodně svázané ruce a uživatelé by si stěžovali na BC breaky.
tak uprimne, BC breaku je tam i tak dost:) ale tim ze jsou tam i ty finaly, tak je to jeste horsi, protoze s BC breakem si poradit dokazes, proste to prepises, pres final se ale nedostanes. Chapu tvuj smer pohledu, z hlediska vyvojare frameworku, ale z hlediska uzivatele FW jsou tom klacky pod nohy, ktere ztezuji vyvoj a testovani
A obalky nekdy pomuzou, ale vzhledem ke striktnim navratovym typum ne vzdycky. Tohle nesouvisi s final keywordem, ale je to na tom hezky videt. metoda Session::getSection() sice umi prijmout objekt, ktery ma vratit, ale ted musi vracet potomka nette SessionSection. Coz je sice hezke, ale ta ma vetsinu propert private bez getteru a setteru, takze se k nim nedostanu. Meli jsme vlastni implementaci SessionSection, a to ted uz mit nemuzeme.
- David Grudl
- Nette Core | 8227
BC breaky jsou jenom mezi velkými verzemi a (snad) dokumentované, nevím o jiných. Máš nějaké konkrétní na mysli? Samozřejmě chyby se stávaj, ale tvrdit že „je jich tam dost, tak proč to vůbec řešit“ mi připadá mimo.