Nette 3.0 a final classy / metody

artvandal
Člen | 6
+
0
-

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

Jan Endel
Člen | 1016
+
0
-

Ahoj,

můžeš být trošku konkrétnější? Co chceš testovat, v čem ti final keyword překáží?

Díky

artvandal
Člen | 6
+
0
-

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)

CZechBoY
Člen | 3608
+
+1
-

Proc si neudelas obalku toho Usera?

David Grudl
Nette Core | 8139
+
+5
-

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

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 | 8139
+
+2
-

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

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 | 8139
+
+1
-

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.