Na temat programowania rzeczy, które zostały już oprogramowane pisałem co najmniej raz. Opisałem wtedy mój przypadek, w którym głowiłem się nad algorytmem, którego implementację znalazłem potem w jednej z najpopularniejszych Javowych bibliotek. Długo zastanawiałem się, czy ponownie poruszać to ten temat. Zdecydowałem się na to po obejrzeniu kilku kolejnych code review, w których nagminnie trafiałem na wymyślanie tych samych rzeczy na nowo.

W każdym projekcie, z którym mamy do czynienia, prędzej, czy później pojawi się taki kod, który powtarza się nagminnie. Przykładem może być tu sprawdzenie w Javie, czy string jest niepusty: str != null && str.length() > 0. Kolejne pojawienie się takiej piękności powoduje (a przynajmniej powinno powodować), że automatycznie wyciągamy ten kod do jakiejś ogólnie dostępnej metody isNotEmpty(String str). Nie jest to problem nowy. Tego typu sprawdzania występują na tyle często, że w Javie powstało wiele dedykowanych bibliotek zajmujących się wyłącznie takimi rzeczami. Przykładem może być seria bibliotek Apache Commons.

Odkąd tylko pamiętam tego typu biblioteki zawsze znajdowały się w zależnościach projektów, nad którymi pracowałem. Niestety praktycznie tak samo długo, na co którymś code review pojawia się kod, napisany własnoręcznie, który robi dokładnie to samo co dedykowany kod znajdujący się gdzieś w projekcie. Przed napisaniem czegoś podobnego warto wesprzeć się wyszukiwarką w swoim IDE lub po prostu użyć Google’a i sprawdzić czy nie mamy już czegoś podpiętego do naszego projektu, co moglibyśmy śmiało użyć. W 90% przypadków podobnych do powyższego na pewno coś się znajdzie 🙂

Pół biedy, jeżeli kod będzie podobny do powyższego, bo w najgorszym przypadku, oprócz tworzenia niepotrzebnych duplikacji, tracimy na niego kilka minut. Kiedyś zdarzyło mi się jednak, że znajomy, początkujący programista poprosił mnie o drobne przejrzenie jego programu. Był tam kod wykorzystujący metodę readValue(String content, Class valueType), do której autor dzielnie przekazywał content, który ręcznie wyciągał na podstawie posiadanego URL-a. Nawiązywał tam połączenie HTTP, otrzymywał input stream i czytał z niego tworząc finalnego stringa. Kod działał, ale posiadał kilka mankamentów. Podejrzewam, że poświęcił na niego kilka godzin, a żeby go dopracować i zabezpieczyć musiałby poświęcić jeszcze trochę czasu. Co mógł zrobić zamiast tego? Lepiej sprawdzić dokumentację API i nie fiksować się na to jedno rozwiązanie jakby to była jedyna opcja. Trzy metody niżej miał bowiem: readValue(URL src, Class valueType), która robiła dokładnie to o czym myślał.

Use the Source, Dude! If you know what I mean.