Temiz Mimari (CA)

ASP.NET Core ile
Temiz Mimari
(Clean Architecture)

Negzel - Clean Architecture

Temiz Mimari (CA)

Giriş

Clean Architecture, Robert C. Martin (Uncle Bob) tarafından önerilen ve bağımsız katmanlardan oluşan bir yazılım mimarisidir. Bu mimari, bağımlılıkların kontrol altına alınması, kodun sürdürülebilirliği ve yeniden kullanılabilirliği açısından oldukça faydalıdır. Ardalis Clean Architecture ise, Clean Architecture prensiplerini temel alan ancak pratik uygulama ve önerilerle zenginleştirilmiş bir yaklaşımdır. Bu dokümanda Clean Architecture'ın ne olduğunu, Ardalis Clean Architecture'ın farklarını, neden tercih edilmesi gerektiğini, faydalarını ve olası dezavantajlarını detaylı bir şekilde ele alacağız.

Clean Architecture Nedir?

Clean Architecture, katmanlı mimarilerin avantajlarını modern yazılım geliştirme ihtiyaçlarına uygun hale getirerek, bağımsızlık ve esneklik sağlamak için geliştirilmiştir. Bu mimaride temel amaç, bağımlılıkların her zaman iç katmanlardan dış katmanlara doğru olmasıdır. Başka bir deyişle, iş kuralları ve domain (iş mantığı) dış dünyaya bağımlı olmamalı, tersine dış katmanlar iş kurallarına bağımlı olmalıdır.

Temiz mimari Katmanları
  • Clean Architecture'ın Temel Katmanları:

  • Entities (Varlıklar): İş kurallarının ve domain mantığının yer aldığı en iç katmandır. Uygulamanın temel iş mantığını içerir.
  • Use Cases (Kullanım Senaryoları): Uygulamanın farklı durumlarda nasıl davranacağını belirleyen iş kurallarıdır.
  • Interface Adapters (Arayüz Adaptörleri):Veritabanı ve web katmanları arasındaki bağı yönetir. Genellikle DTO'lar, Mapper'lar, Repository arayüzleri gibi öğeler burada bulunur.
  • Infrastructure (Altyapı):Veri erişimi, üçüncü taraf servis entegrasyonları gibi dış dünya ile iletişimi sağlar.
  • Presentation (Sunum):Kullanıcıya arayüz sağlayan ve uygulama ile etkileşimi yöneten katmandır (örn. ASP.NET Core Web API, MVC).
  • Clean Architecture Kullanmanın Avantajları

  • Bağımlılıkların Kontrolü: Bağımlılıkların iş kurallarından uzak tutulması sayesinde, uygulamanın iş mantığı veri erişiminden ve dış dünyadan bağımsızdır. Bu da test edilebilirliği arttırır.
  • Sürdürülebilirlik: Kodun bakımını ve yeni özellik eklemeyi kolaylaştırır. Domain odaklı bir yapı olduğundan, iş kuralları değişse bile dış katmanlar üzerinde minimal değişiklik gerektirir.
  • Test Edilebilirlik: İş mantığının ayrı katmanlarda tutulması, birim testleri yazmayı kolaylaştırır.
  • Yeniden Kullanılabilirlik: Bir iş kuralını farklı uygulamalarda veya projelerde tekrar kullanmak mümkündür.
  • Esneklik ve Adaptasyon: Yeni bir veri kaynağı veya üçüncü taraf servis entegrasyonu gerektiğinde, yalnızca ilgili dış katmanı değiştirmek yeterlidir.
  • Clean Architecture'ın Dezavantajları

Clean Architecture’ın sağladığı birçok avantajın yanı sıra, bazı dezavantajları da göz önünde bulundurulmalıdır:

  • Öğrenme Eğrisi: Clean Architecture, katmanlı yapılar ve bağımlılık yönetimi konusunda yeni olan geliştiriciler için başlangıçta karmaşık gelebilir. Bu, projenin başlangıcında bir öğrenme süreci gerektirir.
  • Başlangıç Maliyeti: Proje başlarken katmanların ayrıştırılması ve bağımlılıkların yönetilmesi, ek zaman ve efor gerektirebilir. Ancak uzun vadede bu yatırım geri dönüş sağlar.
  • Küçük Projeler İçin Aşırıya Kaçma (Overengineering): Eğer küçük bir uygulama veya basit bir iş mantığına sahip bir proje geliştiriyorsanız, Clean Architecture’ın sunduğu detaylı yapı gereğinden fazla karmaşık olabilir.
  • Clean Architecture'ın Projelerimize Sağladığı Faydalar:

  • 1. Kodun Bağımsızlığını Sağlar

    Clean Architecture’ın temel prensiplerinden biri, bağımlılıkların her zaman iç katmanlardan dış katmanlara doğru olması gerektiğidir. Bu yaklaşım, iş mantığının (domain) ve iş kurallarının dış dünyadan (veritabanı, kullanıcı arayüzü, API'ler vb.) bağımsız olmasını sağlar. Bu bağımsızlık sayesinde:

  • Veritabanı Değişikliklerinden Etkilenmezsiniz: Veri tabanı veya API'leri değiştirmek istediğinizde, iş kurallarınız veya kullanımları etkilenmez. Örneğin, SQL yerine NoSQL bir veri tabanına geçiş yapmak istediğinizde, yalnızca dış katmandaki veri erişim kodlarını değiştirmeniz yeterlidir.
  • Daha Kolay Test Edilebilirlik: İş mantığı ve iş kuralları dış katmanlardan izole edildiği için, birim testler yazmak çok daha kolay hale gelir. Mock veya Stub kullanarak dış bağımlılıkları taklit edebilir ve yalnızca iş mantığınızı test edebilirsiniz.

  • 2. Sürdürülebilirlik ve Bakım Kolaylığı Sağlar

    Clean Architecture, projelerin sürdürülebilirliğini artırarak, kodun daha uzun süre güncel ve bakım yapılabilir kalmasını sağlar:

  • Yeni Özellik Eklemek Kolaydır: İş mantığını ve kullanım senaryolarını (Use Case) belirli bir katmana izole etmek, yeni bir özellik eklemek veya var olan bir özelliği değiştirmek istediğinizde, sadece ilgili katmanda düzenlemeler yapmanıza olanak tanır.
  • Bakım Maliyetlerini Azaltır: İş mantığı ve veri erişim katmanlarının birbirinden bağımsız olması, bakımı yapılacak kodun hacmini küçültür. Bu sayede, mevcut bir hatayı düzeltmek veya yeni bir özellik eklemek daha hızlı ve düşük maliyetli hale gelir.
  • Karmaşık İş Kuralları Yönetimi: Projelerde zamanla iş kuralları karmaşıklaşabilir. Clean Architecture, iş kurallarını belirli bir katmana ayırarak bu karmaşıklığın yönetimini kolaylaştırır.

  • 3. Yüksek Esneklik ve Yeniden Kullanılabilirlik Sağlar

    Clean Architecture, uygulamanızın farklı bileşenlerini modüler hale getirir ve birbirinden bağımsız olarak değiştirme veya yeniden kullanma esnekliği sunar:

  • Tekrar Kullanılabilir İş Kuralları: İş kuralları ve kullanım senaryolarını içeren katmanlar, farklı uygulamalarda veya mikro servislerde yeniden kullanılabilir. Bu da yeni projelerde benzer iş mantıklarının hızla entegre edilmesini sağlar.
  • Bağımsız Katman Değişiklikleri: Örneğin, kullanıcı arayüzü katmanında yapılan değişiklikler iş kurallarını etkilemez. Bu da frontend ve backend ekiplerinin birbirinden bağımsız olarak
  • API veya Veri Kaynaklarını Kolayca Değiştirme: Uygulamanızda farklı veri kaynaklarına veya üçüncü taraf servislerine geçiş yapmak istediğinizde, Clean Architecture sadece ilgili katmanda değişiklik yapmanıza izin vererek geçiş sürecini kolaylaştırır.

  • 4. Test Edilebilirlik ve TDD (Test-Driven Development) Uyumlu

    Clean Architecture, test yazımını ön planda tutarak Test-Driven Development (TDD) gibi yazılım geliştirme yaklaşımlarını destekler:

  • Kolay Birim Test Yazımı: İş mantığının izole bir şekilde tutulması, iş kurallarının kolayca birim testler ile doğrulanmasını sağlar. Örneğin, bir “sipariş oluşturma” senaryosunu test etmek için veri tabanı veya dış API'lere ihtiyaç duymadan iş mantığını test edebilirsiniz.
  • Bütünleştirme Testleri için Daha Az Karmaşa: Veri erişimi veya üçüncü taraf servisler ile ilgili testler, uygulama katmanından bağımsız olduğu için daha yönetilebilir hale gelir.
  • Yüksek Güvenlik: Kodun her parçasının test edilebilir olması, hataların üretim ortamına taşınma riskini azaltır ve daha güvenilir uygulamalar geliştirmenize olanak tanır.

  • 5. Karmaşık Projelerde Yönetilebilirlik

    Küçük projeler zamanla büyüyüp karmaşık hale geldiğinde, Clean Architecture gibi bir yapıya sahip olmak, bu karmaşıklığın yönetimini kolaylaştırır:

  • Modüler Yapı: Büyük bir projeyi parçalara ayırmak, her modülün daha bağımsız yönetilmesine olanak tanır. Örneğin, bir e-ticaret uygulamasında “Ödeme” ve “Sipariş Yönetimi” gibi modüller ayrı katmanlarda tutulabilir.
  • Yeni Geliştiricilerin Ekibe Katılımı: Clean Architecture sayesinde kod yapısı net bir şekilde belirlenmiş olduğu için, yeni geliştiricilerin projeye adapte olması daha hızlı ve kolay olur.
  • Daha Kolay Refactoring: Kodun belirli katmanlarda tutulması, yeniden düzenleme (refactoring) süreçlerinde sadece ilgili katmanları etkiler, bu da genel kod kalitesini arttırır.

  • 6. Proje Uzun Ömürlülüğünü Sağlar

    Clean Architecture, yazılım projelerinin yıllar boyunca değişikliklere uyum sağlayabilmesini ve yeni teknolojilere hızlı adaptasyonu mümkün kılar:

  • Teknolojiye Bağımsız Yapı: Clean Architecture, kullanılan teknolojilere bağlı kalmadan bir yapı sunar. Bu sayede, teknolojiler değişse bile iş mantığı ve kullanım senaryoları (Use Cases) sabit kalır.
  • API Değişiklikleri: Yeni API sürümleri veya veri depolama çözümleri kullanılsa bile, uygulamanızın iş mantığı bundan etkilenmez.
  • Mikro Servislere Geçiş Kolaylığı: Clean Architecture, monolitik uygulamaların mikro servis mimarisine dönüştürülmesi için iyi bir başlangıç noktası sağlar. Her bir katman, bağımsız servisler olarak ayrıştırılabilir.

Negzel Teknoloji A.Ş. olarak Clean Architecture Kullanımı ve Tercih Sebeplerimiz

Negzel Teknoloji A.Ş. olarak yazılım geliştirme süreçlerimizde modern ve sürdürülebilir mimari yaklaşımlarını benimsemeye özen gösteriyoruz. Clean Architecture (Temiz Mimari), projelerimizde tercih ettiğimiz ve yazılım projelerimizin kalitesini, sürdürülebilirliğini artıran bir mimari yaklaşım. Bu mimariyi neden tercih ettiğimizi, nasıl uyguladığımızı ve bu yapının bize neler kazandırdığını detaylandırmak istiyorum.

  • Clean Architecture Negzel Teknoloji A.Ş. Olarak Neden Tercih Ediyoruz?

    Clean Architecture, yazılım projelerinde iş mantığını ve bağımlılıkları katmanlara ayırarak kodun daha düzenli, bağımsız ve test edilebilir olmasını sağlayan bir mimari prensiptir. Bu yapının temel amacı, uygulamanın iş mantığını kullanıcı arayüzünden, veri tabanı erişiminden ve dış servislerden izole etmektir. Negzel Teknoloji A.Ş. olarak bu mimariyi tercih etmemizin ana nedenleri şunlardır:

  • 1. Bağımsız Katmanlar ve Esneklik: Clean Architecture, uygulamadaki katmanların birbirinden bağımsız olmasını sağlar. Bu bağımsızlık sayesinde, veri tabanı veya kullanıcı arayüzü gibi dış bağımlılıklarda değişiklik yaparken iş mantığına dokunmamıza gerek kalmaz. Bu da esnekliği ve uygulamanın hızla adaptasyonunu artırır.
  • 2. Yüksek Test Edilebilirlik: Clean Architecture, iş mantığının izole olmasını sağladığı için birim testlerin yazımını büyük ölçüde kolaylaştırır. Negzel Teknoloji A.Ş. olarak geliştirdiğimiz uygulamaların güvenilirliğini ve stabilitesini artırmak amacıyla test yazımına önem veriyoruz. Bu mimari sayesinde, iş kurallarını test etmek için veri tabanı veya API gibi dış bağımlılıklara ihtiyaç duymuyoruz.
  • 3. Karmaşık Projelerde Yönetilebilirlik Geliştirdiğimiz projelerde zamanla iş kuralları ve süreçler karmaşık hale gelebilir. Clean Architecture, bu karmaşık süreçlerin yönetimini kolaylaştırmak için güçlü bir çerçeve sunar. İş kurallarını ve kullanım senaryolarını belirli katmanlarda izole ederek, karmaşıklığın yönetimini sağlarız.
  • 4. Uzun Vadeli Sürdürülebilirlik ve Bakım Kolaylığı: Clean Architecture, uygulamaların uzun vadede sürdürülebilirliğini sağlayan bir yapı sunar. Negzel Teknoloji A.Ş. olarak geliştirdiğimiz projelerin uzun ömürlü olmasını ve bakım süreçlerinin kolay gerçekleşmesini sağlamak istiyoruz. Bu mimari, kodun modüler ve net bir şekilde düzenlenmesini sağlar, böylece yeni özelliklerin eklenmesi veya mevcut özelliklerin değiştirilmesi daha az çaba gerektirir.

  • Clean Architecture'ın Bize Sağladığı Avantajlar

    Negzel Teknoloji A.Ş. olarak Clean Architecture kullanmanın bize sağladığı bazı önemli avantajlar şunlardır:

  • 1. Yüksek Güvenilirlik: İş mantığı ve veri erişimi birbirinden ayrıldığı için, veri tabanı veya üçüncü taraf servislerdeki hatalar uygulamanın genel işleyişini etkilemez. Bu da daha stabil ve güvenilir uygulamalar geliştirmemizi sağlar.
  • 2. Geliştirici Deneyimi ve Takım Çalışması: Clean Architecture, ekibimizdeki geliştiricilerin belirli sorumluluklar almasını ve belirli katmanlar üzerinde odaklanmasını sağlar. Frontend ve backend geliştiricilerinin birbirinden bağımsız çalışabilmesi, geliştirme sürecini hızlandırır.
  • 3. Kolay Refactoring ve Ölçeklenebilirlik: Proje büyüdükçe veya yeni özellikler eklendikçe, belirli katmanlarda düzenleme yapmamız gerektiğinde, Clean Architecture bize kolay refactoring imkanı sağlar. Bu sayede, uygulamanın ölçeklenmesi ve yeni özelliklerin eklenmesi daha kolay hale gelir.
  • 4. Mikro Servis Geçişine Hazırlık: Clean Architecture’ın modüler yapısı sayesinde, monolitik uygulamalarımızı gerektiğinde mikro servis yapısına dönüştürebiliriz. Her katman, bağımsız bir mikro servis olarak ayrıştırılabilir.
  • 5. İş Kurallarının Tekrar Kullanımı: İş kuralları ve kullanım senaryolarının bağımsız yapısı, farklı projelerde tekrar kullanılabilir. Bu da yeni projelerin geliştirilmesi sırasında zaman kazandırır ve aynı iş kurallarının farklı projelerde uygulanmasını sağlar.

  • Clean Architecture'ı Negzel Teknoloji A.Ş. Olarak Nasıl Kullanıyoruz?

    Projelerimizde Clean Architecture'ın sağladığı prensipleri ve modüler yapıyı uygularken, farklı katmanları belirli sorumluluklara göre ayrıştırıyoruz. Projenin daha yönetilebilir, test edilebilir ve sürdürülebilir olmasını sağlamak için bu yapıyı kullanıyoruz. Katmanlar şu şekilde tanımlanmış:

  • 1.Application Layer:
    • Bu katman, iş süreçlerinin ve kullanım senaryolarının (use cases) yönetildiği katmandır.
    • Uygulama mantığı, servisler ve veri transfer nesneleri (DTOs) burada yer alır.
    • Örneğin, bir kullanıcıdan gelen talebi işlemek veya iş kurallarını uygulamak için gerekli işlemleri burada gerçekleştiririz.
    • Bu katmanın, doğrudan veri tabanı veya dış servislerle iletişimi yoktur.
  • 2.Core Layer:
    • Bu katman, domain mantığının, yani iş kurallarının ve veri modellerinin yer aldığı katmandır.
    • Entity sınıfları, business logic ve domain servisleri gibi unsurlar burada tanımlıdır.
    • İş kurallarının merkezde olduğu ve dış dünyadan izole edilmiş bu katman, projelerimizin esnek ve test edilebilir olmasını sağlar.
  • 3.DependencyInversion Layer:
    • Bu katman, Dependency Injection (bağımlılık enjeksiyonu) ve IoC (Inversion of Control) container ayarlarının yapıldığı katmandır.
    • Projedeki bağımlılıkları yönetmek ve uygulama içerisindeki servislerin yaşam döngüsünü kontrol etmek için kullanılır.
    • Örneğin, veri erişim servislerini ya da harici API'leri bu katman üzerinden uygulamaya dahil ederiz.
    • Bu katman, uygulamanın bağımlılıklarını merkezi bir şekilde yönetmemizi sağlar, böylece bağımlılıkları kolayca değiştirebiliriz.
  • 4.Infrastructure Layer:
    • Veri tabanı erişim katmanı, harici API çağrıları ve üçüncü parti kütüphanelerle yapılan entegrasyonlar bu katmanda yer alır.
    • Repository pattern kullanılarak veri tabanına erişim sağlanır ve veri okuma/yazma işlemleri gerçekleştirilir.
    • Bu katman, dış dünyayla iletişim kurar ve Application katmanına bu verileri sağlar.
    • Örneğin, veri tabanı migration'ları, veri erişim servisleri ve dış API istemcileri burada yer alır.
  • 5.SharedKernel Layer:
    • Proje genelinde sıkça kullanılan, domain'e ait olmayan fakat birden fazla katman tarafından kullanılabilecek olan ortak nesneler burada tanımlanır.
    • Özellikle, exception handling, eventler, genellikle utility sınıflar ve bazı yardımcı metotlar bu katmanda yer alır.
    • Bu katmanın, bağımsız bir yapı olarak diğer projelerde veya modüllerde yeniden kullanılabilir olmasını amaçlıyoruz.
    • Negzel Teknoloji A.Ş. olarak, projelerimizde tekrar kullanımı artırmak ve modülerliği sağlamak için SharedKernel’i kullanıyoruz.
  • 6.Tests Layer:
    • Projedeki birim testlerin ve entegrasyon testlerinin yer aldığı katmandır.
    • Her katmanın bağımsız olarak test edilebilmesi, bu katmanın temel amacıdır.
    • Özellikle iş kuralları, veri erişim yöntemleri ve servislerin işleyişi buradaki testlerle doğrulanır.
    • Test yazımı, yazılım kalitemizi artırmak ve olası hataları minimuma indirmek için Clean Architecture’ın temel bir parçasıdır.
  • 7.UI Layer:
    • Kullanıcı arayüzü (UI) veya API uç noktalarının tanımlandığı katmandır.
    • Kullanıcıdan gelen isteklerin karşılandığı ve Application katmanına yönlendirildiği yer burasıdır.
    • API endpoint'leri veya MVC yapıları bu katmanda yer alır.
    • Kullanıcı arayüzünde yapılan değişikliklerin iş mantığını etkilememesi amacıyla, UI katmanını tamamen bağımsız tutuyoruz.
  • Clean Architecture'ın Bu Yapı ile Sağladığı Avantajlar

    Negzel Teknoloji A.Ş. olarak bu katmanlı yapı sayesinde şu avantajları elde ediyoruz:

  • Kodun Okunabilirliği ve Yönetimi: Katmanlı yapılar sayesinde her katmanın sorumluluk alanı net bir şekilde belirlenmiştir. Kodun okunabilirliği artar ve geliştiriciler projede daha rahat hareket edebilir.
  • Modülerlik ve Tekrar Kullanılabilirlik: Özellikle SharedKernel ve DependencyInversion gibi katmanlar sayesinde, sıkça kullanılan fonksiyonellikleri modüler yapıda tanımlayıp farklı projelerde tekrar kullanabiliyoruz.
  • Test Edilebilirlik: Core ve Application katmanlarındaki iş mantığını bağımsız olarak test edebildiğimiz için, iş kurallarında yapılan değişiklikler veri erişimi veya UI'yi etkilemez. Bu da proje üzerinde hızlıca iyileştirmeler yapmamıza olanak tanır.
  • Test Edilebilirlik: Core ve Application katmanlarındaki iş mantığını bağımsız olarak test edebildiğimiz için, iş kurallarında yapılan değişiklikler veri erişimi veya UI'yi etkilemez. Bu da proje üzerinde hızlıca iyileştirmeler yapmamıza olanak tanır.
  • Kolay Bakım ve Refactoring: Infrastructure ve UI katmanlarının iş kurallarından bağımsız olması, değişiklik gerektiren durumlarda sadece ilgili katmanın düzenlenmesini sağlar. Bu da bakım süreçlerini kolaylaştırır.
  • Bağımlılıkların Yönetimi: DependencyInversion katmanı sayesinde proje içerisindeki bağımlılıkları merkezi olarak yönetiyoruz. Bu, yeni servislerin veya dış kaynakların entegrasyonunu kolaylaştırır.

Bu katmanlı yapı sayesinde Clean Architecture’ın getirdiği prensipleri tam anlamıyla uygulayarak, projelerimizin kalitesini artırıyor, değişikliklere hızlı adapte oluyor ve sürdürülebilir bir yazılım geliştirme süreci sağlıyoruz.

Sonuç

Clean Architecture, yazılım projelerinde bağımsızlık, sürdürülebilirlik ve esneklik sağlamasıyla öne çıkan bir mimari yaklaşım olup, iş kurallarını veri erişiminden ve dış katmanlardan izole eder. Projelerin büyümesi, yeni teknolojilere uyum sağlama ihtiyacı ve iş mantığının değişimi gibi durumlarda Clean Architecture, geliştirici ekiplerin işini kolaylaştırır. Özellikle orta ve büyük ölçekli projelerde, yazılımın düzenli ve modüler yapısını koruyarak bakım maliyetlerini azaltır ve projenin yaşam döngüsünü uzatır.

Clean Architecture'ı doğru bir şekilde uygulayarak, yazılım projelerinizin daha sürdürülebilir, yönetilebilir ve esnek olmasını sağlayabilirsiniz. Bu da hem geliştirici ekipleri hem de müşterileri memnun edecek sonuçlar doğurur.

image