Bağlaşıklık (Coupling) ve Yapışıklık (Cohesion)

Yazılım tasarımının bana göre en temel ve projelerin büyüklüğü ile doğru orantılı olarak en fazla baş ağrıtan meselesi… Yine de genellikle problemlerin ana kaynağı olduğu pek az yazılım geliştiricisi tarafından farkedilir.

Bağlaşıklık (Coupling) Nedir?

Bağlaşıklık – kısaca – modüller arası alaka yoğunluğudur. Burada modül deyince aklınıza gelmesi gereken şey rutin, fonksiyon içi veya metod içidir.

Şimdi kısa kısa bağlaşıklık tiplerini açıklayalım:

İçerik Bağlaşıklığı (Content Coupling) – Çok Sıkı –

Prosedürel programlamada bir rutin bir alt rutinin kod satırlarını aynen kullanıyorsa içerik bağlaşıklığı var demektir ve bu en sıkı bağlaşıklıktır. Mesela “goto label” kullanımı böyle bir bağlaşıklık oluşturur.

Genellerle Bağlaşıklık (Common Coupling)

Rutinlerin/fonksiyonların/metodların global scope’taki (veya dil destekliyorsa ortak scope’taki) veriye bağımlı olmasıyla meydana gelmiş bağlaşıklıktır. Herhangi geneller (globals) verisi değişikliğinde görülemeyen yan etkiler meydana gelebilir.

Kontrol Bağlaşıklığı (Control Coupling)

Bir modülün (rutin ya da fonksiyon veya metodun içi), diğer bir modülün akışını, verdiği veri aracılığıyla kontrol etmesi sonucu meydana gelmiş bağlaşıklıktır.

Veri Yapılarıyla Bağlaşıklık (Stamp Coupling or Data-Structured Coupling)

Bir modülün, diğeri ile, kompozit veri yapısı (ki bu genelde nesnedir) paylaşması ve paylaşımı alan tarafın bu veri yapısının tamamıyla değil bir kısmı ile ilgili olması sonucu meydana gelmiş bağlaşıklıktır. Paylaşılan şeyin veri yapısının kopyası değil referansı olduğu unutulmamalı. Bu tür bağlaşıklıkta sakınca, alınan veri yapısının tamamının okunmaya açık olması ile değil, tamamında değişiklik yapılmasına açık olması ile ortaya çıkar. Veri bağlaşıklığına nisbeten ortaya çıkan sıkılaşma bununla alakalıdır.

Veriyle Bağlaşıklık (Data Coupling) – Çok Gevşek –

Bir modülün, diğeri ile veri kopyası (parametre, argüman vs.) paylaşması sonucu meydana gelmiş bağlaşıklıktır. Tabii ki burada bahsi geçen veri kopyası, parçalanamayan veri parçası (parçalansa anlamını yitiren) olma özelliğine sahiptir.

Alt Sınıf Bağlaşıklığı (Subclass Coupling)

Nesne yönelimli programlamada bir alt sınıfın (varsa) üst sınıfıyla olan ilişkisini tanımlar. Alt sınıf, üst sınıfına bağımlıdır. Üst sınıf, alt sınıfa bağımlı olmamalıdır.

Zamansal Bağlaşıklık (Temporal Coupling)

Nesne yönelimli programlamada bir sınıfın iki veya daha fazla öğesi arasında, bu öğelerden birinin diğerinden önce çağırılmasını gerektiren örtülü bir ilişkisi bulunması durumunda ortaya çıkar. Bu, öğeleri zamansal boyutta sıkıca bağlaştırır. Mesela ardışıl metod çağırmalarında hangisinin önce çağırılacağı önemliyse söz konusu metodlar arasında zamansal bağlaşıklık vardır.

Dinamik Bağlaşıklık (Dynamic Coupling)

Anlamsal Bağlaşıklık (Semantic Coupling)

Mantıksal Bağlaşıklık (Logical Coupling)

Sıkı Bağlaşık (Tightly Coupled) Sistemin Dezavantajları

  1. Bir modüldeki değişiklik genellikle diğer modüllerde değişiklik yapmaya zorlar (ripple effect).
  2. Artan modüller arası bağımlılıktan dolayı modüllerin ictiması daha fazla efor ve zaman gerektirir.
  3. Alakalı modüllerin hepsinin import edilmesi gerektiğinden bir modülün yeniden kullanılması veya test edilmesi zorlaşır.

İdeal Olan Gevşek Bağlaşıklığı Tesis Etmek İçin

  1. Geliştirme yapılırken birbiriyle ilgisi olmayan her şey ayrı geliştirilmelidir (separation of concern). Aynı çağrışım kümesine ilişkin her şey bir arada geliştirilmelidir. Yani bir arada geliştirilen bu öğeler bir yapışıklık (cohesion) hatta kuvvetli bir yapışıklık (high cohesion) içinde olmalıdır.
  2. Derlenen yazılım parçaları bir araya getirildiğinde hep birlikte otomatik olarak çalışacak şekilde tasarlanmalıdır (automated deployment). Derleme sonrası yapılandırmalardan kaçınılmalıdır.
  3. Her bir sınıfa ilişkin bütünleştirici soyut sınıflar tanımlanmalıdır (abstraction of subclasses). Alt sınıflar detaylı olarak tanımlanmalı; ancak soyut sınıflar olarak kullanılmalıdır.
  4. İşlevlerin geri dönüş değerleri, parametreler ve nesneler, bağımlılık yapmayacak şekilde tanımlanmalıdır.
  5. Yazılım çalıştığı ortama bağımlı olarak geliştirilmemelidir (environment independent).

Yapışıklık (Cohesion) Nedir?

Bir modül (rutin ya da fonksiyon veya metodun içi) tek sorumluluğa sahip olmalı. Bu, tekil sorumluluk prensibi (single responsibility principle) olarak adlandırılır. Peki bir modülün tekil sorumluluğa sahip olup olmadığını nasıl anlarız? Diğer yönden bir modülün sorumluluklarını teke indirgemek için ne yapmalıyız?

Her modülün bir tek odağı olmalıdır. Tek odaklılık genelde tam yapışıklılık demektir. Çok odaklılık söz konusu ise modülün hala parçalanmaya ihtiyacı vardır. Bir değişiklik yapılması gerekiyorsa yalnız bir noktada yapılması gerekmeli. Ve bir öğeyi değiştirmek gerekiyorsa bunun yalnızca bir sebebi olmalı.

Şimdi kısa kısa yapışıklık çeşitlerine bakalım:

Tesadüfi Yapışıklık (Coincidental Cohesion) – En kötüsü

Modüldeki öğelerin rasgele seçilmesi durumu. Çoğunlukla utils, helpers tarzı modüllerde görülür.

Mantıksal Yapışıklık (Logical Cohesion)

Aynı kategoride olduğu düşünülen öğelerin aynı modüle yerleştirilmesi durumu. Tek açıdan bakıldığında düşülen durum olur.

Zamansal Yapışıklık (Temporal Cohesion)

Zaman içinde peyderpey eklenen birbiri ile alakalı veya alakasız öğelerin modül oluşturması durumu.

Prosedürel Yapışıklık (Procedural Cohesion)

Bir akışın içindeki öğelerin bir veya daha fazla odağa sahip olarak beraberce bir modül oluşturması durumu. İşte bu genelde yeterince düşünülmeden, tasarlanmadan yazıldığında ortaya çıkan modülün yapışıklığıdır.

İletişimsel Yapışıklık (Communicational Cohesion)

Aynı genel veri, aynı girdi, aynı çıktı üzerinde çalışan öğelerin aynı modülde bulunması durumu.

Ardışıl Yapışıklık (Sequential Cohesion)

Önceki öğenin çıktısının, sonraki öğenin girdisi olduğu bir zincirin modül oluşturması durumu.

İşlevsel Yapışıklık (Functional Cohesion) – En iyisi

Yalnızca bir tek iş yapmaya odaklı öğelerin bir araya getirilip modülleştirilmesi durumu.

Düşük yapışıklığın 3 büyük sebebi vardır

  1. Bir an önce çalışsın da…
  2. Üşengeçlik
  3. Karmaşık kodlama (complex coding) paranoyası

Bağlaşıklık (Coupling) ve Yapışıklık (Cohesion) İlişkisi

coupling-and-cohesion
Coupling & Cohesion

Bu iki kavram genelde birbirine karıştırılır. Aslında nicel saysak birbirine ters orantılı şeylerdir. Gevşek bağlaşıklık (loose coupling) genellikle yüksek yapışıklık (high cohesion) ve tabii ki sıkı bağlaşıklık (tight coupling) da genellikle düşük yapışıklık (low cohesion) demektir.

Özetle modüller arası (veya sınıflar arası) düzen bağlaşıklık (coupling), modül içi (sınıf içi) düzen yapışıklık (cohesion) olarak tanımlanabilir.