wtorek, 18 września 2018

Nadużywanie Dependency Injection - jak nie robić

Dziś zdałem sobie sprawę, że nadużywam wstrzykiwanie zależności bo jak można nazwać taki konstruktor:


public RegistrationController(IregistrationList registration, IDystans _dys, IGrupa _gr, IPlec _plec, ICreatingFilters _filters, INewRecord _inew, IDataVerification _idata, ISMTP_Configuration _ismtp, IDescriptionVerificationNumber _desc
,ICheckWerification _icheck,IRandomNumber _irandom,IExceptionBase _iexception
, IDataForDescription _idataDescription, IDescriptionEndCreate _iend, IUniqueException _ithrow, IFiltersOperations ifiltersOpereations, IFilterBool ifilterBool, IValueFilters ivalueFilter)

No faktycznie to pan pojechał (stworzyłem anty wzorzec (wstyd i hańba)).
Cóż z tym zrobić szybki rzut oka na kod, pierwsze rozwiązanie dzielimy kontroler na kilka mniejszych.
W tym kontrolerze mam:
  • rejestracje użytkownika,
  • validacje email,
  • lista zarejestrowanych,
  • dodawanie grupy kolarskiej. 
Dzięki temu będę miał mniej interfacjatów w konstruktorze. Inna kwestia to dotychczasowy zapis jest niezgodny z pierwszą zasadą Solid czyli zasadą pojedynczej odpowiedzialności, klasa RegistrationController odpowiada za cztery różne zadania (albo i więcej).

1. Podział kontrolera.
Usunąłem z kontrolera interfejsy dotyczące listy zarejestrowanych, przypomniałem sobie że stworzyłem klasę, która łączy w sobie wszystkie  filtry, trzy interfejsy zastąpiłem jednym, wydaje mi się że to wzorzec Fasada ale muszę się upewnić. Teraz konstruktor wygląda tak:

public RegistrationController(INewRecord _inew, IDataVerification _idata, ISMTP_Configuration _ismtp, IDescriptionVerificationNumber _desc, ICheckWerification _icheck, IRandomNumber _irandom, IExceptionBase _iexception, IDataForDescription _idataDescription, IDescriptionEndCreate _iend, IUniqueException _ithrow, ICreatingFilters _ifilters)

Trochę lepiej, teraz wyrzucę jeszcze walidacje email, to powinno mi dać o pięć interfejsów mniej.
Po usunięciu walidacji emaila konstruktor wygląda tak:

public RegistrationController( IExceptionBase _iexception , ICreatingFilters _ifilters)

2. Kolejny podział.
Nowo stworzony kontroler walidacja ( WerificationEmail) email przejął  część interfejsów po Registration kontroler jest ich stanowczo za dużo bo aż dziewięć, no cóż  należałoby zmniejszyć ilość, wydzielić kolejne zależności.

Podsumowując co spowodowało błąd zapomniałem o pierwszej zasadzie Solida, pojedynczej odpowiedzialności przez kontroler to też klasa!
Kolejne kroki to nic tylko wydzielanie zadań do nowych klas, z jednej strony mam więcej kontrolerów ale zakres ich odpowiedzialności jest znacznie mniejszy są dużo prostsze. Ilość widoków nie uległa zmianie, zależą od  akcji w kontrolerach, teraz są przynajmniej poukładane w katalogi odpowiednie.

Brak komentarzy:

Prześlij komentarz

 Po wielu miesiącach przerwy Czteroletnim exodusie do bloga ismartdev, który zdechł w zeszłym roku w listopadzie, na powrót wstąpiłem w ten ...