Istnieje jedna nadrzędna zasada, która reguluje potrzebę refaktoryzacji i optymalizacji, zarówno w wodospadzie, jak i Agile: YAGNI (You Ain't Gonna Need It). Druga zasada jest następstwem pierwszej: „Przedwczesna optymalizacja jest źródłem wszelkiego zła”, kodującym odpowiednikiem ogólnego przysłowie „wrogiem doskonałości jest doskonałość”.
Weźmy progi i zastosujmy je. Wymagane jest zbudowanie algorytmu ETL, który pobiera plik określonego typu, wyodrębnia jego informacje, a następnie umieszcza te informacje w bazie danych. Twoim celem na ten tydzień (dla naszych celów nie ma znaczenia, czy jesteś w sklepie Agile, czy SDLC), jest to zrobić.
Jesteś sprytnym człowiekiem i dostrzegłeś duży obraz. Wiesz, że nie jest to jedyny typ pliku, dla którego projekt będzie wymagał ETL. Rozważamy więc implementację tego algorytmu ETL, aby działał on również na innym typie pliku, który ma tylko niewielkie różnice. Takie postępowanie naruszyłoby YAGNI. Twoim zadaniem nie jest opracowanie algorytmu dla tego innego pliku; ma opracować algorytm dla jednego pliku, który jest potrzebny do końca tygodnia. Aby osiągnąć ten cel i przejść testy akceptacyjne, musisz opracować ten algorytm i sprawić, by działał poprawnie. Nie będziesz potrzebował dodatkowego kodu, aby działał z innym plikiem. Możesz myśleć, że zaoszczędzi ci to czasu, aby włączyć go teraz, i możesz mieć rację, ale możesz także być w strasznym błędzie; algorytm dla drugiego pliku może wymagać użycia w obszarze systemu, w którym nie można użyć kodu lub wymagania dla nowego pliku mogą być inne niż dla twojego w sposób, którego nie znasz (w Agile, te wymagania mogą jeszcze nie istnieć). W międzyczasie zmarnowałeś czas i niepotrzebnie zwiększyłeś złożoność algorytmu.
Teraz jest w przyszłym tygodniu i jako wątpliwa nagroda za doskonałą pracę nad pierwszym algorytmem, otrzymałeś zadanie stworzenia algorytmów dla dwóch nowych typów plików. Teraz potrzebujesz dodatkowego kodu, aby Twój algorytm działał z większą liczbą plików. Możesz rozszerzyć istniejący algorytm za pomocą wzorca metody szablonowej, który będzie wykorzystywał podstawowy wzorzec z indywidualnymi krokami specyficznymi dla pliku, lub możesz po prostu uzyskać wspólny interfejs z istniejącego algorytmu, opracować dwa nowe, które podążają za interfejsem, i podłączyć je do obiekt, który może wybrać, którego algorytmu użyć.
Podczas opracowywania wiesz, że masz wymagania, aby system mógł przetwarzać 10 KB nieprzetworzonych danych na sekundę. Wykonujesz test obciążenia i okazuje się, że początkowy algorytm ciągu obsługuje 8 KB / s. Cóż, to nie przejdzie AAT. Spójrz i przekonaj się, że w twoim algorytmie jest struktura pętli złożoności O (mój Boże); usprawnisz go i uzyskasz 12 KB / s. „Całkiem nieźle”, myślisz, „ale jeśli miałbym tę kiepską pętlę w kodzie, co jeszcze mógłbym się ogolić?”. buzz Właśnie naruszyłeś zasadę „przedwczesnej optymalizacji”. Twój kod działa i spełnia wszystkie wymagania. Jesteś „skończony”, dopóki wymagania nie zostaną zaktualizowane i wymagają 15 KB / s. Jeśli i kiedy tak się stanie, to następnie ściągasz kod z powrotem i szukasz rzeczy do poprawy.
Postępuj zgodnie z tym prostym procesem podczas opracowywania, czy to w Agile, czy w tradycyjnych SDLC: „Przy pierwszym przejściu spraw, by działało. Przy drugim przejściu spraw, aby było ładnie. Przy trzecim przejściu spraw, aby było SOLID”. Oznacza to, że kiedy tworzysz wiersz kodu, spraw, aby kod działał poprawnie i bezbłędnie, ale nie zwracaj zbytniej uwagi na reguły projektowania w tym kodzie, jak na razie wiesz, że „ Nigdy więcej nie dotknę tego obszaru. Następnym razem, gdy odwiedzasz ten wiersz kodu, po prostu udowodniłeś, że się mylisz; nie jest to już jednorazowy element systemu. Przeprowadź refaktoryzację pod kątem czytelności, zwięzłości kodu i / lub zasad DRY (być może skopiowałeś jakiś kod, aby zrobić coś pięć razy; refaktoryzuj go w pętli i / lub wywołanie metody). Za trzecim razem, gdy pracujesz w tym wierszu kodu lub wokół niego,
O(my God)-complexity
jeśli nic więcej, rozśmieszyło mnie!