Masz rację - kopiuj-wklej działa świetnie, a DRY nie ma sensu, kiedy Twoim zadaniem jest stworzenie programu, dla którego skopiowany szablon lub kopia nie będzie musiała być utrzymywana ani rozwijana w przyszłości. Kiedy te dwa komponenty oprogramowania mają zupełnie inny cykl życia, to połączenie ich razem poprzez przefakturowanie wspólnego kodu do wspólnej biblioteki lib, która sama jest w fazie intensywnego rozwoju, może rzeczywiście mieć nieprzewidywalne efekty. Z drugiej strony, podczas kopiowania sekcji kodu w jednym programie lub systemie programowym, wszystkie te części zwykle mają taki sam cykl życia. Zilustruję poniżej, co to oznacza DRY i zarządzanie projektami.
Poważnie, istnieje wiele takich programów: na przykład przemysł gier komputerowych produkuje wiele programów, które muszą być utrzymywane przez krótki okres maksymalnie kilku miesięcy lub roku, a kiedy ten czas się skończy, kopiowanie i wklejanie stary kod z poprzedniej gry, w której okres konserwacji został przekroczony, w bazie kodu nowej gry jest całkowicie w porządku i może przyspieszyć.
Niestety cykl życia większości programów, z którymi miałem do czynienia w ciągu ostatnich lat, różni się bardzo od tego. 98% wymagań lub zgłoszeń o naprawę błędów, które do mnie dotarły, to żądania zmianydla istniejących programów. I ilekroć musisz zmienić coś w istniejącym oprogramowaniu, „zarządzanie projektami” lub planowanie działa najlepiej, gdy twoje wysiłki związane z testowaniem i debugowaniem są dość niskie - co nie będzie miało miejsca, jeśli zmienisz coś w jednym miejscu, ale z powodu kopiowania - wklejona logika biznesowa łatwo zapominasz, że musisz zmienić kilkanaście innych miejsc w bazie kodu. I nawet jeśli uda ci się znaleźć wszystkie te miejsca, czas na ich zmianę (i przetestowanie zmian) jest prawdopodobnie znacznie dłuższy, jakbyś miał tylko jedno miejsce do zmiany. Nawet Ty możesz dokonać dokładnego oszacowania zmiany, a koszty kilkanaście razy wyższe, niż trzeba, mogą z łatwością kolidować z budżetem projektu.
TLDR - za każdym razem, gdy tworzysz program, w którym nie ma potrzeby ani odpowiedzialności za naprawianie błędów i konserwację oryginału lub kopii, możesz ją skopiować. Ale jeśli Ty, Twój zespół lub firma jest lub może stać się odpowiedzialna, stosuj SUCHE, gdy tylko możesz.
Przykład
Jako dodatek pozwól mi wyjaśnić, co oznacza „naprawianie błędów i konserwacja” oraz jak prowadzi to do nieprzewidywalności w planowaniu, szczególnie w obrębie jednego produktu, na przykładzie z prawdziwego świata. Rzeczywiście widziałem, jak tego rodzaju rzeczy dzieją się w rzeczywistości, prawdopodobnie nie w 100 przypadkach, ale problemy mogą się nawet rozpocząć, gdy masz tylko jedną zduplikowaną instancję.
Zadanie: utwórz 100 różnych raportów dla aplikacji, każdy raport wygląda bardzo podobnie, pewne różnice wymagań między raportami, inna logika, ale w sumie niewiele różnic.
Twórca, który otrzymuje to zadanie, tworzy pierwsze (powiedzmy, że zajmuje to 3 dni), po pewnych zmianach lub drobnych poprawkach z powodu kontroli jakości i kontroli klienta zakończonej, wydaje się, że działa dobrze. Następnie zaczął tworzyć następny raport, kopiując-wklejając i modyfikując całość, a następnie następny i dla każdego nowego raportu potrzebuje średnio ~ 1 dnia. Bardzo przewidywalne, na pierwszy rzut oka ...
Teraz, gdy 100 raportów jest „gotowych”, program przechodzi do rzeczywistej produkcji i pojawiają się pewne problemy, które zostały przeoczone podczas kontroli jakości. Być może występują problemy z wydajnością, może raporty regularnie się zawieszają, a może inne rzeczy nie działają zgodnie z przeznaczeniem. Teraz, kiedy zastosowano zasadę DRY, 90% tych problemów można rozwiązać, zmieniając bazę kodu w jednym miejscu. Ale ze względu na podejście kopiuj-wklej problem musi zostać rozwiązany 100 razy zamiast raz. A ze względu na zmiany już zastosowane z jednego raportu do drugiego, deweloper nie może szybko skopiować i wkleić poprawki dla pierwszego raportu do drugiego 99. Musi przejrzeć wszystkie 100 raportów, przeczytać je, przetłumaczyć zmianę na zmodyfikowany zgłoś, przetestuj i może debuguj każdy z nich osobno. Dla premiera zaczyna to być naprawdę trudne - może oczywiście poświęcić czas na „zwykłą” naprawę błędu (powiedzmy 3 godziny) i pomnożyć to przez 100, ale w rzeczywistości jest to prawdopodobnie błędna ocena, niektóre poprawki mogą być łatwiejsze do wykonania niż inne, inne mogą być trudniejsze. I nawet jeśli ta ocena jest prawidłowa, koszt debugowania 100 razy wyższy, niż trzeba, będzie kosztować firmę dużo pieniędzy.
To samo stanie się następnym razem, gdy klient poprosi o zmianę koloru emblematu swojej firmy we wszystkich tych raportach, o skonfigurowanie rozmiaru strony lub o inne nowe wymagania, które wpływają na wszystkie raporty w podobny sposób. Jeśli tak się stanie, możesz oszacować koszty i obciążyć klienta 100-krotnością ceny, którą musiałby zapłacić, gdy kod był SUCHY. Spróbuj to jednak kilka razy, a następnie klient anuluje projekt, ponieważ prawdopodobnie nie będzie skłonny pokryć twoich wygórowanych kosztów rozwoju. I może w tym momencie ktoś zadaje pytanie, dlaczego tak się stało, i wskazuje palcem osobę, która podjęła decyzję dotyczącą programowania kopiowania i wklejania.
Chodzi mi o to: kiedy tworzysz oprogramowanie dla innych, zawsze masz przynajmniej na krótki czas odpowiedzialność za stworzenie rzeczy, naprawienie błędów, dostosowanie programu do zmieniających się wymagań itp. Nawet w projekcie typu green-field te są części mogą szybko zsumować znacznie więcej niż początkowo planowane prace rozwojowe. A zwłaszcza, gdy cały twój wklejony kod znajduje się w jednym produkcie, okres odpowiedzialności jest taki sam dla wszystkich części, co jest zupełnie inne niż sytuacja, w której skopiowałeś starszy kod z martwego projektu, który już nie jest w ramach czynnej konserwacji.