Rozglądając się wcześniej, zauważyłem kilka uwag na temat złych praktyk będących długimi metodami.
Nie jestem pewien, czy zawsze zgadzam się, że długie metody są złe (i chcieliby opinii innych).
Na przykład mam kilka widoków Django, które przetwarzają obiekty przed wysłaniem ich do widoku, przy czym długa metoda to 350 linii kodu. Mam napisany kod, który zajmuje się parametrami - sortowaniem / filtrowaniem zestawu zapytań, a następnie krok po kroku wykonuje pewne przetwarzanie na obiektach, które zwróciło moje zapytanie.
Przetwarzanie jest więc głównie agregacją warunkową, która ma wystarczająco złożone reguły, których nie można łatwo wykonać w bazie danych, więc mam pewne zmienne zadeklarowane poza główną pętlą, a następnie zmienione podczas pętli.
variable_1 = 0
variable_2 = 0
for object in queryset :
if object.condition_condition_a and variable_2 > 0 :
variable 1+= 1
.....
...
.
more conditions to alter the variables
return queryset, and context
Tak więc zgodnie z teorią powinienem rozłożyć cały kod na mniejsze metody, aby mieć metodę wyświetlania jako maksymalnie jedną stronę.
Jednakże, pracując w przeszłości na różnych podstawach kodu, czasami okazuje się, że kod ten jest mniej czytelny, gdy trzeba ciągle przeskakiwać z jednej metody do drugiej, obmyślając wszystkie jej części, zachowując przy tym najbardziej zewnętrzną metodę.
Uważam, że mając długą metodę, która jest dobrze sformatowana, możesz łatwiej zobaczyć logikę, ponieważ nie ukrywa się ona w wewnętrznych metodach.
Mógłbym rozdzielić kod na mniejsze metody, ale często stosuje się wewnętrzną pętlę dla dwóch lub trzech rzeczy, więc spowodowałoby to bardziej złożony kod lub metody, które nie robią jednej rzeczy, ale dwie lub trzy (alternatywnie Mógłbym powtarzać wewnętrzne pętle dla każdego zadania, ale wtedy będzie hit wydajności).
Czy jest więc przypadek, że długie metody nie zawsze są złe? Czy zawsze istnieje uzasadnienie dla metod pisania, gdy będą one używane tylko w jednym miejscu?
AKTUALIZACJA: Wygląda na to, że zadałem to pytanie ponad rok temu.
Ponownie przebudowałem kod po (mieszanej) odpowiedzi tutaj, podzieliłem go na metody. Jest to aplikacja Django pobierająca złożone zestawy powiązanych obiektów z bazy danych, więc argument testowy jest wyłączony (prawdopodobnie zajęłoby to większą część roku, aby utworzyć odpowiednie obiekty dla przypadków testowych. Mam typ „tego wymagano wczoraj” środowisko pracy, zanim ktokolwiek narzeka). Naprawianie błędów w tej części kodu jest teraz marginalnie łatwiejsze, ale nie tak ogromne.
przed :
#comment 1
bit of (uncomplicated) code 1a
bit of code 2a
#comment 2
bit of code 2a
bit of code 2b
bit of code 2c
#comment 3
bit of code 3
teraz:
method_call_1
method_call_2
method_call_3
def method_1
bit of (uncomplicated) code 1a
bit of code 2a
def method_2
bit of code 2a
bit of code 2b
bit of code 2c
def method_3
bit of code 3