Modele de proiectare de tutoriale - Puterea OOP (partea 1)

Model de constructor - Fațetat și fluent

Actualizat la 2 octombrie 2019, 02:10 GMT 5: 30+
Multe mulțumiri lui Uran pentru această ilustrare minunată!

Premise - Această serie de bloguri necesită un nivel intermediar de expertiză în programarea orientată pe obiecte. Ar trebui să aveți cunoștințe de bază despre clasă, obiect, constructor, moștenire, valoare și tip de referință. Un intermediar va dobândi cunoștințe, iar experții îi vor accentua cunoștințele citind această serie de la început până la sfârșit.

Modelele de proiectare sunt utilizate pentru a reprezenta cele mai bune practici adoptate de comunitatea de dezvoltatori de software orientată spre obiecte cu experiență.

Modelul de design al constructorului ne ajută să construim un obiect într-un mod mai simplu și mai ușor de citit. Modelul de proiectare al constructorului respectă două reguli simple, menționate mai jos.

  1. Separați reprezentarea clasei originale și metodele de construcție ale acesteia.
  2. returnează instanța clasei în ultimul pas

Cel mai bun exemplu de model de design al constructorului este SwiftUI, da, ai citit corect. SwiftUI utilizează modelul de design al constructorului pentru majoritatea claselor sale, de ex. Text, imagine

Problemă:

Gândiți-vă la afirmația din clasă Persoană care are zece sau mai multe proprietăți, imaginându-și designul constructorului atunci când trebuie să creați o instanță a clasei Persoana. Constructorul său va lua zece sau mai multe argumente, va fi greu să gestionați aceste numeroase argumente ca o singură funcție sau constructor și, în cele din urmă, veți pierde lizibilitatea codului. consultați exemplul de mai jos.

Încercați să rulați exemplul de mai sus în locul de joacă, acesta va rula cu succes și vă va oferi o ieșire așteptată. Logic este corect.

Putem îmbunătăți exemplul de mai sus, depășind punctele de mai jos.

  1. Trebuie să trecem valorile într-o ordine menționată, nu putem reordina secvența de parametri pentru a îmbunătăți lizibilitatea.
  2. Trebuie să trecem toate valorile, chiar dacă nu cunoaștem unele valori la momentul creării obiectului.

De exemplu. Să presupunem că trebuie să creezi un obiect din clasa Persoană, dar persoana respectivă încă găsește un loc de muncă. Atunci când persoana respectivă se va alătura oricărei companii, doar vom avea detalii despre lucrări.

Soluţie:

  1. Creați grupuri logice de proprietăți conexe.
  2. Creați clase de constructor separate pentru diferite grupuri de proprietăți [ajută la normalizarea proprietăților, aceasta este opțională].
  3. Obțineți o instanță în pasul final.

Să simplificăm acest lucru cu un exemplu,
Avem deja o clasă numită Persoană, de exemplu WithoutDesignPatternExample1.swift, în care avem 14 proprietăți. Dacă verificăm îndeaproape toate cele 14 proprietăți, proprietățile au 4 grupuri logice.

  1. Proprietăți cu detalii personale
  2. Proprietățile detaliilor de contact
  3. Proprietățile detaliilor adresei
  4. Detaliile companiei

Modelul de design fațet și fluent împreună ne ajută să depășim cele două probleme menționate mai sus.

În exemplul de mai sus, am separat responsabilitățile clasei de persoane în clase diferite. Clasa de persoane deține acum doar proprietățile datelor, în timp ce am creat mai multe clase de constructor care au responsabilități pentru a construi / actualiza grupul relativ de proprietăți.

Avem o clasă de constructor de bază PersonBuilder și avem încă patru clase de constructor derivate numite PersonPersonalDetailsBuilder, PersonContactDetailsBuilder, PersonAddressDetailsBuilder și PersonCompanyDetailsBuilder.

Clasa de bază PersonBuilder ne ajută să comutăm între mai mulți constructori oricând, în timp ce alți patru constructori derivați de la PersonBuilder au responsabilitățile de a actualiza proprietățile relative.

În exemplul de mai sus, putem vedea clar că construcția unui obiect Person este mai lizibilă în comparație cu primul nostru exemplu WithoutDesignPatternExample1.swift, de asemenea, putem actualiza grupul de proprietăți sau orice proprietate unică în orice moment, într-o manieră mai lizibilă.

În exemplul de mai sus, rețineți că ne întoarcem instanța constructorului propriu-zis după ce apelăm la fiecare metodă de actualizare a proprietății. Ceea ce ne ajută să scriem înlănțuirea mai multor metode ale aceluiași constructor în loc să scriem mai multe linii separat. Acest concept este cunoscut sub numele de Fluent pattern.

Beneficii:

  1. Inițializați ușor un obiect al unei clase care are prea multe proprietăți într-o manieră mai lizibilă.
  2. Urmează principiul responsabilității unice.
  3. Inițializează proprietățile obiectului sau actualizează în orice ordine, în funcție de comoditatea ta

Primă:

Pentru ca modelul constructorului să fie consecvent pe întregul proiect, puteți crea protocolul ca mai jos.

Ți-a plăcut acest articol?
Dă claps și arată-ți sprijinul.
Nu vă costă nimic să aplaudați.

De unde să plec de aici?

Citiți mai multe bloguri din pagina mea de index

Găsiți depozitele mele pe Github
Urmărește-mă pe Twitter