İlgilerin ayrılması: yazılımı konulara göre bölmek
İlgilerin ayrılması, yazılımı her biri tek bir konuyla ilgilenen bölümlere ayırma ilkesidir. Katmanlı mimari, MVVM ve örnek bir refaktör ile açıklanıyor.
İlgilerin ayrılması nedir?
İlgilerin ayrılması (separation of concerns), bir yazılımı her biri farklı bir konuyla ilgilenen bölümlere ayırma ilkesidir. Buradaki ilgi (concern) bir sorumluluk alanıdır: arayüzün görünümü, iş kuralları, veri erişimi, güvenlik denetimi, günlük kaydı gibi. İlke, bu alanların aynı kod parçasında iç içe geçmemesini söyler.
Türkçede sorumlulukların ayrılması da denir. Amaç, bir konudaki değişikliğin diğer konuları bozmamasıdır. Örneğin veritabanını değiştirmek, ekranların kodunu da değiştirmeyi gerektirmemelidir. İlke, yazılım mühendisliğinin en eski ve en çok başvurulan fikirlerinden biridir ve birçok mimari desenin temelinde yatar.
Neden gerekli?
Her şeyin aynı yerde yapıldığı kodda küçük bir değişiklik beklenmedik yerleri bozar. Ayrıştırılmış kodda ise şu faydalar ortaya çıkar:
- Anlaşılabilirlik: bir bölüm okunurken yalnızca tek bir konu düşünülür.
- Değiştirilebilirlik: iş kuralı güncellenirken ekran koduna dokunulmaz.
- Test edilebilirlik: iş mantığı arayüz ya da veritabanı olmadan test edilir.
- Yeniden kullanım: aynı iş mantığı web ve mobil arayüzde ortak kullanılır.
- Ekip çalışması: farklı kişiler farklı bölümlerde çakışmadan çalışır.
İlke ayrıca tek sorumluluk ilkesiyle yakından ilişkilidir; ancak ilgilerin ayrılması mimari ölçekte, tek sorumluluk ise sınıf ölçeğinde düşünülür.
Örnek: iç içe geçmiş bir fonksiyonun ayrıştırılması
Bir sipariş verme fonksiyonu düşünün. Aynı fonksiyon formdan gelen veriyi okuyor, stok ve fiyat kurallarını denetliyor, veritabanına SQL yazıyor ve ekrana başarı mesajı basıyor. Bu fonksiyonu test etmek için veritabanı ve arayüz gerekir; fiyat kuralını değiştirmek ise SQL ve ekran kodunun yanında yapılır.
Ayrıştırılmış halinde işler şöyle bölünür:
- Sunum: formu okur, sonucu gösterir.
- İş mantığı: stok ve fiyat kurallarını uygular; veritabanını ve ekranı bilmez.
- Veri erişimi: siparişi kaydeder ve okur; iş kuralını bilmez.
Bu şekilde fiyat kuralı veritabanı olmadan test edilir, veritabanı değiştirilse iş mantığı etkilenmez.
Yaygın uygulama biçimleri
İlkenin farklı ölçeklerde karşılığı vardır:
- Web teknolojilerinde yapı, görünüm ve davranışın ayrı dillerde tutulması: HTML, CSS ve JavaScript.
- Katmanlı mimari: sunum, iş mantığı ve veri erişim katmanlarının ayrılması.
- MVC ve MVVM: model, görünüm ve onları bağlayan katmanın ayrılması. Android uygulamalarında alan, veri ve sunum katmanlarına bölünen temiz mimari bu mantığa dayanır.
- Mikroservisler: her servis tek bir iş alanından sorumlu olur.
- Kesişen ilgiler (cross-cutting concerns): günlük kaydı, yetkilendirme ve önbellekleme gibi birçok bölümü ilgilendiren konular ara yazılım (middleware), yönelim (aspect) ya da dekoratörlerle ayrıca ele alınır.
İlkeyi uygulamak için bir çerçeve şart değildir; en basit düzeyi fonksiyonları tek iş yapacak şekilde bölmektir.
Aşırı ayrıştırma ve sık yapılan hatalar
Her ilke gibi bu da abartılabilir. Basit bir betik için çok sayıda katman ve arayüz kurmak, kodu anlaşılmaz bir dosya ormanına çevirir. Ayrıştırmanın değeri, değişim ve test ihtiyacı gerçekten varsa ortaya çıkar.
Sık hatalar:
- Sınırın yanlış yerden çizilmesi: birlikte değişen şeylerin ayrı bölümlere dağıtılması.
- Katmanların birbirini atlaması: arayüz kodunun doğrudan veritabanına erişmesi.
- İş mantığının denetleyici ya da ekran koduna sızması.
- Ayrı görünen ama kodla sıkı bağlı bölümler: ayrı dosya, ayrı ilgi demek değildir.
İyi bir ölçüt şudur: bir kuralı değiştirmek için kaç farklı yere dokunmak gerekiyor? Cevap sürekli çok yerse ayrıştırma eksiktir.
İlişkili kavramlardan farkı
Sıkılık ve bağlılık (coupling, cohesion) ilkeyi ölçmeye yarar: iyi ayrıştırılmış sistemde bölümler kendi içinde sıkı bağlı, birbirine gevşek bağlıdır. Soyutlama (abstraction) ayrıntıyı gizlerken, ilgilerin ayrılması konuları bölmeyi hedefler. Modülerlik ise sonuçtur: ilgileri ayrılmış bölümler bağımsız modüller olarak sunulur.
Mimari kararların ve bu ayrımın gerekçeleri sonradan unutulmasın diye mimari karar kayıtları (ADR) tutulur. Bu kayıtlar "neden böyle böldük" sorusunun yanıtını yeni gelenlere taşır.
Mindset programlarında nerede çalışılır?
Yazılım Mimarisi ve Tasarım Desenleri programı SOLID ve tasarım prensiplerini, mimari stilleri ve mimari değerlendirmeyi işler. Kod tabanını katmanlara bölme kararlarıyla karşılaşan yazılım mimarları ve kıdemli geliştiriciler için uygundur.
Android Uygulama Mimarisi (MVVM, Clean Architecture) programı alan, veri ve sunum katmanlarını mobil bağlamda uygular. Yazılım Mimarisi Kararları ve ADR Dokümantasyonu programı mimari kararların kayıt altına alınmasını, Yazılım Mimarisi ATDD ve Test Stratejisi programı ise bu ayrımın test stratejisiyle ilişkisini işler.
İlgili Mindset programı
Yazılım Mimarisi ve Tasarım Desenleri
Sık sorulan sorular
İlgilerin ayrılması ile tek sorumluluk ilkesi aynı şey mi?
Birbirine çok yakındır ama ölçekleri farklıdır. Tek sorumluluk ilkesi genellikle sınıf ya da modül düzeyinde bir bölümün tek bir değişim nedeni olması gerektiğini söyler. İlgilerin ayrılması ise mimari ölçekte, sunum, iş mantığı ve veri gibi alanların birbirinden ayrılmasını anlatır.
Katmanlı mimari ilgilerin ayrılmasının tek yolu mudur?
Hayır. Katmanlar yaygın bir biçimdir ancak dikey dilimleme, olay güdümlü yapı, mikroservisler ve eklenti mimarisi de ilgileri farklı eksenlerde ayırır. Hangi biçimin uygun olduğu uygulamanın büyüklüğüne, ekip yapısına ve değişim sıklığına göre belirlenir.
Kesişen ilgiler (cross-cutting concerns) nedir?
Günlük kaydı, yetkilendirme, hata yönetimi ve önbellekleme gibi birçok katmanı birden ilgilendiren konulardır. Her yere kopyalanırsa kod tekrarlanır ve değişiklik zorlaşır. Bu yüzden ara yazılım, dekoratör, filtre ya da yönelimli programlama yöntemleriyle tek yerde ele alınıp ihtiyaç duyulan noktalara uygulanır.
İlkenin aşırıya kaçtığı nasıl anlaşılır?
Basit bir değişiklik için çok sayıda dosya ve katmanda değişiklik yapmak gerekiyorsa, yalnızca iletim görevi yapan boş katmanlar varsa ya da yeni bir geliştirici akışı takip edemiyorsa ayrıştırma ihtiyacı aşmıştır. Amaç anlaşılırlığı artırmaktır, yapıyı çoğaltmak değildir.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme