🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #14815

Re: Tolerancja dla duplikacji kodu

#14815
From: Sektor van Skijlen
Date: Tue, 27 Jun 2006 19:10
71 lines
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-mail
References: <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