Template method: dla mnie ten wzorzec to trochę nie wiem jak wydzielić interfejsy więc zrobię burdel w jednym
.
Template method to wzorzec do tworzenia szeregu podobnych algorytmów różniących się jakąś częścią. Co to ma do wydzielania interfejsów?
Używanie klas na siłę: chcę zrobić zwykłą funkcję, ale nie mogę. Muszę nazwać ją FunkcjaXXX
, gdzie XXX to handler, service, controller, monitor albo inny bzdet.
To chyba specyficzne jedynie dla pewnych języków, i to chyba raczej nieobiektowych.
Według mnie, nie ma czegoś takiego jak "anti-pattern". Wzorce projektowe to tylko narzędzie, które do pewnych zadań się nadaje, a do innych pasuje jak pięść do nosa.
Ok, podaj jedno zastosowanie God Object. :)
Inny przykład to powszechnie uznawany za antywzorzec Singleton
Oczywiście można go zaimplementować lepiej, lub gorzej, ale praktycznie każda aplikacja ma coś, co musi być współdzielone pomiędzy wszystkimi modułami: repozytorium, event bus itp. Ale ponieważ ktoś kiedyś napisał, ze singleton jest zły, to teraz stosuje się jakieś wygibasy, żeby fakt istnienia globalnego obiektu ukryć za 20 adnotacjami, czy jakąś często upierdliwą w zastosowaniu funkcją frameworku.
Singleton nie jest antywzorcem, ale jego samodzielne implementowanie jest. Od tego są kontenery DI, aby się tym zająć.
Zbiorczy temat do narzekania na wzorce projektowe, które są antywzorcami, może macie jakieś ulubione? Ode mnie na początek:
- Anemic domain model - nieużywanie OOP, tam, gdzie OOP faktycznie pasuje
- Specification pattern - takie enterprise if-else, niepotrzebna abstrakcja
- Wrappowanie ORM (np. DbContext) i nazywanie tego UoW, w ogólności bezsensowne wrappery, zmniejszające funkcjonalność (raz miałem do czynienia z wrapperem na NHibernate, który wrappował sposób robienia query, tak że dało się zrobić może 1/10 tego co pozwala
ISession
)
Active Record, generyczne repozytorium, ogólnie fasady na wszystko (czyli wrappery).
Głównym problemem jest moim zdaniem to, że:
- Jedna grupa ludzi rozumie, że wzorce istnieją i są potrzebne, ale dała sobie wmówić, że to jakiś trudny temat, jakieś skomplikowane konstrukcje, których trzeba się nie wiadomo ile uczyć, aby móc stosować. W efekcie ludzie zakuwają teorię, aby tylko przejść rozmowę kwalifikacyjną, a potem i tak nie używają wzorców, bo tak rzekomo łatwiej. Żeby było śmieszniej, to oni wymyślają swoje własne wzorce (czasami zgodne ze znanymi, czasami bardziej koślawe), bo przecież też napotykają na powtarzalne problemy. Co daje ten ich opór? Nie wiem.
- Druga grupa ludzi po przeczytaniu teorii przegięła w drugą stronę, i próbuje wsadzać każdy wzorzec wszędzie. A takie wsadzanie byle gdzie to proszenie się o chorobę weneryczną. Taki kod jest równie zły, jak proceduralny od tych z pierwszej grupy.
- Trzecia grupa ludzi - taka, która nie rozumie po co w ogóle wzorce są, więc je po prostu hejtuje. Tak jak część samochodziarzy hejtuje automatyczne skrzynie biegów.
A koncepcja jest bardzo prosta - to po prostu nazwy na rozwiązania pewnych powtarzalnych problemów. Osiągamy w ten sposób dwa cele - nie wynajdujemy koła na nowo, a także usprawniamy komunikację między programistami.
A tak w ogóle, to nie jestem pewien, czy wzorce muszą być związane z OOP. Powtarzalne problemy zdarzają się niezależnie od paradygmatu.