konto usunięte

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Jakub Wojt:
Będziemy rozmawiać o konkretach, czy też temat wątku pozostanie "otwarty" ? :)

Mi naprawdę nie chodzi o złożony kod, czy też istotny z punktu widzenia logiki. Mam na myśli raczej proste rzeczy jak np.

private Translator translator;
private Translator getTranslator()
{ if (translator == null)
translator = new Translator();

return translator;
}


Ja twierdzę, że usuwanie tego typu konstrukcji za wszelką cenę to zwyczajna strata czasu.

konto usunięte

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Mi naprawdę nie chodzi o złożony kod, czy też istotny z punktu widzenia logiki. Mam na myśli raczej proste rzeczy jak np.

private Translator translator;
private Translator getTranslator()
{ if (translator == null)
translator = new Translator();

return translator;
}


Ja twierdzę, że usuwanie tego typu konstrukcji za wszelką cenę to zwyczajna strata czasu.

Usuwanie akurat takich "dubli" może być dla programisty bardzo niebezpieczne.
Jeśli mi nie wierzysz - spytaj architekta / lead programisty projektu w którym pracujesz...

konto usunięte

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Wprowadźmy licznik Dubla:
Niech N oznacza liczbę skopiowanych linijek kodu. Niech M oznacza liczbę wystąpień N skopiowanych linii kodu. Jeśli N>3 i M>1, wówczas taki kod należy zamknąć w odrębną jednostkę w ramach danego zasięgu.

Może być?

Wszystko wskazuje na to (powyższy przykład) że chodzi o przerabianie singletonów na multipletony (?) ;) więc zapewne formalizacja nie będzie potrzebna ;)
Sławomir Orłowski

Sławomir Orłowski PhD, physicist,
software
developer/architect
team leader...

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Jakub Wojt:
Mi naprawdę nie chodzi o złożony kod, czy też istotny z punktu widzenia logiki. Mam na myśli raczej proste rzeczy jak np.

private Translator translator;
private Translator getTranslator()
{ if (translator == null)
translator = new Translator();

return translator;
}


Ja twierdzę, że usuwanie tego typu konstrukcji za wszelką cenę to zwyczajna strata czasu.

Usuwanie akurat takich "dubli" może być dla programisty bardzo niebezpieczne.
Jeśli mi nie wierzysz - spytaj architekta / lead programisty projektu w którym pracujesz...
Ale czy chodzi tu o to, że ktoś chce napisać "uniwersalną metodę", która ominie pisanie w geterze tego "if"? Bo nie rozumiem.

konto usunięte

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Jakub Wojt:
Wszystko wskazuje na to (powyższy przykład) że chodzi o przerabianie singletonów na multipletony (?) ;) więc zapewne formalizacja nie będzie potrzebna ;)

Ale to nie jest singleton. "private Translator translator;" - ta zmienna nie jest statyczna... wiec traktowałbym to tylko i wyłącznie jalo lazy-init (?) pola "translator"...

Tak czy inaczej, cały ten temat chyba się zdegenerował przez brak sensownych przykładów ze strony autora wątku.

konto usunięte

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Rafał Głowiński:
Jakub Wojt:
Wszystko wskazuje na to (powyższy przykład) że chodzi o przerabianie singletonów na multipletony (?) ;) więc zapewne formalizacja nie będzie potrzebna ;)

Ale to nie jest singleton. "private Translator translator;" - ta zmienna nie jest statyczna... wiec traktowałbym to tylko i wyłącznie jalo lazy-init (?) pola "translator"...

faktycznie ;)

Tak czy inaczej, cały ten temat chyba się zdegenerował przez brak sensownych przykładów ze strony autora wątku.

Trzeba więc odpowiedzieć - przede wszystkim, nie powinno się tworzyć "zdublowanego" kodu. A co usuwania - to zależy...
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Sebastian Malaca:
Mi naprawdę nie chodzi o złożony kod, czy też istotny z punktu widzenia logiki. Mam na myśli raczej proste rzeczy jak np.

private Translator translator;
private Translator getTranslator()
{ if (translator == null)
translator = new Translator();

return translator;
}


Ja twierdzę, że usuwanie tego typu konstrukcji za wszelką cenę to zwyczajna strata czasu.

Decyzja o enkapsulacji nie powinna zapadać tymi kryteriami. Metoda to odrębna część funkcjonalności, która wykonuje jakąś czynność dla kodu wywołującego, a nie narzędzie do pisania jak najmniejszej ilości linijek.
Nawet jeśli dana funkcjonalność ma dwie linijki, ale jest już logicznie oddzielna, to jej enkapsulacja jest wskazana. Pozwala to na logiczne ustrukturyzowanie kodu i łatwe rozbudowywanie, re używanie i debugowanie zdefuniowanych funkcjonalności w przyszłości.
Najlepsze przykłady jak pisać w ten sposób są w bibliotekach core Javy, większość metod ma 4 lub mniej linijek...

konto usunięte

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Jakub Wojt:
Usuwanie akurat takich "dubli" może być dla programisty bardzo niebezpieczne.
Czyli jednak się zgadzamy, że niektóre warto zostawić:)
Sławomir Orłowski:.
Ale czy chodzi tu o to, że ktoś chce napisać "uniwersalną metodę", która ominie pisanie w geterze tego "if"?
Chodziło mi o całą metodę wraz z atrybutem.
Rafał Głowiński:
Tak czy inaczej, cały ten temat chyba się zdegenerował przez brak sensownych przykładów ze strony autora wątku.
Starałem się jak mogłem najlepiej:)

Tak czy inaczej wszystkim dziękuję za wyczerpujące wypowiedzi na temat każdego, nawet najbardziej nietrafionego:)
Roland Żerek

Roland Żerek Software Engineer

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Dariusz Wawer:
Ogólna zasada, która - wydaje mi się - dobrze mi służy to:

Jeśli musisz użyć tego samego kawałka kodu drugi raz, skopiuj go. Jeśli musisz go użyć po raz trzeci - refactoruj w oddzielną funkcję/metodę.

Podejscie takie jest tylez kuszace, co i gwarantujace problemu podczas maintenansu... Jest bardzo duze prawdopodobienstwo, ze poprawiony bug w jednym miejscu nie bedzie poprawiony w drugim. Ze nie wspomne o uciazliwosci wielokrotnego poprawiania w dwóch miejscach naraz...
Roland Żerek

Roland Żerek Software Engineer

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Dariusz Wawer:
Mateusz Herych:
Programiści często niezbyt chętnie podchodzą do małych klas, które mają jedną, bardzo małą odpowiedzialność - wszak o wiele 'łatwiej' dodać jest prywatną metodę do klasy już istniejącej - takie podejście nie jest jednak do końca dobre, bo często prowadzi do złamania SRP, a i taki kod z wieloma prywatnymi metodami nie jest zbyt łatwo testowalny.

A potem mamy aplikacje, które w powtarzanej tysiące razy pętli alokują dziesiątki mini obiektów. A GC umiera.

A dlaczego ktos w ogole mialby tak robic? Jedna klasa = jedna odpowiedzialnosc. Latwosc testowania, mozliwosc kompozycji... same zalety. Natomiast posiadanie wielu obiektow nie oznacza tego, ze beda one w kazdej iteracji tworzone. O ile w ogole powinny byc tworzone (przez new) bo jest to zlamanie zasady tworzenia kodu testowalnego. Tworzenie obiektow przez new uniemozliwia tworzenie unit testow.
Roland Żerek

Roland Żerek Software Engineer

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Dariusz Wawer:
Mogłem się spodziewać, że moja wypowiedź zostanie tak odebrana. Wszyscy pewnie macie rację, na dodatek popartą doświadczeniem. Powiedzcie mi jednak, czy nie widzieliście nigdy czegoś takiego:


JakisTamDb dbinfo = getDb();
while (dataAvaialable()){
data = getData();
for (DataObj do : data) {
new DataProcessor(dbinfo, data).processAndAddToDb();
}
}

Swietny przyklad jak NIE pisac... To jest na prawde code smell...
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Polecam ksiazke
http://helion.pl/ksiazki/czysty-kod-podrecznik-dobrego...
Wlasnie o takich dylematach jest cala + ma sporo cwiczen.

Co do tego, ze w PHP pisze sie brzydko, a w Javie ladnie.. to prawda, PHP pozwala na pisanie brzydko. Jest tak samo jak z pistoletem - mozna sobie strzelic w kolano z wlasnego pistoletu, ale zalezy to glownie od strzelca ;)
Maciej Nowicki

Maciej Nowicki Java Developer

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Piotr Jasiulewicz:
Co do tego, ze w PHP pisze sie brzydko, a w Javie ladnie.. to prawda, PHP pozwala na pisanie brzydko. Jest tak samo jak z pistoletem - mozna sobie strzelic w kolano z wlasnego pistoletu, ale zalezy to glownie od strzelca ;)

Java pozwala pisać brzydko dokładnie tak samo jak PHP, brak jawnych typów zmiennych nie rozwiązuje wielu problemów "brzydkiego kodu", a jak ktoś się uprze brzydki pisać to i register_globals w JSPach zasymuluje ;)
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

True, jezyk programowania sposob rozwiazania problemu, a nie rozwiazanie, ani tez problem.

Kiedys czytalem, ze roznica miedzy dobry programista, a switnym programista, jest to, ze swietny rozwiaze problem w bardziej elegancki i latwy sposob.

Tak wiec wszedzie mozna znalezc eleganckie rozwiazanie nieeleganckich problemow i na odwrot.
Robert P.

Robert P. Senior PHP Developer

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

A ja zacytuje tutaj profesora, który uczył mnie programowania na studiach: "Jeżeli kopiujesz kod to znaczy, że robisz coś źle". Ogólnie kopiowanie kodu jest złą praktyką. Po to jest kompozycja, dziedziczenie, wzorce projektowe, by tego unikać.

To tyle w teorii, a jak jest w praktyce. W praktyce zawsze pytam się czy ktoś chce mieć dobry kod, chce go szybko oraz ile jest w stanie zapłacić i na tej podstawie decyduje o tym jak robie kod. Wiadomo, że gdy wiem, że jak źle napisze ten kawałek kodu i będe go później przerabiał to staram się od razu dobrze go zakodować. Niestety brak czasu skłania do złych praktyk gdzie za jakiś czas gdy pojawi się potrzeba zmodyfikowania jakiegoś kodu człowiek zadaje sobie pytanie: "Dlaczego od razu nie zrobiłem tego jak należy?".
Mirosław R.

Mirosław R. Programista

Temat: Dublowanie kodu - bezwzględnie usuwać, czy może nie?

Moim zdaniem to pytanie sprowadza się do stwierdzenia:
Kopiować, aby zrealizować pewną część na szybko, a potem męczyć się długo w przypadku jakichkolwiek zmian.



Wyślij zaproszenie do