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

Ahmet Bekir Bakkal
DigiGeek
Published in
3 min readDec 8, 2021

Herkese merhaba!.

Çalıştığımız projelerde temiz kod yazmak (clean coding), refactoring’leri temiz yapmak hepimizin hedefidir. Bu hedefe ulaşabilmek için dikkat edilmesi gereken kavramların en başında Cohesion ve Coupling gelir. Bu kavramlar birbirini tamamladığı için bir arada incelenirler.

Biz de bu iki önemli kavramı kısaca özetleyelim :)

1- Coupling

Coupling, Türkçe karşılığı olarak yapışkanlık anlamına geliyor. Yani uygulamamızın iç tasarımında kodların birbirine olan bağımlılıkları, yapışkanlıkları olarak da ifade edebiliriz.

Eğer ki; bir modülde değişiklik yaparken commitlerimiz bir çok class’ı etkiliyorsa, kelebek etkisi oluşturuyor ve her yere dokunmak zorunda kalıyorsak veya dokunmaya cesaret dahi edemiyorsak burada önemli bir sorunla karşı karşıya olduğumuzu düşünmeliyiz:).

En ufak geliştirmede XXL boyutlarda commit’lere ulaşıyorsak bu durumda kodlarımız bize “Ey geliştirici! Burada ciddi bir sorun var!” diye bağırıyordur aslında. Bu şekildeki kod tasarımlarına tight couple yani birbirine sıkıca bağlı yapılar diyebiliriz.

Kod tasarımımızda modüller arasındaki bağımlılıkları minimize ederek her modülün, her class’ın, her fonksiyonun kendi görevinden sorumlu olduğu bir yapı kurmalıyız. Aslında bu durum doğrudan Single Responsibility ilkesi ile de ilgili.

Loosly coupled (gevşek bağlı) kod tasarımıyla kodlarımızı static nesnelere, singleton’lara, util’lere, helper’lara, herkesin her yerden erişebildiği nesnelere boğmadan sadece ilgili yerlerde dışarıdan inject ederek ilerlemek en sağlıklı yönelim olacaktır.

Hedefimiz birbirine daha az bağlı ve single responsible ilkesine uygun bir kod tasarımına doğru gitmek olmalıdır.

2- Cohesion

Cohesion ise, Türkçe karşılık olarak bağlaşım anlamına geliyor.

Belli bir görevi icra eden, birbirini tamamlayan ve benzeyen fonksiyonların anlamlı bir şekilde bir araya getirilmesi, modülleştirilmesi diye de ifade edebiliriz.

Eğer bir objede her hangi bir değişiklik yapacağımız zaman bir çok class açıp bir çok yerde değişiklik yapıyorsak cohesion’ın az olduğunu söyleyebiliriz. Alakalı objelerin sadece ve sadece alakalı yerlerde olması, sınırlı kalması doğru yaklaşımdır.

Coupling bağımlılıklarla, Cohesion da sorumluluklarla alakalıdır.

Bu bilgilerle ışığında loosely coupled ve high cohesion kodlama yapmak tasarımlarımızda ana hedefimiz olmalı.

ÖRNEK:

Şimdi Cohesion ve coupling kavramlarının somutlaşması açısından ufak bir örnek verelim.

Tight Coupled and Low Cohesion

Aşağıda kullanıcıları ve bilgilerini yöneten bir User API’ın class diyagramının iki farklı halini görüyoruz.

Rest API’da; addUser(), deleteUser(), getUser(), banUser() gibi bir çok fonksiyonumuz var.

Bu fonksiyonları gerçekleştirebilmek için User DAO (Data Access Object) ile direkt iletişim kurarak hem DAO katmanında hem de Rest API’da business logic taşıyarak, bağımlılık oluşturuyoruz.

Örneğin; banUserApi() çağırıldığında mecburen getUser() ve updateUser() fonksiyonlarını çağırarak ya da bu fonksiyonlara belli property’lerle bağımlılık oluşturmak zorundayız.

Bu bize hem fonksiyonları fazlasıyla call etmek, bu kodları kullanan başka modüllerde de etkileşim oluşturmak zorunda bıraktığından hem performans kaybı oluşturacak hem de test maliyeti ekleyecek.

Bu yaklaşımı Low Cohesion ve Tight Couple bir yapı olarak ifade edebiliriz.

Loosely Coupled and High Cohesion

Fakat eğer kod tasarımını aşağıdaki resimdeki gibi ihtiyaçlarımızı mümkün olduğunca küçük fonksiyonlarla parçalayıp araya ayrı bir servis sınıfı ekleyerek yapsaydık hem REST API’de hem de DAO katmanında business logic taşımadan, bağımlılık oluşturmadan işlemlerimizi gerçekleştirebilecektik.

Bu şekilde hem fonksiyonların görevleri çok daha anlamlı olacak hem performans ve maliyet kazancı da olacaktır.

Bu gördüğümüz kod tasarımını ise High Cohesion ve Loosely Coupled bir yapı olarak ifade edebiliriz.

Başka bir konuda tekrar görüşmek üzere, sağlıkla kalın:)..

--

--