Siekierka służy na wyrębach. Nie służy do dłubania w zębach.
Swojego czasu zachwalałem wytrawność kodu i zapraszałem do jego degustacji. Pocieszające jest, że nikt z tego powodu nie był zdegustowany, a wręcz przeciwnie – niektórych zainspirowałem. Nie ukrywam, że lubię być inspiracją ;), a już uwielbiam, kiedy wynikiem tejże inspiracji jest z kolei zainspirowanie mnie. Nic tak bowiem nie pomaga poszerzaniu wiedzy, jak wymiana poglądów. W przypadku, który mam zamiar omówić, moja inspiracja jest podwójna. Na razie jednak skupię się na jednym jej aspekcie. Krzysztof Morcinek, uzupełniając moje dywagacje na temat DRY, użył pewnego – zdaję sobie sprawę, że dość uproszczonego – przykładu. Ten jednakże przypomniał mi pewne obserwacje, które kiedyś poczyniłem, a które często wyrażane są stwierdzeniami „wytaczanie armaty na muchę” lub takim, jak ten z tytułu niniejszego wpisu.
Krótko mówiąc, chodzi o użycie narzędzia, niekoniecznie przeznaczonego do zadania, które mamy wykonać. Krzysztof użył następującego przykładu:
string combine = System.IO.Path.Combine("content", "color", "red"); string replace = combine.Replace('\\', '_');
który był fragmentem metody łączącej pewne słowa w całość za pomocą znaku podkreślenia. Jak widać (i na co zwrócono uwagę w komentarzach), nie jest to najszczęśliwszy wybór metody do łączenia słów. O ile przykład – w kontekście tego, na co uwagę zwracał Krzysztof – miał na celu pokazanie pułapek refaktoryzowania kodu w oparciu o DRY, o tyle okazał się na tyle pojemny, że unaocznił także nieuzasadnione użycie narzędzia, do celu, do którego nie zostało pomyślane.
I to właśnie chciałbym uwypuklić w moim wpisie, albowiem trafiam raz na jakiś czas na takie przypadki. Najczęściej wynikają one z braku wiedzy (no ale kto zna na pamięć całą bibliotekę .NET ręka do góry – Babciu – znowu wszystko zepsułaś ;)) oraz braku czasu na jej uzupełnienie.
Z jednym z takich przypadków spotkałem się kiedyś na forum codeguru.geekclub.pl. Pytając miał za zadanie wygenerowanie wszystkich kombinacji cyfr 0 i 1 umieszczonych w ciągu 9-cio pozycyjnym. Do celów rozwiązania postanowił użyć LINQ. Wystarczyło jednak rzucić okiem na odręcznie przygotowaną listę kilku kombinacji: 000000001, 000000010, 000000011, 000000100, aby zobaczyć typowy przykład reprezentacji binarnej liczb. Nie potrzeba zatem żadnego LINQ, które będzie odszukiwać w tablicy czy dana, wylosowana kombinacja już istnieje, nie potrzeba nawet losować. Wystarczy po prostu odliczyć od 0 do 511 (2^9 – 1), aby uzyskać wszystkie wymagane kombinacje.
Czasami warto zatem „wstrzymać konie” i przez chwilę zastanowić się czy używane narzędzie jest odpowiednie. Oczywiście raz będzie je odszukać łatwiej, innym razem trudniej (jak w przykładzie z LINQ – tutaj niestety brakowało elementarnej wiedzy z zakresu reprezentacji liczb w systemach komputerowych, czego nie załatwi Google, ale jak widać wystarczyło zapytać na forum).
Uważny czytelnik zapewne dostrzegł, że mówiłem o podwójności inspiracji, a zaprezentowałem tylko jeden jej aspekt. Cierpliwości, poświęcę temu oddzielny wpis.