Kort om det viktigaste: Clean Architecture, Robert C. Martin

Detta kommer att vara en berÀttelse om mina intryck av boken, och nÄgra begrepp och kunskaper som har lÀrt sig tack vare den.

Arkitektur

Kan du, nÀr du lÀser den hÀr publikationen, ge ett klart svar pÄ frÄgan, vad Àr arkitektur? Vad Àr arkitektur i sammanhanget av programmering och design? Vilken roll spelar den? Det finns ganska mÄnga oklarheter kring denna term. Det verkar som att allt Àr förstÄeligt, men pÄ nÄgot sÀtt abstrakt och utan precision. Martin anser, och jag instÀmmer med honom, att en applikation har tvÄ komponenter:

  1. Beteende (behavior) – de funktioner och uppgifter som programmet (komponenten, tjĂ€nsten) utför.
  2. Arkitektur – denna term handlar i hög grad om att förĂ€ndra applikationen.

Men Àven om applikationen mycket vÀl utför den uppgift den ska, betyder det inte att den har en bra arkitektur. Arkitektur handlar inte om en applikations beteende. Arkitektur handlar om enkelheten i att förÀndras, arkitektur handlar om enkelheten i att distribueras, arkitektur handlar om oberoende utveckling. Arkitektur handlar om hastigheten med vilken en ny person i teamet förstÄr.

Och hur man bygger denna arkitektur, hur man slipper huvudvÀrken vid smÄ förÀndringar av krav frÄn PM:en, eller frÄn intressenten: det Àr vad boken kommer att berÀtta om.

Om författarna

Innan jag pratar mer om denna bok, vill jag sÀga lite om mig sjÀlv.
Just nu Àr jag en Strong Junior Developer, som specialiserar sig pÄ att utveckla tjÀnster med ASP .NET CORE.

Jag har arbetat pÄ en "galleri" i ett Är, och verkar sÄ smÄtt klara av det.

Jag har redan lÀst denna bok tvÄ gÄnger, och jag rekommenderar lÀsning till alla:

  • utvecklare av embedded system;
  • frontend-utvecklare;
  • backend-utvecklare;
  • och till och med DevOps.

Kort sagt, till alla som pÄ nÄgot sÀtt Àr involverade i mjukvaruutveckling, hÀr menar jag direkt utveckling av olika saker, vi tar inte med PM:er hÀr (Àven om det ocksÄ skulle vara nyttigt att veta varför devs ibland lÀgger dubbelt sÄ mycket tid pÄ en uppgift), jag rekommenderar att lÀsa denna bok.
Och nu ska jag försöka argumentera för varför jag tycker sÄ.

Lite om författaren till den hĂ€r boken (eftersom författarens auktoritet spelar en stor roll för mig). Jag tror att du förstĂ„r mig, Ă€ven om det inte alltid Ă€r korrekt, men nĂ€r en auktoritativ person inom sitt omrĂ„de pratar — sĂ„ ger det mycket mer förtroende för vad som sĂ€gs. Till exempel, jag tror att du har större tro pĂ„ diagnosen som lĂ€karen ger, Ă€n pĂ„ nĂ„gon okĂ€nd person frĂ„n folkmassan (som har googlat symtom).

Robert Martin — Ă€ven kĂ€nd som Uncle Bob — har arbetat inom programmering, inklusive olika system (frĂ„n webbtjĂ€nster till inbyggda system), sedan 1970-talet. Han Ă€r teknisk konsult och arkitekt, har skrivit för olika tekniska tidskrifter, och Ă€r i grunden en mycket erfaren programmerare, och en person som spelade en nyckelroll i skapandet av de vĂ€lkĂ€nda SOLID-principerna (man kan sĂ€ga att han Ă€r skaparen). Jag vill ocksĂ„ nĂ€mna att denna bok rekommenderades av min teamledare med över 15 Ă„rs erfarenhet.

Om boken

Beroenden

Innan jag lÀste boken, hade jag lÀst en hel del artiklar pÄ Habré dÀr ordet "beroende" nÀmndes. Vad innebÀr det, vem beror pÄ vem, vad betyder det konkret att "hÀnga pÄ", och hur kan en klass bero pÄ nÄgon annan?

Och med tiden nÀr jag lÀste boken insÄg jag tvÄ punkter:

Beroende — Ă€r en term som innebĂ€r att en viss klass (komponent, tjĂ€nst) kĂ€nner till en annan klass (komponent, tjĂ€nst), och denna kunskap definieras i koden (nu kommer Java- och C#-programmerare att förstĂ„ mig) genom ett visst namnrymdimport. Med andra ord: om du har klass A med namnrymden Default.Classes och klass B med Another.Classes. SĂ„ om det i kĂ€llkoden för klass A stĂ„r using Another.Classes; — betyder det att klass A Ă€r beroende av klass B.
För att förstÄ schemat, se pÄ riktningen av pilen: i 1) kommer pilen att peka frÄn klass A mot klass B. Det betyder att klass B Àr mer oberoende Àn klass A. Och förÀndringar i klass A kommer inte att orsaka nÄgot "skada" för klass B.

Kort om det viktigaste: Clean Architecture, Robert C. Martin

SOLID

En av de frĂ€msta anledningarna till att jag lĂ€ste denna bok — Ă€r förklaringen av SOLID-principerna frĂ„n första kĂ€llan, eftersom farbror Rob utvecklade dessa principer och man kan sĂ€ga att det Ă€r tack vare honom som vi hör detta namn — SOLID.
För dem som inte vet - dessa principer sÀger att man ska designa sina applikationer i enlighet med fem regler:

S — SRP (Principen om enkel ansvarighet)
O — OCP (Principen om öppen-stĂ€ngdhet)
L — LSP (Liskovs substitutionsprincip)
I — ISP (Principen om grĂ€nssnittets segregations)
D — DIP (Principen om beroendeinversion)

Alla dessa principer kan tillÀmpas pÄ nivÄer av klasser och objekt, pÄ nivÄer av moduler och komponenter, och pÄ nivÄer av lager (tjÀnster).

Om du tycker att principen om enkel ansvarighet handlar om att en klass eller modul bara ska göra en enda sak - dÄ mÄste du lÀsa Ätminstone kapitlet om SOLID. För den definition som ges ovan Àr en konsekvens, och inget annat Àn sjÀlva definitionen av principen.

Om beroendeinversion

Jag vill sĂ€rskilt pĂ„peka förklaringen av principen om beroendeinversion (den som Ă€r D i SOLID). Under lĂ€sningen av boken insĂ„g jag att det inte bara Ă€r en princip, utan ocksĂ„ en mekanism och ett verktyg, med hjĂ€lp av vilket du kan Ă€ndra riktningen pĂ„ dina beroenden och göra, till exempel, affĂ€rslogiken (DOMÄN) oberoende av detaljerna i implementeringen av datatillgĂ„ngslagret (DAL).

Kort om det viktigaste: Clean Architecture, Robert C. Martin

Även om sjĂ€lva principen, tillsammans med de andra i SOLID, har en nĂ„got annan innebörd Ă€n mekanismen, sĂ„ anvĂ€nds mekanismen genom hela boken, och det Ă€r en av de grundlĂ€ggande metoderna för att invertera och Ă€ndra riktningen pĂ„ dina beroenden, som för övrigt anvĂ€nds i DDD.

Om beslut kring arkitektur

Mycket ofta nÀmner boken principen om att fatta viktiga arkitekturmÀssiga beslut: vilken databas man ska anvÀnda, vilket ramverk man ska anvÀnda, vilken bibliotek man ska koppla in, vilket man ska anvÀnda som sökmotor etc.

SĂ„ författaren anser: du ska FÖRSÖKA ATT MINIMERA dessa typer av beslut. Eftersom krav kan förĂ€ndras, prestandabegrĂ€nsningar kan ocksĂ„ förĂ€ndras, och den beteendemĂ€ssiga komponenten har en tendens att förĂ€ndras. Under utvecklingsprocessen kan ett beslut visa sig vara mindre effektivt Ă€n ett annat, mindre bekvĂ€mt Ă€n ett annat. Och kraften i din arkitektur kommer att avgöra hur snabbt och smĂ€rtfritt du kan byta en teknologi mot en annan (och detta bekrĂ€ftar för övrigt OCP).

Till exempel, plötsligt bestÀmmer du dig för att anvÀnda MongoDB istÀllet för PostgreSQL, eller överhuvudtaget filer, eller anvÀnda mockade data som operationerna körs i minnet. Och under vissa förhÄllanden - detta kan tvinga dig att skriva om nÀstan hela logiken.

För att undvika sÄdana situationer kan vi anvÀnda vissa mekanismer som förflyttar beslutstiden sÄ lÄngt bort som möjligt. En av dessa mekanismer Àr abstraktion.

Referenser till DDD

DDD – Domain Driven Design – Ă€r en metod för att utveckla tjĂ€nster med komplex affĂ€rslogik, kritisk för förĂ€ndringar, som syftar till att maximera förstĂ„elsen hos projektets ledande roller (PMs, försĂ€ljningschefer etc.) samt de ordinarie medlemmarna. Det handlar om att alla medlemmar i projektet ska ha ett ubiquitous language, sĂ„ att varje person kan förstĂ„ den andra och att alla tĂ€nker inom samma domĂ€n med samma affĂ€rsregler.

Om du Ă€r en anhĂ€ngare av DDD, eller vill bli en, eller om du inte förstĂ„r det men vill förstĂ„ — Ă€r boken ett mĂ„ste, sĂ€rskilt den andra delen av boken.

HÀr förklarar författaren förekomsten av Dependency Rule, och varför, genom att följa den, kommer du att bygga en korrekt applikationsarkitektur. Varför beroenden bör följa riktningen mot High Policy-komponenterna, varför domÀnen (High Policy-komponent) bör vara oberoende av infrastrukturen och hur detta kommer att förenkla din distribution och utveckling.

Kort om det viktigaste: Clean Architecture, Robert C. Martin

Abstraktion

Farbror Rob berÀttar ocksÄ om hur implementationsdetaljer kan skada ditt system och hindra det frÄn att utvecklas utan smÀrta senare.

Kom ihÄg!
DB Àr en implementationsdetalj
Kunder (Web, Mobile, etc) Àr implementationsdetaljer
Ramverk Àr implementationsdetaljer

Du bör maximalt abstrahera frÄn allt detta och inte vara beroende, genom att anvÀnda den ovan beskrivna Dependency Inversion med grÀnssnitt och abstraktioner, Dependency Rule och andra mekanismer.

Metoder för moduluppbyggnad

Detta avsnitt gillade jag extra mycket som utvecklare av tjÀnster i ASP .NET CORE. HÀr diskuteras metodologier för att bygga en enhetlig arkitektur för tjÀnsten av fÀrdiga komponenter.

Robert beskrev fyra möjliga scheman för uppdelning av lager.

Han pĂ„pekade varför den sĂ„ ofta anvĂ€nda mekanismen för tre-lagersarkitektur: UI (controllers), TjĂ€nster (Domain), DAL (Databas) – Ă€r ganska dĂ„lig jĂ€mfört med andra. Jag har inte sett sĂ„ mĂ„nga projekt, men i varje exempelvis mikro-tjĂ€nst pĂ„ backend anvĂ€nds precis tre-lagersarkitekturen.

OcksĂ„, anvĂ€nds ofta en komponent-till-en-tjĂ€nst-arkitektur. Överlag Ă€r de bĂ„da ganska bra, men den har en hel del nackdelar i jĂ€mförelse med hur arkitekturen byggs vid anvĂ€ndning av DDD, sĂ€rskilt vid kritiska förĂ€ndringar och komplexa tjĂ€nster.

Sammanfattningsvis har jag kommit till slutet av denna recension av boken. Jag tyckte verkligen om boken, jag Ă„ngrar inte att jag lĂ€ste den, tack till författaren. Till er, kĂ€ra lĂ€sare, tack för er uppmĂ€rksamhet, döm inte för hĂ„rt — detta inlĂ€gg Ă€r baserat pĂ„ intrycket av boken och min personliga entusiasm.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster