En hurtig introduktion til ren arkitektur

I et open source-projekt, som jeg begyndte at bidrage til, blev begrebet ”ren arkitektur” bragt til mig.

For det første var det ret overvældende, men efter nogen læsning var det fornuftigt. Jeg troede, det kunne være nyttigt for andre, hvis jeg skrev mine tanker ned.

Indholdsfortegnelse

  • Visuelle repræsentationer
  • Konceptet - præsenteret i punkttegn
  • Kodeeksempel
  • Ressourcer

Visuelle repræsentationer

Jeg synes det er altid godt at starte med en vis visualisering.

Her er de mest almindelige billeder af dette koncept.

Konceptet - præsenteret i punkttegn

Udvidet fra kilde og kredit: Mattia Battiston, under CC BY 4.0

Den værdi, den kan give

  • En effektiv teststrategi, der følger testpyramiden
  • Rammer er isoleret i individuelle moduler. Når (ikke hvis) vi skifter mening, er vi kun nødt til at foretage en ændring ét sted. Appen har brugssager snarere end at være bundet til et CRUD-system
  • Skrigende arkitektur aka det skriger sin tilsigtede brug. Når du ser på pakkestrukturen, får du en fornemmelse for, hvad applikationen gør i stedet for at se tekniske detaljer
  • Al forretningslogik er i en brugssag, så det er let at finde og ikke duplikeres andre steder
  • Svært at gøre den forkerte ting, fordi moduler håndhæver afhængighed af kompilering. Hvis du prøver at bruge noget, som du ikke er beregnet til, kompilerer appen ikke
  • Det er altid klar til implementering ved at lade ledningerne op på objektet til sidst. Eller ved at bruge funktionsflag, så vi får alle fordelene ved kontinuerlig integration
  • Flere arbejder på historier, så forskellige par nemt kan arbejde på den samme historie på samme tid for at fuldføre den hurtigere
  • God monolit med klare brugssager, som du kan opdele i mikrotjenester senere, når du har lært mere om dem

Enheder

  • Repræsentér dit domæneobjekt
  • Anvend kun logik, der generelt gælder for hele enheden (f.eks. Validering af værtsnavnets format)
  • Almindelige objekter: ingen rammer, ingen kommentarer

Brug sager

  • Repræsentér dine forretningshandlinger: det er hvad du kan gøre med applikationen. Forvent en brugssag for hver forretningshandling
  • Ren forretningslogik, almindelig kode (undtagen måske nogle værktøjsbiblioteker)
  • Brugssagen ved ikke, hvem der har udløst det, og hvordan resultaterne skal præsenteres (for eksempel kunne være på en webside eller - returneret som JSON, eller blot logget osv.)
  • Kaster forretningsundtagelser

Grænseflader / adaptere

  • Hent og gem data fra og til et antal kilder (database, netværksenheder, filsystem, tredjeparter osv.)
  • Definer grænseflader til de data, de har brug for for at anvende en vis logik. En eller flere dataudbydere implementerer grænsefladen, men brugssagen ved ikke, hvor dataene kommer fra
  • Implementere de grænseflader, der er defineret af brugssagen
  • Der er måder at interagere med applikationen på og involverer typisk en leveringsmekanisme (for eksempel REST API'er, planlagte job, GUI og andre systemer)
  • Udløs en brugssag, og konverter resultatet til det relevante format til leveringsmekanismen
  • controlleren til en MVC

Eksterne grænseflader

  • Brug den ramme, der er mest passende (de alligevel vil blive isoleret her alligevel)

Kodeeksempel

Se strukturen på GitHub.

Først og fremmest er det vigtigt at forstå, at ren arkitektur er et bundt af organisationsprincipper. Så derfor er alt åbent for personlige justeringer, så længe kerneideer holdes intakte. Det sammenkædede arkiv er en fork af det oprindelige projekt, der bragte denne arkitekturdesignide til mig. Du er også velkommen til at tjekke det originale projekt, da det afspejler yderligere forbedringer.

Webminer-mappen er struktureret i de grundlæggende lag:

  1. enheder
  2. brug_tilfælde
  3. interfaces_adapters
  4. eksterne_grænseflader

Det skal afspejle den meget grundlæggende tilgang til designmønsteret.

  • Fra og med entitieskan du se, at kernemodellen for dette projekt erarxiv_document
  • Den næste mappe use_casesviser vores brugssag, nemlig at anmode om arxiv-siden
  • Derefter går vi gennem den interface_adaptersmappe, der indeholder adaptere til procesanmodninger i en REST-applikation eller til serialisering
  • Det sidste og sidste lag er external_interfaces. Det er her, vi bruger kolbeserveren til at implementere REST-funktionaliteten

Alle disse lag er afhængige af kernelagene, men ikke omvendt.

En vigtig note: Dette er ikke 100% korrekt implementeret i arkivet.

Hvorfor? Fordi brugssagerne faktisk er forskellige. I virkeligheden er det primære anvendelsesområde at levere de strukturerede data. En anden brugssag er at hente dataene fra arxiv-siden.

Har du fundet denne fejl i arkitekturen? Hvis ja, tillykke! Ikke kun bragte du nok nysgerrighed til denne artikel, men du forstår sandsynligvis principperne godt nok til at opbygge din egen sag og anvende begreberne i virkeligheden!

Er du enig? Hvis ikke, hvorfor? Tak, fordi du læste min artikel! Du er velkommen til at efterlade feedback!

Ressourcer

Her er nogle artikler, som jeg fandt nyttige til forståelse af begrebet "ren arkitektur":

  • //8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
  • //www.codingblocks.net/podcast/clean-architecture-make-your-architecture-scream/
  • //github.com/mattia-battiston/clean-architecture-example
  • //medium.com/@tiagoflores_23976/how-choose-the- passende-ios-architecture-mvc-mvp-mvvm-viper-or-clean-architecture-2d1e9b87d48
  • //de.slideshare.net/HimanshuDudhat1/mvp-clean-architecture
  • //softwareengineering.stackexchange.com/questions/336677/what-is-the-difference-between-mvp-and-clean-architecture
  • //engineering.21buttons.com/clean-architecture-in-django-d326a4ab86a9
  • //gist.github.com/ygrenzinger/14812a56b9221c9feca0b3621518635b
  • //medium.freecodecamp.org/how-to-write-robust-apps-consistently-with-the-clean-architecture-9bdca93e17b
  • //marconijr.com/posts/clean-architecture-practice/

Daniel er en LL.M. studerende i forretningsret, arbejder som softwareingeniør og arrangør af teknologirelaterede begivenheder i Wien. Hans nuværende personlige læringsindsats fokuserer på maskinlæring.

Opret forbindelse:

  • LinkedIn
  • Github
  • Medium
  • Twitter
  • Steemit
  • Hashnode