Czasami funkcje akcji w klasie kontrolera mogą stać się ogromne i nieprzyjemne, z wieloma wierszami kodu, aby po prostu kontrolować przepływ danych z modelu do widoku. W pewnym momencie te ogromne funkcje całkowicie tracą orientację w podstawowych zasadach dobrego kodu, tj. Robią tylko jedną rzecz, są małe, czytelne i łatwe do zarządzania itp.
Czy dobrą praktyką byłoby podzielenie tych ogromnych funkcji akcji na mniejsze funkcje prywatne w klasie kontrolerów, czy też potrzeba takiej optymalizacji oznacza, że powinniśmy raczej dodać je do modelu?
Głosowałbym za tym, by mniejsze funkcje były prywatne w kontrolerze, tak aby były względne w stosunku do akcji, ale słyszałem argumenty, że kontroler powinien być raczej prosty, podczas gdy model może stać się ogromny i zbity; i zastanawiałem się, która z nich byłaby najbardziej preferowaną metodą.
źródło
Najlepsza odpowiedź, jaką mogę udzielić, to zacytowanie wspaniałej książki Roberta Martina „Clean Code”, którą gorąco polecam wszystkim zainteresowanym tym tematem:
Nie mogę tego lepiej powiedzieć. Obowiązuje kolejny świetny cytat z tej samej książki:
Dzieląc kod na więcej funkcji, musisz nadać tym funkcjom sensowne nazwy, które mogą znacznie poprawić czytelność kodu. Nie trzeba dodawać, że wszystkie funkcje nieprzeznaczone do użycia poza klasą powinny być prywatne, aby można było łatwo ponownie użyć kodu poprzez dziedziczenie.
Jeśli kontroler ma teraz zbyt wiele funkcji, jest to znak, że prawdopodobnie robi zbyt wiele. Następnie możesz podzielić go na kilka niezależnych elementów lub spróbować przenieść niektóre funkcje do modeli, jak wspomniano w drugiej odpowiedzi. Również jeśli podążasz za nieklasycznym smakiem MVC, w którym Widoki mogą mieć pewną logikę, możesz umieścić tam niektóre swoje funkcje, kiedy tylko to pasuje.
źródło
W MVC staram się, aby mój kontroler był tak „cienki”, jak to możliwe, a moje modele były tak głupie, jak to możliwe.
Potrzebne funkcje logiczne i pomocnicze zostają umieszczone w osobnych, niezależnych klasach pomocniczych. To sprawia, że moje testowanie jest również znacznie łatwiejsze (testujesz ... prawda?: D) Testowanie kontrolerów jest niezwykle trudne, za każdym razem, gdy próbujesz utworzyć instancję kontrolera do przetestowania, musisz pomyśleć o kontekście HTTP i fałszowaniu http to i tamto, i to jest ból, ale celowo jest to ból. Potrzebujesz tych wszystkich rzeczy, ponieważ kontroler jest tak ściśle powiązany z HTTP i Internetem. Jest to punkt wejścia do Twojej aplikacji internetowej.
Funkcje logiczne i pomocnicze nie mają nic wspólnego z siecią. Są całkowicie agnostyczne dla środowiska (a przynajmniej powinny). To samo powinno ci powiedzieć, że nie należą do siebie w tym samym miejscu. Ponadto, jeśli wszystkie logiki aplikacji są ściśle powiązane z Internetem lub konkretną implementacją sieci, nigdy nie można zabrać go ze sobą.
Opracowaliśmy naszą witrynę MVC ze wszystkimi naszymi jednostkami bazy danych (nie naszymi modelami mvc, naszymi rzeczywistymi jednostkami db), naszą pamięcią, naszymi klasami pomocniczymi i naszą logiką w oddzielnych niezależnych bibliotekach DLL. Każdy z nas miał tylko jedną stronę internetową, ale i tak to zrobiliśmy.
Kilka miesięcy temu zostaliśmy poproszeni o utworzenie kilku aplikacji komputerowych, które są powiązane z kilkoma naszymi systemami dodatkowymi. Zrobiono to łatwo, ponieważ cały nasz przetestowany kod można łatwo ponownie wykorzystać. Gdybyśmy umieścili nasz kod w naszym projekcie internetowym lub w naszych kontrolerach, nigdy nie bylibyśmy w stanie tego zrobić.
źródło
Poza Dmitrijem Zaitsevem i świetnymi odpowiedziami kosmonautów nie wiem, czy poniższe informacje dotyczą również PHP: Powinieneś próbować unikać prywatnych metod z powodu braku możliwości automatycznego testowania.
Tak, możesz użyć metaprogramowania lub wstrzykiwania zależności również do testowania metod prywatnych, ale nie powinieneś tego robić, ponieważ ma to ogromny wpływ na czytelność twojego kodu.
Zawsze pamiętaj o zasadzie KISS: Prosto, głupio.
źródło