Toata lumea a auzit de acest principiu. Pe scurt fiecare obiect trebuie sa aibe o singura responsabilitate.
Problema apare la interpretare. Fiecare persoana poate sa inteleaga diferit cand ne referim la responsabilitate.
Din cate am vazut pana acuma exista doua moduri in care se poate implementa SRP:
- fiecare metoda publica expusa de catre o clasa reprezinta o responsabilitate unica;
- fiecare obiect ar trebui sa aibe o singura responsabilitate.
Daca ne folosim de prima varianta, ajungem sa avem sute de interfete si clase abstracte, fiecare cu o singura metoda. In cazul in care respectam a doua varianta apare problema la interpretare. Cum putem spune ca o clasa are o singura responsabilitate si doar una.
De exemplu daca avem o entitate la care vrem sa adaugam metoda ToXml() am putea spune ca este corect din punct de vederea a SRP. Dar mai tarziu poate am avea nevoie de metoda ToString(). Aceste doua metode violeaza SRP.
Din pacate aceasta discutie ar putea sa continue la nesfarsit. Trebuie gasita un echilibru.
Pentru exemplul dat mai sus putem sa adaugam o metoda To() care prin intermediul unui formater sa ne returneze obiectul in formatul pe care il dorim.
Referinte: http://www.objectmentor.com/resources/articles/srp.pdf
Problema apare la interpretare. Fiecare persoana poate sa inteleaga diferit cand ne referim la responsabilitate.
Din cate am vazut pana acuma exista doua moduri in care se poate implementa SRP:
- fiecare metoda publica expusa de catre o clasa reprezinta o responsabilitate unica;
- fiecare obiect ar trebui sa aibe o singura responsabilitate.
Daca ne folosim de prima varianta, ajungem sa avem sute de interfete si clase abstracte, fiecare cu o singura metoda. In cazul in care respectam a doua varianta apare problema la interpretare. Cum putem spune ca o clasa are o singura responsabilitate si doar una.
De exemplu daca avem o entitate la care vrem sa adaugam metoda ToXml() am putea spune ca este corect din punct de vederea a SRP. Dar mai tarziu poate am avea nevoie de metoda ToString(). Aceste doua metode violeaza SRP.
Din pacate aceasta discutie ar putea sa continue la nesfarsit. Trebuie gasita un echilibru.
Pentru exemplul dat mai sus putem sa adaugam o metoda To
Referinte: http://www.objectmentor.com/resources/articles/srp.pdf
Din pacate multi programatori nu au auzit de acest principiu.. Chestia cu o singura metoda publica per clasa e clar o exagerare - Robert Martin (cel care a formulat principiul sub acest nume) explica ca prin 'responsabilitate' intelege 'reason to change'.
ReplyDeleteMulte exemple care le da sunt voit exagerate un pic pentru a accentua ideea - ceea ce merita retinut din SRP e necesitatea de a evita aparitia de "god classes" care fac totul pentru toata lumea.
Doar cine a avut de lucrat cu astfel de clase de baza, care combinau totul de la UI, business logic pana la persistenta, cu sute de metode publice si zeci de mii de linii de cod intelege cu adevarat importanta principiului - problema nu e la clasele cu 2-3 metode ce tin de acelasi layer si acelasi domain concept..