Porušuje Observer single responsibility princip? rubrika: Programování: Jiné

9 Vašek Ch.
položil/-a 25.10.2013

Třídím si myšlenky. Pokud dobře chápu, dle MVC by nějaká třída např. LoadingStatus, zachycující počet doposud načtených položek, patřila do modelu. Předpokládám, že hlavní zodpovědností této třídy by měla být schopnost uchovat daný počet položek (setItemCount()/getItemCount()). Zároveň ale model updatuje view, takže by tahle třída mohla být Observable a mohla by notifikovat všechny Observery, jakmile by někdo počet položek v ní updatnul. Neporušuje tohle ale single responsibility princip, že se nyní třída stará nejen o to, aby v sobě uchovávala data, ale zároveň i o to, aby updatovala všechny, kdo na těchto datech závisí?

odkaz Vyřešeno
9 Martin Mystik Jonáš
odpověděl/-a 26.10.2013
 
upravil/-a 26.10.2013

Ono totiž záleží co si označíme jako "zodpovědnost".

Pokud budeme SRP brát do extrému tak vznikne nesmyslný návrh s ohromným množstvím miniaturních tříd, které budou muset být složitě propletené aby vůbec vytvářely nějakou funkčnost. Téměř každou zodpovědnost můžeme vždycky popsat jako složenou z několika menších.

I Robert C. Martin definuje zodpovědnost jako "důvod ke změně třídy" ne jako "dělat jen jednu činnost". Není to tedy o tom aby třída dělala jen jednu věc, ale aby spíše obsahovala jen věci, které se mění společně a nějak souvisejí. Ostatně třída/objekt sám o sobě slouží právě k tomu aby seskupoval související funkce a data.

Z tohohle pohledu mi přijde lepší uvažovat spíše v rámci principu High Cohesion, což je de fakto jiná formulace SRP, a dát ho do kontrastu s principem Low Coupling.

Pokud tedy zodpovědnost třídy definujeme jako "udržuje pro aplikaci přehled o aktuálním stavu" tak v tom že o tento přehled propaguje přes Observer nevidím problém. Přesto, že "udržuje pro aplikaci přehled o aktuálním stavu" může zahrnovat několik souvisejících činností jde o jendu zodpovědnost.

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.