Jak rozróżnić "funkcjonalności" w aplikacji? Co znaczy że klasa ma mieć jedną odpowiedzialność? Co znaczy że "Nigdy nie powinno być więcej niż jednego powodu do modyfikacji klasy"?
Niby proste pytanie ale wszystko da się praktycznie ująć jako pojedynczą funkcjonalność albo rozbić na wiele. "Powód" tak samo można dowolnie rozbijać na mniejsze powody lub ogólnikowo opisać wiele powodów jako jeden
Przykładowo mamy klasę która czyta i zapisuje do bazy danych - czy spełnia SRP?
Tak, bo klasa zajmuje się dostępem do bazy danych (jedna odpowiedzialność)
Czy może
Nie, bo klasa zajmuje się zapisem i odczytem z bazy (dwie odpowiedzialności)
Załóżmy że klasa tylko odczytuje z bazy, czy spełnia SRP?
Tak, bo tylko zajmuje się odczytem?
Czy może
Nie, bo odczytuje z kilku tabel / Nie, bo jest odpowiedzialna za odczyt pojedynczego rekordu lub listy rekordów / Nie, bo zajmuje się pobieraniem danych i ich agregacją?
Powód do zmiany jest:
Jeden - gdy zmieni się struktura bazy
Kilka - bo wymagana jest zmiana gdy zmieni się nazwa tabeli / nazwa kolumny lub silnik bazy danych?
Jak rozumieć "odpowiedzialność" i "powód"? Każdą odpowiedzialność można rozbić na nieskończenie mniejszych, tak samo z powodem