Clean Vertical Slice Architecture
Wanneer goed geΓ―mplementeerd, vertonen
Clean Architecture en
Vertical Slice Architecture opvallende overeenkomsten.
Onenigheden tussen voor en tegenstanders ontstaan vaak door
misverstanden in plaats van door gebreken in de concepten.
Kritiek op Clean Architecture:
- Verspreiding van code door de codebase
- Strakke koppeling tussen functies
- Onnodige complexiteit
Zijn deze kritieken werkelijk op Clean Architecture gericht, of eerder een gevolg van een slechte package cohesion strategie?
Clean Architecture
Slechte Clean Architecture
Veel implementatie- en projecttemplates hebben de neiging om classes te categoriseren op type, wat lijkt op de bekende structuur van MVC-projecttemplates.
MySolution.sln
π MyCompany.MyProject.Api
π Controllers
π AccountController.cs
π OrderController.cs
π MyCompany.MyProject.Application
π Interfaces
π IAccountRepository.cs
π IAccountService.cs
π IOrderRepository.cs
π IOrderService.cs
π Services
π AccountService.cs
π OrderService.cs
π Validators
π AccountValidator.cs
π OrderValidator.cs
π MyCompany.MyProject.Domain
π Account.cs
π Order.cs
π MyCompany.MyProject.Infrastructure
π AccountRepository.cs
π OrderRepository.cs
Navigeren door verschillende mappen om de Order-functionaliteit aan te passen is omslachtig. Deze simplistische organisatorische benadering, hoewel aanvankelijk intuΓ―tief, faalt om effectief te schalen. Het is als het opslaan van alle sokken in één ladeβgeschikt voor één persoon maar onpraktisch voor een groter huishouden.
Ik wed dat je je sokken scheidt van die van je partner, en dat elk van je kinderen de sokken in zijn of haar eigen kamer heeft opgeslagen.
Betere clean architecture
MySolution.sln
π MyCompany.MyProject.Api
π Controllers
π AccountController.cs
π OrderController.cs
π MyCompany.MyProject.Application
π Accounts
π Account.cs
π AccountService.cs
π AccountValidator.cs
π IAccountRepository.cs
π IAccountService.cs
π Orders
π IOrderRepository.cs
π IOrderService.cs
π Order.cs
π OrderService.cs
π OrderValidator.cs
π MyCompany.MyProject.Infrastructure
π AccountRepository.cs
π OrderRepository.cs
Bepaalde details zijn staan open voor discussie en kunnen variΓ«ren afhankelijk van de specifieke kenmerken van je applicatie. Bijvoorbeeld:
- Domeinobjecten kunnen samen gegroepeerd worden in een map of kunnen geplaatst worden in de featuremap.
- De groepering van controllers en repositories kan worden aangepast afhankelijk van de applicatie.
Vertical Slice Architecture komt voor uit een goed ontworpen Clean Architecture.
Vertical Slice Architecture
Wat dacht je van het integreren van AccountRepository.cs
in de Accounts-map? Zeker. En de AccountController.cs? Het
samenvoegen zou de architectuur niet wijzigen.
Extreme Vertical Slice Architecture
MySolution.sln
π MyCompany.MyProject.Api
π Accounts
π Account.cs
π AccountController.cs
π AccountRepository.cs
π AccountService.cs
π AccountValidator.cs
π IAccountRepository.cs
π IAccountService.cs
π Orders
π IOrderRepository.cs
π IOrderService.cs
π Order.cs
π OrderController.cs
π OrderRepository.cs
π OrderService.cs
π OrderValidator.cs
Het is belangrijk om afhankelijkheden zo ver mogelijk naar de rand van je applicatie te duwen. Het voorkomen dat webgerelateerde elementen doordringen in services of databasedetails validators besmetten, is van het grootste belang.
Sommige implementaties van Vertical Slice Architecture falen echter wanneer de architectuur het niet ontmoedigd om code op de verkeerde plekt te plaatsen.Externe afhankelijkheden zoals ORM en web frameworks kunnen onbedoeld de kernapplicatielogica binnendringen, wat leidt tot koppeling van bedrijfslogica aan implementatiedetails.
Vertical Slice Clean Architecture
Het gebruik van een mappenstructuur kan helpen om de onderscheidingen te verduidelijken. Waardoor de oplossing weer geleidelijk op Clean Architecture begint te lijken.
MySolution.sln
π MyCompany.MyProject.Api
π Accounts
π Presentation
π AccountController.cs
π Core
π Account.cs
π AccountService.cs
π AccountValidator.cs
π IAccountRepository.cs
π IAccountService.cs
π Infrastructure
π AccountRepository.cs
Afzonderlijke projecten zijn te verkiezen om het gebruik van externe afhankelijkheden binnen de kern van de applicatie te voorkomen.
Clean vs Vertical Slice Architectures
Wanneer je goed kijkt, beginnen Clean en Vertical Slice Architecture als twee handen op één buik te lijken. Ze streven beide naar modulaire, flexibele ontwerpen die gemakkelijk te onderhouden en schalen zijn. De kleine verschillen komen voornamelijk neer op hoe ze in de praktijk worden gebracht. Wanneer je ze goed implementeert, eindig je met software die gemakkelijk te gebruiken, aanpasbaar en betrouwbaar is.
Referenties
- Clean Architecture - Amazon
- Hexagonal Architecture - Wikipedia
- Package Principles - Wikipedia
- Vertical Slice - Wikipedia
- Clean Architecture is About Vertical Slices - YouTube