Article View: pl.comp.objects
Article #14815Re: Tolerancja dla duplikacji kodu
From: Sektor van Skijlen
Date: Tue, 27 Jun 2006 19:10
Date: Tue, 27 Jun 2006 19:10
71 lines
4767 bytes
4767 bytes
Dnia Fri, 23 Jun 2006 19:50:10 +0200, Przemek Pokrywka skrobie: > Witam, > Czy zdarzają się Państwu sytuacje, w których pozbycie się duplikacji > kodu jest niemożliwe? Ja się osobiście nie spotkałem z sytuacją, żeby usunięcie duplikatów było niemożliwe. Ale spotkałem się z sytuacją, gdy jest nieopłacalne. > Ile duplikacji kodu w projekcie Państwo tolerują? W przypadku, gdy pytanie jest o to, ile duplikatów pozostawiłbym w miarę wszelkich możliwości w kodzie, moja odpowiedź brzmi: zero. Pytanie to jest jednak niekonkretne z dwóch powodów: 1. Co to jest duplikat? No bo weźmy sobie taki przykład (akurat z mojej praktyki): Mamy strukturę "charakterystyczną", czyli opisującą charakterystyczne dane jakiejś wielkiej tabeli (tabela ma bardzo ścisłe podziały, rozmiary, indeksacje, sposób translacji danych pomiędzy poziomami itd.). Chodzi o to, żeby dane charakterystyczne z tej tabeli wystarczyły do generycznego opisania sposobu aktualizacji zawartości tabeli, a także przenoszenia wartości pomiędzy poziomami i generacji raportu. I teraz: nie ukrywam, że nawet sam wpadłem na ten pomysł, żeby wszystkie "facility" dotyczące konkretnej tabeli (początkowo było ich 5) wrzucić do osobnego pliku i tam również zawierała się funkcja inicjalizująca obiekt charakterystyczny tej tabeli. Ponieważ każdy taki obiekt był typu tej samej struktury, więc funkcja inicjalizująca obiekt charakterystyczny w każdym pliku wyglądała niemal identycznie, co najwyżej tylko niektóre dane się różniły. I co teraz? Czy w takim razie jedna z tych funkcji inicjalizujących jest duplikatem pozostałych? Inny przykład: mamy funkcję, która jest handlerem komendy. Tak się przypadkiem złożyło, że dwie komendy przyjmują identyczny zestaw argumentów, tyle że robią inne rzeczy. Czynność podejmowana przez te komendy jest bardzo prosta, w uproszczeniu powiedzmy, że chodzi o wywołanie jednej funkcji (tyle że innej). Argumenty przed podaniem muszą być odpowiednio dostosowane (przekonwertowane itd.), więc wszystko to, co robią oba te handlery to jest zebranie i przekonwertowanie argumentów oraz wywołanie odpowiedniej funkcji. Czyli te dwa handlery komend, poza tym, że wywołują inną funkcję, nie różnią się niczym. Zatem: są duplikatami, czy nie są? Jeszcze inny przykład: mamy 10 funkcji wykonujących dokładnie to samo, mianowicie pobierających komunikaty z kolejki, przetwarzających je odpowiednio, konwertujących różne pierdoły... no i potem mamy switch/case, który to dispatchuje na handlery. Z tym tylko, że ten switch/case stanowi średnio 80% każdej funkcji. Czy te funkcje są duplikatami, czy nie? W tej kwestii przychylałbym się do stwierdzenia p. Lewandowskiego, że jednak duplikaty lepiej ocenia się "na oko". Ale powtórzę, nie wiem po raz który: narzędzia nie służą do tego, żeby rządzić tym, co mają zrobić programiści. Narzędzia mają za zadanie pokazać, unaocznić, przypomnieć, podpowiedzieć; NIGDY zdecydować za człowieka. Narzędzia nie powinny także być częścią polityki firmy. 2. Jeśli już stwierdziliśmy jakieś duplikaty kodu, to czy wskazany kod rzeczywiście powinien zostać zastąpiony wersją generyczną? Inaczej, czy opracowywanie generyzmu dla wskazanego kodu jest robotą na tyle zyskowną, że warto się tym kodem w ogóle zajmować? Jest taka zasada: "nie należy grzebać w starym gównie, bo zacznie śmierdzieć". -- // _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl> \\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com> // \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx "I am allergic to Java because programming in Java reminds me casting spells"
Technical Details
Message-ID:
<e7rvs2$1hp$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mailReferences:
<e7h9l6$1pq$1@news.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.objects
Subject: Re: Tolerancja dla duplikacji kodu
Date: Tue, 27 Jun 2006 19:10:58 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 71
Sender: Michal Malecki <sektor@zly.kis.p.lodz.pl>
Message-ID: <e7rvs2$1hp$1@kujawiak.man.lodz.pl>
References: <e7h9l6$1pq$1@news.onet.pl>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1151435458 1593 212.191.89.2 (27 Jun 2006 19:10:58 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Tue, 27 Jun 2006 19:10:58 +0000 (UTC)
User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (SunOS/5.9 (sun4u))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit