Jaki jest limit liczby metod klasowych?

22

W różnych książkach projektowych, które czytam, czasami duży nacisk kładzie się na liczbę metod, które musi mieć klasa (biorąc pod uwagę język OO, na przykład java lub C #). Często przykłady podane w tych książkach są bardzo schludne i proste, ale rzadko dotyczą „poważnego” lub złożonego przypadku.
Jednak wydaje się, że zakres wynosi od 5 do 8.

W projekcie opracowałem klasę „Notatka”, której atrybutem są właściwości: Tytuł, Opis, CreateDate itp.
Następnie kilka podstawowych metod, takich jak: getRelations (jeśli notatka jest przypisana do różnych dokumentów), getExpiryDate, ect.

Jednak w dalszym rozwoju aplikacji wymagana była większa funkcjonalność, a zatem więcej metod.

Wiem, że im mniej metod ma klasa, tym bardziej jest ona luźno powiązana. Jest to rzeczywiście dobra zaleta pod względem modułowości i możliwości ponownego użycia, a także łatwiejsza do edycji.
Nawiasem mówiąc, jeśli w naszym kontekście nie ma potrzeby (ani nawet nie ma sensu) tworzenia podklas, a wszystkie potrzebne funkcje są powiązane z tą klasą, to ile metod możemy dalej dołączyć?

Zgadzam się, że mając ponad 15 metod, być może może być konieczne trochę przeprojektowanie.
Ale nawet w takim przypadku, jeśli usunięcie niektórych metod lub dziedziczenie nie jest opcją, jaki byłby właściwy sposób?

Francesco
źródło
3
Wydaje się, że ludzie mają wbudowany zasięg zapomnienia. Po przejściu przez siedem opcji pierwsze kilka zaczyna być zapominane. Więc nie dawaj ludziom więcej niż 7 opcji na interfejs.
Martin York,
+ 1 @ Martin- 7 +
lub-
To ograniczenie dotyczy tylko pamięci krótkotrwałej. W przeciwnym razie, jak moglibyśmy zapamiętać te wszystkie litery i słowa? Poważnie, jeśli klasa będzie intensywnie wykorzystywana, możesz myśleć o niej jako o mini-języku i mieć tyle metod, ile potrzebujesz, aby wyrazić, co masz z tym wspólnego.
artem

Odpowiedzi:

30

Masz tyle metod, ile potrzebujesz. W miarę możliwości starałbym się ograniczyć liczbę metod publicznych do tej reguły 5-8. Szczerze mówiąc, większość ludzi ma odwrotny problem polegający na tym, że mają szalone super-metody, które należy bardziej i nie mniej. Naprawdę nie ma znaczenia, ile masz metod prywatnego pomocnika. W rzeczywistości, jeśli pozostaniesz poniżej 8 metod w Javie, możesz przekroczyć granicę z klasą, która ma tylko konstruktor, toString i getter / setter dla 3 właściwości ... co nie jest dokładną klasą. Najważniejsze jest to, nie martw się o to, ile metod jest twoja klasa. Martw się, aby twoja klasa nie zajęła się niepowiązanymi obawami i że masz rozsądny publiczny interfejs, który ma łatwe do zrozumienia metody.

Morgan Herlocker
źródło
Prawidłowo, ale jeśli jest to klasa użyteczności, do 10-15 jest w porządku.
Sid
1
@SidCool - Nie mówię, że nigdy ich nie używam, ale klasy użyteczności nie są tak naprawdę najlepszą praktyką na początek. Zazwyczaj są tylko mini-klasą boga, która łączy kilka niepowiązanych ze sobą obaw. Mając to na uwadze, klasa użyteczności naprawdę nie powinna istnieć, a tym bardziej z 15 metodami.
Morgan Herlocker
1
Moja klasa „Uwaga” nie jest klasą użytkową. Reprezentuje obiekt biznesowy (notatkę, która może dodawać komentarze i opisy do dokumentu). Zgadzam się jednak z ironcode w sprawie niebezpieczeństwa klas „użytkowych”. Pomagają nam, gdy spieszymy się z terminami dostaw, ale myślę, że często istnieje dla nich lepsze rozwiązanie / projekt.
Francesco
13

Odpowiedź jest naprawdę prosta: umieść wszystko w klasie, która należy do jego obowiązków, ale bądź ostrożny przy przydzielaniu obowiązków.

Czasami duża klasa składa się z mniejszych klas o różnych obowiązkach.

Ogólnie rzecz biorąc, staram się podzielić obowiązki na mniejsze klasy, gdy klasa staje się niewygodna w użytkowaniu lub konserwacji. Rzadko mam klasy dłuższe niż 500 linii. Moje największe klasy mają około 1,5 tys. Lokalizacji.

Po prostu nie można podać ogólnej reguły, takiej jak: „klasa powinna mieć metody n im”.

Sokół
źródło
8

Nie ma powodu (w projektowaniu OO) posiadania tak wielu metod. Nie jest również prawdą, że klasa z mniejszą liczbą metod jest lepiej oddzielona.

Spójrz na przykład na klasę java.lang.String. Wiele metod, ponieważ istnieje tak wiele rzeczy, które można zrobić za pomocą łańcucha. Niemniej jednak nie jest silnie sprzężony.

Zastanawiam się, dlaczego magiczna liczba, taka jak 15, może oddzielić dobry i zły projekt. Nie, to nie jest takie proste.

Ingo
źródło
Zgadzam się, liczba 15 była jedynie przybliżeniem wynikającym z czytania książek o projektowaniu (jako „Code Complete” Stevena McConnella, na przykład). Rzeczywiście klasa String ma miriadę metod i wszystkie są powiązane z tym samym bytem.
Francesco
@Luca: Problem z niektórymi z tych książek polega na tym, że przykłady są często wymyślone, a zatem mniejsze niż wiele przykładów z realnego świata.
FrustratedWithFormsDesigner
Dokładnie ... najprawdopodobniej po to, aby koncepcje były bardziej przejrzyste i aby zwiększyć potencjalną bazę nabywców ...
Francesco
Chcę zobaczyć dowolną kontrolę DataGrid lub nawet interfejsu użytkownika za pomocą tylko 15 metod. Jeśli podzielisz te klasy na mniejsze, interfejs stanie się koszmarem.
Falcon,
6

W PMD domyślnym zachowaniem reguły TooManyMethods jest identyfikacja i oflagowanie klas za pomocą 10 lub więcej metod jako potencjalnych błędów. To jednak tylko dowolna liczba. Można to łatwo zmienić w konfiguracji. Niezależnie od tego, jaka jest ta liczba, to tylko flaga dla programisty, aby spojrzeć na klasę i sprawdzić, czy jest jakiś problem, a nie to, że jest z tym problem.

Coś, co jest nieco bardziej konkretne, może być regułą 7 plus / minus 2 . Stwierdza to, że ludzki umysł może przechowywać i rozumieć od 5 do 9 „obiektów” w pamięci. Podczas czytania określonej klasy obiektami najprawdopodobniej byłyby metody i pola, które składają się na tę klasę. Jednak zajęcia często mają więcej niż 9 pól i metod, nawet jeśli nie liczyć akcesorów, mutatorów i wszelkie standardowe operacje (na przykład toString(), hashCode()i equals()w Javie).

Najbardziej odpowiednie środki to wachlowanie i wachlowanie oraz dyskusje na temat powiązań i spójności . Należy zastosować zasadę pojedynczej odpowiedzialności i rozdzielić obawy - klasa powinna zrobić lub reprezentować jedną i jedną rzecz sama. Są one znacznie lepsze niż próby przypisania liczb do maksymalnej / minimalnej liczby metod podczas oceny projektu lub implementacji.

Thomas Owens
źródło
+1 - reguła 7 + -2 jest zasadą, zgodnie z którą użyteczność jest ważna.
Morgan Herlocker