Merhaba Sevgili Okurlar,
Bu yazımda yazılım dünyasında önemli bir yere sahip bir uygulama geliştirirken kullandığımız bir architectural pattern olan Clean Architecture'den bahsedeceğim.
Öncelikle Clean Architecture günümüze kadar gelirken ilk olarak aşağıdaki mimarı pattern'lerden evrildi.
- Hexagonal Architecture
- Onion Architecture
- Domain-Driven Design (DDD) or Domain Centric Architecture
- Vertical Slice Architecture
- Clean Architecture
Bir uygulamayı kodlamadan önce hangi mimariyi seçeceğiniz oldukça önem taşıyor. Projenin ihtiyaçları da en önemli kriterlerden biri. Uygulamayı kaç kişi kullanacak? Müşterinin isteği nedir? Ekibin bilgisi ne düzeyde? Proje deadline'ı nedir? CAP Teoremini göz önünde bulundurmak faydalı olacaktır.
Projenin bakımı (maintainable), ölçeklenebilir olması (scalable), spagetti code oluşturmaktan kaçınmak, (yeniden kullanılabilir) reusable olmak, kod tekrarından kaçınmak (dublication) soyutlama (abstraction), kodun okunabilir olması (readable) bir projede önemli etkenler. Yazılım dünyası literatüründe olmayan bir yapı ya da herhangi bir mimarisi olmayan projeler geliştiriciler için okunması, anlaşılması zor hale geliyor.
Öyleyse hadi Clean Architecture'i inceleyelim. Clean Architecture Robert C. Martin (Uncle Bob)'in ortaya attığı bir yaklaşım. Ana mantık Seperation of Concerns, yazılımı katmanlara bölüp anlaşılabilir parçalara bölmek, birbirleri ile olan bağımlılığı azaltmak.
Clean Arhitecture aşağıdaki katmanlardan oluşuyor:
- Infrasturcture
- Domain
- Application
Domain Services vs Application Services
Domain Services Katmanı
Infrasturcture Katmanı
Application Katmanı
Son olarak Application katmanını inceleyelim. Application katmanı domain'in uygulandığı proje için gerekli useCase'lerin implemente edildiği katmandır. Domain modelleri ve DTO'lar da bu katmanda map edilir. Bu katmanda eğer bir API yazıyorsak Controllar'lar, ViewModels ya da DTO'lar, Mappers, Validators, Application Exceptions, Application Logic, Eğer CQRS kullanıyorsak Command/Queries'i barındıran katmandır.
Ben örnek projemde Application Logic'i ayrı bir katman olarak yazdım.
Daha önce bahsettiğim gibi Application ve Domain Logic'lerini ayırmayıp hepsini Application katmanına ait olan UseCases içinde barındırabilirsiniz. DDD yaklaşımında ise kesinlikle ikisinin birbirinden ayrılması doğru.
Böylece bütün katmanları açıklamış olduk. Ben ve ekibim bütün projelerimizde bazen DDD bazen Clean Architecute uyguluyoruz. Ekip üyeleri cross-functional çalışabiliyor, geliştiriciler kodu daha iyi anlıyor ve code review'lerde kolaylık sağlıyor, en önemlisi projeyi devralan geliştirici karmaşa olmadan yoluna devam ediyor, kod karmaşıklığından kurtulmuş oluyoruz. Standartlar hayat kurtarıcı olabiliyor.
Projeyi çalıştırdığımızda aşağıdaki Swagger ekranı geliyor ve bu ekranda API'ı kolayca deneyebilirsiniz.
DDD ile ilgili olan yazımı da yakında sizlerle buradan paylaşacağım. Aşağıda faydalı kaynakları sizlerle paylaşıyorum:
Clean Architecture
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
https://www.dandoescode.com/blog/clean-architecture-an-introduction
Domain Driven Design
https://github.com/heynickc/awesome-ddd
https://copyprogramming.com/howto/where-to-put-business-logic-in-ddd
Bussiness Logic vs Application Logic
https://jonascleveland.com/difference-of-business-logic-vs-application-logic/
https://docs.abp.io/en/abp/latest/Domain-Services
Domain Driven Design vs Clean-architecture
https://khalilstemmler.com/articles/software-design-architecture/domain-driven-design-vs-clean-architecture/
Umarım faydalı olmuştur, örnek projeyi github repomda bulabilirsiniz bir sonraki yazıda görüşmek üzere.
Sağlıkla kalın.
Hiç yorum yok:
Yorum Gönder