Ilekroć słyszę o anty-wzorach, przypominam sobie inny termin mianem. Zapach projektowy.
„Zapachy projektowe są pewnymi strukturami w projekcie, które wskazują na naruszenie podstawowych zasad projektowania i negatywnie wpływają na jakość projektu” (z „Refaktoryzacji zapachów związanych z projektowaniem oprogramowania: zarządzanie długiem technicznym”)
Istnieje wiele zapachów projektowych sklasyfikowanych na podstawie naruszających zasady projektowania:
Abstrakcja pachnie
Brakująca abstrakcja: ten zapach powstaje, gdy zamiast tworzenia klasy lub interfejsu używane są skupiska danych lub zakodowane ciągi.
Imperatywna abstrakcja: ten zapach powstaje, gdy operacja zamienia się w klasę.
Niekompletna abstrakcja: ten zapach powstaje, gdy abstrakcja nie obsługuje całkowicie metod komplementarnych lub powiązanych.
Wielowymiarowa abstrakcja: ten zapach powstaje, gdy abstrakcja ma przypisaną więcej niż jedną odpowiedzialność.
Niepotrzebna abstrakcja: ten zapach pojawia się, gdy abstrakcja, która faktycznie nie jest potrzebna (a zatem można jej uniknąć) zostaje wprowadzona do projektu oprogramowania.
Niewykorzystana abstrakcja: ten zapach powstaje, gdy abstrakcja pozostaje nieużywana (nie jest używana bezpośrednio lub nie jest osiągalna).
Duplikat abstrakcji: Ten zapach powstaje, gdy dwie lub więcej abstrakcji ma identyczne nazwy lub identyczną implementację lub oba.
Kapsułka pachnie
Deficient Encapsulation: Ten zapach pojawia się, gdy deklarowana dostępność jednego lub więcej członków abstrakcji jest bardziej dopuszczalna niż faktycznie wymagana.
Przeciekająca enkapsulacja: Ten zapach powstaje, gdy abstrakcja „ujawnia” lub „przecieka” szczegóły implementacji za pośrednictwem publicznego interfejsu.
Brak enkapsulacji: ten zapach występuje, gdy warianty implementacji nie są enkapsulowane w ramach abstrakcji lub hierarchii.
Niewykorzystana enkapsulacja: Ten zapach powstaje, gdy kod klienta używa jawnych kontroli typu (przy użyciu łańcuchowych instrukcji if-else lub switch, które sprawdzają typ obiektu), zamiast wykorzystywać odmianę typów już zawartych w hierarchii.
Modularyzacja pachnie
Zepsuta modularyzacja: ten zapach powstaje, gdy dane i / lub metody, które najlepiej powinny być zlokalizowane w pojedynczej abstrakcji, są oddzielone i rozłożone na wiele abstrakcji.
Niewystarczająca modularyzacja: ten zapach powstaje, gdy istnieje abstrakcja, która nie została całkowicie rozłożona, a dalszy rozkład może zmniejszyć jej rozmiar, złożoność implementacyjną lub jedno i drugie.
Cyklicznie zależna modularyzacja: Ten zapach powstaje, gdy dwie lub więcej abstrakcji zależą od siebie bezpośrednio lub pośrednio (tworząc ścisłe połączenie między abstrakcji).
Modularyzacja podobna do koncentratora: ten zapach powstaje, gdy abstrakcja ma zależności (zarówno przychodzące, jak i wychodzące) z dużą liczbą innych abstrakcji.
Hierarchia pachnie
Brakująca hierarchia: ten zapach powstaje, gdy segment kodu wykorzystuje logikę warunkową (zazwyczaj w połączeniu z „typami otagowanymi”) w celu jawnego zarządzania zmiennością w zachowaniu, w której można by stworzyć hierarchię i wykorzystać ją do enkapsulacji tych odmian.
Niepotrzebna hierarchia: ten zapach powstaje, gdy cała hierarchia dziedziczenia jest niepotrzebna, co wskazuje, że dziedziczenie zostało niepotrzebnie zastosowane w określonym kontekście projektowym.
Niefaktoryzowana hierarchia: ten zapach powstaje, gdy zachodzi niepotrzebne powielanie między typami w hierarchii.
Szeroka hierarchia: ten zapach powstaje, gdy hierarchia dziedziczenia jest „zbyt” szeroka, co wskazuje na brak typów pośrednich.
Hierarchia spekulacyjna: ten zapach powstaje, gdy jeden lub więcej typów w hierarchii jest dostarczanych spekulacyjnie (tj. W oparciu o wyobrażone potrzeby, a nie rzeczywiste wymagania).
Głęboka hierarchia: ten zapach powstaje, gdy hierarchia dziedziczenia jest „nadmiernie” głęboka.
Zbuntowana hierarchia: ten zapach powstaje, gdy podtyp odrzuca metody zapewniane przez jego nadtyp (y).
Broken Hierarchy: Ten zapach powstaje, gdy nadtyp i jego podtyp koncepcyjnie nie mają związku „IS-A”, co skutkuje zerwaną substytucyjnością.
Hierarchia wielościeżkowa: ten zapach powstaje, gdy podtyp dziedziczy zarówno bezpośrednio, jak i pośrednio od nadtypu, co prowadzi do niepotrzebnych ścieżek dziedziczenia w hierarchii.
Cykliczna hierarchia: ten zapach powstaje, gdy nadtyp w hierarchii zależy od dowolnego z jego podtypów.
Powyższą definicję i klasyfikację opisano w „Refaktoryzacji zapachów projektowych: Zarządzanie długiem technicznym ”. Niektóre bardziej odpowiednie zasoby można znaleźć tutaj .