środa, 19 września 2018

Dependency Injection - naprawa (refaktoryzacja)

Wczoraj podzieliłem kontroler odpowiedzialny za rejestracje na kilka mniejszych (dokładnie dwa), jeden z nich dalej jest "popuchnięty". Kontroler ten służy do weryfikacji adresu email. W tym roku podczas rejestracji po raz pierwszy wprowadziłem weryfikacje adresu email, wzorowałem się na Allegro aby dokończyć transakcje otrzymujemy na podany adres mejlowy kod weryfikujący.
W poprzednich edycjach maratonu pojawiły się problemy z niewłaściwymi adresami email oraz z powtarzającymi się rejestracjami, aby temu zapobiec stworzona została weryfikacja zarejestrowanego zawodnika poprzez adres email oraz dodanie do bazy unikalności na trzy kolumny (imię, nazwisko,email).

Po wydzieleniu części kodu kontroler wygląda następująco:


public class VerificationEmailController : Controller
    {
        private readonly INewRecord _inew;
        private readonly IDataVerification _idata;
        private readonly IRandomNumber _irandom;
        private readonly ISMTP_Configuration _ismtp;
        private readonly IDescriptionVerificationNumber _idesc;
        private readonly ICheckWerification _icheck;
        private readonly IUniqueException _ithrow;
        private readonly IDataForDescription _idataDescription;
        private readonly IDescriptionEndCreate _iend;
        private readonly IExceptionBase _iexception;

public VerificationEmailController(INewRecord _inew, IDataVerification _idata, ISMTP_Configuration _ismtp, IDescriptionVerificationNumber _desc
, ICheckWerification _icheck, IRandomNumber _irandom, IExceptionBase _iexception
, IDataForDescription _idataDescription, IDescriptionEndCreate _iend, IExceptionBase iexception, IUniqueException _ithrow)
        {
            this._inew = _inew;
            this._idata = _idata;
            this._ismtp = _ismtp;
            this._idesc = _desc;
            this._icheck = _icheck;
            this._ithrow = _ithrow;
            this._iexception = _iexception;
            this._irandom = _irandom;
            this._idataDescription = _idataDescription;
            this._iend = _iend;
        }

Uznałem że nie będę pchał tu całego kodu, za duży bałagan, kontroler został wrzucony
Postanowiłem, że tam będę produkował kod poddawany refaktoryzacji ale nie tylko finalny efekt a postaram się wrzucać każdy krok. 


Pierwsze co się rzuca w oczy to za dużo interfejsów w konstuktorze oraz za dużo kodu.
Zmniejszamy kod.
  1. Utworzyłem nowy interfejs ISendingVeryfyingEmail do klasy SendingVeryfyingEmail która służy za wysyłanie mejla z numerem weryfikującym oraz ma za zadanie dopisać do tabeli kartoteka czasowa, że taki zawodnik próbuje się zarejestrować, w tej tabeli jest również czas rejestracji - limit ustawiony na 5 minut. Kod na  GitHub.
  2. Utworzyłem nowy interfejs ISendingConfirmationRegistrationEmail do klasy SendingConfirmationRegistrationEmail, która służy za przygotowanie i wysłanie mejla potwierdzającego rejestracje na maratonie  github.
  3. To nie koniec, uznałem że nowo powstała klasa SendingVerifyingEmail ma za dużo parametrów a dwa interfejsy ISMTP_Configuration oraz ICheckWerification zapakowałem do jednego miecha dzięki temu klasa SendingVerifyingEmail wykorzystuje trzy interfejsy zamiast czterech wartość ta dopuszczalna jest. Kod na github .
  4. Może by tak skończyć? nie, kolejnym krokiem mogła by być zmiana nazw klas bo są nie co mylące i podobne, po za tym dalej mam za dużo parametrów w kontrolerze, pięć.Teraz wygląda tak:
private readonly IDataVerification _idata;
        private readonly IUniqueException _ithrow;
        private readonly ISendingVerifyingEmail _isendingVer;
        private readonly ISendingConfirmationRegistrationEmail _isendingEnd;
        private readonly ICheckWerification _icheck;


        public VerificationEmailController( IDataVerification _idata,ISendingVerifyingEmail isendingE, IUniqueException _ithrow,
            ISendingConfirmationRegistrationEmail _isending, ICheckWerification _icheck)
        {
            this._idata = _idata;
            this._ithrow = _ithrow;
            this._isendingVer = isendingE;
            this._isendingEnd = _isending;
            this._icheck = _icheck;
        }
Zmniejszenie o 50% ale muszę dojść do trzech parametrów, teraz trochę bardziej dogłębna analiza.
Trochę się z tym re_fak_toringiem zamotałem, zmniejszyłem ilość metod w klasie CheckWerification z trzech na dwie, uznałem że to co wykonują te dwie można by wrzucić do jednej.
Miało się uprościć, a się skomplikowało (jak zawsze).

    5. Jednak się udało, a to z powodu nadużycia pierwszej zasady Solida (pojedynczej odpowiedzialności), czyli dziel z głową. Kod Github.

Pytanie czy to jeszcze działa pozostaje otwarte.

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 ...