Czy istnieje antypattern opisujący tę metodę kodowania? [Zamknięte]


26

Mam bazę kodów, w której programista zwykle owija rzeczy w obszarach, które nie mają sensu. Na przykład, biorąc pod uwagę dziennik błędów, możemy zalogować się za pośrednictwem

ErrorLog.Log(ex, "friendly message");

Dodał różne inne środki, aby wykonać dokładnie to samo zadanie. NA PRZYKŁAD

SomeClass.Log(ex, "friendly message");

Który po prostu się odwraca i wywołuje pierwszą metodę. Zwiększa to poziom złożoności bez dodatkowych korzyści. Czy istnieje jakiś anty-wzór, aby to opisać?


36
Obejmuje to „złe kodowanie”;)
Oded

12
Zależy. Czy to opakowanie dla biblioteki logowania? Gdyby kiedykolwiek istniała szansa na zamianę, to w rzeczywistości jest to dobra praktyka ...
Rig

3
@lortabac: Problem z „kodem baklava” polega na tym, że faktycznie brzmi on dobrze i smacznie, a zatem jest pożądany.
FrustratedWithFormsDesigner

10
Co mówi ten programista, kiedy je dodajesz, dlaczego dodają te metody? Zrozumienie ich rozumowania powinno ułatwić ich edukację.
Keith

3
Brzmi jak poziom pośredni , który może być dobry, gdy chcesz uniknąć sprzężenia dwóch klas, jak wskazał @Rig. Być może był to tylko programista cierpiący na zapalenie wzoru - po prostu próbujący rozwiązać problem, którego nie ma, naruszając KISS.
Fuhrmanator

Odpowiedzi:


54

Warto nazwać jakiś nawyk złego kodowania Antipatternem, jeśli jest dość rozpowszechniony.

Resztę nazywamy po prostu „kodem śmieci” ...


Gdybym zaproponował nazwę tego szczególnego złego nawyku, byłby to „Zaburzenie obsesyjno-abstrakcyjne” :-)


9
Zawsze używałem „Piekła Indirection”.
Dan Neely

27

Nie, to nie jest anty-wzór, ale chciałbym poruszyć następujące kwestie.

Naruszenie zasady pojedynczej odpowiedzialności

SRP mówi, że klasa powinna mieć jeden powód do zmiany. Dodanie metody rejestratora oznacza, że ​​klasa musi się również zmienić, jeśli logika logowania powinna zostać zmieniona.

Naruszenie is-azwiązku

Klasy podstawowe nie są przybornikami, w których można dodać kilka metod wygody.

W ten sposób skutecznie łączy wszystkie odziedziczone klasy z implementacjami, które ma klasa podstawowa.

Porównaj to z kompozycją.


1
„Problem pojedynczej odpowiedzialności”? SRP? Być może chciałeś napisać zasadę pojedynczej odpowiedzialności? Po prostu łączę dwa tutaj. :)
zxcdw

8

Nie oznacza to, że jest to dopuszczalne, ale może to być po prostu niedokończone refaktoryzacja. Być może SomeClass.log () miał swoją logikę i został zaimplementowany jako pierwszy. A później zdali sobie sprawę, że powinni używać ErrorLog.Log (). Zamiast więc zmieniać 100 miejsc, w których wywoływana jest SomeClass.Log (), po prostu delegowali je do ErrorLog.Log (). Osobiście zmieniłbym wszystkie odwołania do ErrorLog.Log () lub przynajmniej skomentował SomeClass.log (), aby powiedzieć, dlaczego deleguje sposób, w jaki to robi.

Tylko coś do rozważenia.



4

Nie jestem pewien, czy opisałbym to jako naruszenie zasady pojedynczej odpowiedzialności, ponieważ jeśli nastąpi zmiana w sygnaturze metody ErrorLog (metoda wywoływana przez SomeClass), każdy kod klienta wywołujący tę metodę zawiedzie.

Istnieje oczywiście sposób wykorzystania dziedziczenia (lub tworzenia klas wymagających logowania za pomocą interfejsu rejestrowania).


Ciągle zła praktyka, ponieważ: 1) zmiana jest mało prawdopodobna 2) jeśli się zmieni, mogą po prostu zbudować klasę opakowania o tej samej nazwie i zmienić import.
kevin cline

2
+1. A oto „Wujek Bob” (Robert Martin) argumentujący za scentralizowaniem zależności w ograniczonej liczbie modułów, zamiast rozpraszania ich w kodzie.
MarkJ

3

Lub możemy to potraktować jako „moment, którego można się nauczyć” :)

Twój programista może być w połowie drogi do dobrego pomysłu. Załóżmy, że chcesz mieć wymóg, aby wszystkie obiekty biznesowe były zdolne do inteligentnego rejestrowania. Możesz zdefiniować:

   public interface IBusinessObjectLogger
   {
       void Log(Exception ex, string logMessage)
   }

Teraz wewnątrz swoich obiektów możesz użyć obiektu ErrorLog do faktycznego rejestrowania, podczas gdy kod SomeClass dodaje określoną wartość obiektu do komunikatu dziennika. Następnie można rozszerzyć interfejsy API rejestrowania w celu wdrożenia funkcji rejestrowania opartej na plikach, bazach danych lub komunikatach bez dotykania obiektów biznesowych.


3

Nie jestem pewien, czy to automatycznie jest złe.

Jeśli dzwonisz do SomeClass, z pewnością jest to zło, ale jeśli Log jest używany tylko Z WEJŚCIA SomeClass, to odcina połączenie i nazwałbym to akceptowalnym.


2

W rzeczywistości jest to dość powszechne w niektórych stylach kodowania, a podstawy linii myślenia same w sobie nie są anty-wzorcem.

Prawdopodobnie wynika to z faktu, że ktoś koduje z konieczności bez wiedzy o szerszej bazie kodu: „OK, ten kod musi zarejestrować błąd, ale ta funkcja nie jest głównym celem kodu. Dlatego potrzebuję metody / klasy, która to zrobi dla mnie". To dobry sposób myślenia; ale nie wiedząc, że istnieje ErrorLog, stworzyli SomeClass. W pewnym momencie odnaleźli ErrorLog i zamiast zastąpić wszystkie zastosowania metody, którą zastosowali, wywołali metodę ErrorLog. To właśnie staje się problemem.


2

Przypadkowa złożoność to złożoność pojawiająca się w programach komputerowych lub w procesie ich opracowywania, która nie jest niezbędna do rozwiązania problemu. Chociaż zasadnicza złożoność jest nieodłączna i nieunikniona, przypadkowa złożoność jest spowodowana podejściem wybranym do rozwiązania problemu.

http://en.wikipedia.org/wiki/Accidental_complexity


1

Może to być nadużycie / niezrozumienie wzoru elewacji . Widziałem podobne rzeczy w bazie kodu, z którą pracowałem. Deweloperzy przeszli fazę, gdy oszaleli na punkcie wzorów projektowych, nie rozumiejąc nadrzędnych zasad projektowania OO.

Niewłaściwe użycie wzoru elewacji powoduje rozmycie poziomów abstrakcji na warstwach aplikacji.


1

To, co robi ten programista, polega na owijaniu kodu, aby nie miał bezpośredniej zależności od modułu rejestrującego. Bez bardziej szczegółowych informacji nie można podać bardziej konkretnego wzorca. (To, że te opakowania nie są przydatne, to twoja opinia, z którą nie można się zgodzić ani nie zgodzić bez większej ilości informacji).

Wzory, do których może to dotyczyć, to Proxy , Delegat , Dekorator , Kompozyt lub inne, które mają związek z zawijaniem, ukrywaniem lub rozprowadzaniem połączeń. Może to być jedna z takich rzeczy w niepełnym stanie rozwoju.


0

Mogłem sobie wyobrazić, że to różnica kulturowa. Być może istnieje dobry powód posiadania zduplikowanej funkcjonalności w tej konkretnej bazie kodu. Mogłem sobie wyobrazić łatwość pisania jako taki powód. Programiści Python nadal twierdzą, że jest zły, ponieważ „ Powinien być jeden - a najlepiej tylko jeden - oczywisty sposób na zrobienie tego. ”, Ale niektórzy Perli mogą być przyzwyczajeni do faktu, że „ jest więcej niż jeden sposób na zrobienie tego ".


1
Łatwość wstępnego pisania nie jest dobrym powodem do powielania. Nieprawidłowy kod może być łatwiejszy do napisania za pierwszym razem, ale nie ułatwia to pisania kodu na dłuższą metę. Co nowy facet robi ze zduplikowaną funkcjonalnością? Jaką metodę nazywa? Marnuje czas na ich wyszukiwanie i czytanie, ale okazuje się, że robią to samo.
Kazark

Być może ten kod był pierwotnie pomyślany jako prototyp, który następnie został użyty (ab) jako przyrost. W takim przypadku, moim zdaniem, optymalizacja pod kątem wstępnego pisania byłaby ważna.
Bengt,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.