Refaktoryzator wprawny zmienia kodu smak … w wytrawny.
Zapewne każdy profesjonalny programista zna zasadę DRY, której nazwa jest zarazem skrótem jej treści Don’t Repeat Yourself czyli zalecenia Nie Powtarzaj Się. Najczęściej stosuje się ją, by przeciwdziałać powielaniu kodu wykonującemu tę samą czynność (czy to przez jego niepotrzebne, ponowne napisanie czy też przez zwykłe przeklejanie).
To co ciekawego w tej regule, to fakt, że w swej treści skierowana jest ona do programisty. Jakiegoś programisty. Pojedynczego programisty. Powinien on w ramach pisanego przez siebie kodu unikać powtórzeń. Rzecz w tym, że oprogramowanie zazwyczaj piszą zespoły programistów i nie do uniknięcia jest sytuacja, kiedy dwóch programistów napisze ten sam kod. Ot choćby usuwanie zawartości folderu wg zadanej maski nazw plików. Być może inny programista dołoży do tego rekurencyjne usuwanie plików także w podfolderach. Niemniej będzie to prawie ten sam kod, który można by sprowadzić do jednej postaci, a następnie wykorzystać w kodzie obu programistów oraz kodzie kolejnych, o ile tylko będą musieli usunąć jakieś pliki.
Aby jednak możliwe było odkrycie powtarzającego się kodu konieczne jest albo ciągłe pytanie pozostałych członków zespołu „czy ktoś napisał może …” (co samo w sobie może być denerwujące nawet w małym zespole – te wyrywające ze skupienia pytania rzucane w eter), albo odkrycie powtórzeń w inny sposób, np. poprzez przeglądy kodu. Warto jednak zwrócić uwagę na fakt, że przeglądy nie muszą tego kodu w ogóle wyłapać, bo przeglądający musiałby natrafić na oba wystąpienia kodu, co nie wydaje się takie prawdopodobne. O wiele szybciej może natomiast wyłapać to lider zespołu, jeśli wydzielił sobie czas na przeglądanie zmian wprowadzanych do repozytorium.
W tym momencie warto zrobić sobie malutką dygresję. Czy rzeczywiście powtórzenia są aż tak niewskazane? W większości przypadków tak – reguła DRY nie wzięła się z chęci zaistnienia jej autorów, ale z konkretnych korzyści jakie niosła. Niemniej, jak to już w życiu bywa, istnieje pewne, niewielkie spektrum przypadków, kiedy taka powtarzalność może być akceptowalna. Ot choćby dlatego, że kod jest krótki (trudno w nim coś tak naprawdę spieprzyć), jego zasięg zamyka się w danej klasie, a dzięki jego powtórzeniu, ta tworzy niezależną od innych bytów całość. Tu wszakże należy uczynić zastrzeżenie w danej chwili, bowiem za jakiś czas – jak to z oprogramowaniem bywa – kod ulegnie zmianie, a wówczas początkowe warunki, które przemawiały na korzyść powtórzenia, zostaną uszczuplone – ergo – przestaną zachowaniu powtórzenia sprzyjać.
Jak widać zasada DRY powinna i ma większy zasięg niż pojedynczy programista. Czy zatem jej zasięg to cały kod oprogramowania? Hm…, ale którego? Tego konkretnie teraz tworzonego? Czy może także tego stworzonego wcześniej i tego, które kiedyś napiszemy? Dokładnie tak! Im szerszy będzie miała zasięg, tym większe może przynieść korzyści, ale … istnieje pewna granica, poza którą nie ma już korzyści. Zazwyczaj granicę tę wyznacza opłacalność zarządzania tak dużym zbiorem kodu. W momencie kiedy to zarządzanie (czyli, w jakimś przybliżeniu, szukanie powtórzeń) zacznie być uciążliwe, oznaczać to będzie osiągnięcie wspomnianej granicy.
No dobrze – myśli sobie pewnie w tej chwili niejeden czytelnik – ale o co chodzi z tą „wytrawnością” kodu ;). Otóż są dwa podstawowe znaczenie słowa dry: suchy i wytrawny. Przeglądając ostatnio kod jednego z naszych projektów skonstatowałem, że są właściwie dwa poziomy powtarzalności kodu: taki oczywisty, gdzie widać, że kod robi to samo, bo używa tych samych klas, metod, mechanizmów, różni się najwyżej nazwami zmiennych, właściwości, metod. I wyłapywanie takich powtórzeń można sobie żartobliwie nazwać „osuszaniem” kodu ;). Jest jednak drugi rodzaj powtarzalności, który nie jest już tak oczywisty. To wyłapywanie pewnych abstrakcji – kodu, który na pierwszy rzut oka nie wydaje się identyczny, ale ma podobieństwo pewnych realizowanych czynności. Nie jest to już zatem zwykłe stwierdzenie „gdzieś to już widziałem„, ale bardziej „coś mi to przypomina, z czymś się kojarzy„. Takie wyłapywanie powtórzeń kodu, to nadawanie mu „wytrawnego smaku” ;).
Takie oto jesienne przemyślenia sfrunęły na mnie wraz z ostatnimi liśćmi z drzew :D.