Yandex Metrica
Clean Code: High Cohesion Low Coupling - Yasin Sunmaz

Yasin Sunmaz

Kodladıkça değişen bir dünya...

Clean Code: High Cohesion Low Coupling

17.05.2022 yasinsunmaz 943 0

Clean Code içinde bahsedeceğimiz bir diğer konu ise "High Cohesion Low Coupling" yani "Yüksek Birliktelik ve Düşük Bağımlılık"'tır. Öncelikle tanımlara değinerek devam edelim. Cohesion: Birliktelik, Coupling: Bağımlılık anlamına gelir.

Birliktelik(Cohesion)

Tek bir amaca sorumluluğa odaklanmasına ve tek bir işi yapmasına birliktelik denir. Aslında bu yakında bildiğimiz Single Responsibility(SP) prensibini açıklamaktadır. Eğer birliktelik yüksek olursa karmaşıklık düşük, bakım maliyeti düşük ve tekrar kullanılabilirlik oldukça yüksek olacaktır. Bir sınıfın metodun yapısı ortak amaçlar yaptığı durumda o sınıfın birlikteliği yüksektir. Aynı şekilde bir fonksiyon ne kadar az iş yapıyor ise birlikteliği o kadar yüksektir.

Projelerde zaman zaman ihtiyaç duyulacak fonksiyonları bir yere toplayarak Util şeklinde bir sınıf oluşturup hepsini orada topluyoruz. Aslında ilk başta baktığımızda mantıklı bir durumdur. Fakat zamanla her ihtiyaç duyulan yeni bir fonksiyonu buraya eklediğinizde giderek anlam bütünlüğü bozulacak, giderek karmaşıklaşacaktır. Örnek vermek gerekirse XML, JSON, String gibi işlemler için aynı util içerisine fonksiyonlar yazabiliyoruz. İşte bu durum yaşandığında birliktelik zayıflar ve istenmeyen durum oluşur. Bunun çözümü de her Util sınıfı da kendi içinde ayrılmalıdır. Böylece siz istediğiniz fonksiyonları anlam bütünlüğü ve sadelik sayesinde rahatça kullanabilecek ve bakımını kolayca yapabileceksiniz. Yani siz XML.Util, JSON.Util ve String.Util gibi farklı sınıflar oluşturup sadece ilgili fonksiyon ve metotları buraya yazarak daha düzenli bir yapı sağlayabileceksiniz.

Birliktelik sağlamak için interfaceler şişman olmalı olabildiğince ayrıştırılmalıdır. Aynı durumda sınıflar için geçerlidir. Sınıflar içindeki metotlar farklı bir sınıf içerisinde kullanılıyor ise ayrıştırılmalıdır. Aksi durumda ortak bir sınıfta yok ise yeni bir sınıf oluşturarak düzenlenmelidir.

Birliktelik Çeşitleri

Gelişigüzel Yapılar, Mantıksal(Logical), Zamansal(Temporal), Prosedürel(Procedural), İletişimsel(Communicational), Ardışıl(Sequential), Fonsiyonel(Functional) olarak genel yapılara ayrılmaktadır.

Bunların en iyisi olan ise Fonksiyonel yapılardır. Bu yapı tek bir tane, olabildiğince küçük, tek bir görev işi sorumluluk edinmiş ve iyi tanımlanmış olarak bir araya getirilmiş yapılardır. En iyi birliktelik durumudur.

Bağımlılık(Coupling)

Sınıfların, metotların ve bunun gibi birçok durumun birbirine olan yoğun ilişkisine bağımlılık diyebiliriz. Sistemde sınıflar arası bağımlılığın yüksek olması istenmeyen bir durumdur. Bağımlılık durumlarının da kendi içinde farklı türleri vardır.

Bağımlılık Tipleri

İçerik(Content): Yanlış soyutlamadan kaynaklıdır. Doğrudan olan erişim veya set/get metotlarıyla veri alış-verişi en çok görülen durumdur.

Ortak(Common): Global veri ve değişkenleri kullanan yapılar arasındaki bağımlılıktır. Bir değişkeni her yerde çağırarak kullanmak durumudur.

Dışsal(External): Yapılar arasında, ortak kullandıkları dış bir bileşen ya da sistemin format, ara yüz ve veri yapısı gibi durumların yaşanmasından kaynaklanan bağımlılıktır.

Kontrol(Control): Yapıların flag geçerek birbirlerinin birbirlerinin akışlarını kontrol ettikleri bağımlılıktır.

Veri Yapısı Bağımlılığı(Stamp(Data-Structed) Coupling): Yapıların birbirlerine karmaşık veri yapısı ile geçerek oluşturdukları bağımlılıktır.

Veri Bağımlılığı(Data Coupling): Özellikle metotların verilere bağlı olma durumudur. Yani bir metodun çok fazla parametre alması en sık görünen durumdur.

Mesaj(Message): Nesnelerin arayüzü(Interface) bilgisi dışında başka hiç bir bilgi gerektirmeyen bağımlılık şeklidir. Nesnelere ulaşırken direk değil interface üzerinden iletişime geçmesidir. En sağlıklı bağımlılık durumudur. Metotlar, sınıflar, modüller, katmanlar ve sistemler arasından rahatlıkla uygulanabilir.

Birliktelik ve Bağımlılık

İşleri yaparken her zaman "Yüksek Birliktelik ve Düşük Bağımlılık" ilkesini benimsemelidir. Bunu da yapabilmenin en iyi yolu her zaman kodunuzu olabildiğince basit, sade, küçük parçalara bölerek yapmaktır. Zaten işleri atomik parçalara böldüğünüzde ortaya küçük işler çıkacak ve bu durumda yeni bölünmeye ihtiyaç olmayacaktır. Bu sayede de bu işin sadece bir işi bir amacı olacak. Yani şunu diyebilmeliyiz: Küçük bir iş yapıyor ama tam yapıyor. Bunun ile birlikte birbirleri ile olan ilişkileri olabildiğince az olmalı. Bunu da sağlayabildiğimizde birlikteliği yüksek, bağımlılığı düşük işler ortaya çıkarabileceksiniz. Sonunda dönüp baktığınızda işlemesi, anlaması ve tekrar geliştirmesi kolay olacak.

Clean Code'a Giriş adlı yazımı da okumanızı tavsiye ederim.

Kaynak:

Akın Kaldıroğlu

Umarım faydalı olmuştur. İyi çalışmalar dilerim.

  • Yorum yapabilmek için giriş yapmalısınız. Giriş yapmak için tıklayınız.

Diğer Yazılar

Clean Code: İsimlendirmeler

27.04.2022 yasinsunmaz 631 0

Merhabalar Clean Code ile ilgili yazılarıma devam ederken biraz da örneklerin olduğu bir yazı yazmak istedim. İyi ve kötü örnekler üzerinden fark...

Clean Code: Least Astonishment Prensibi

21.04.2022 yasinsunmaz 522 0

Clean Code ve SOLID konuları ile birlikte bilmemiz gereken bir diğer prensip Principle of Least Astonishment'dir. Principle of Least Astonishment En Az Şaşkınlık Prensibi olara...

Clean Code: YAGNI Prensibi

20.04.2022 yasinsunmaz 1196 0

Clean Code ve SOLID konuları ile birlikte bilmemiz gereken bir diğer prensip YAGNI(You Ain’t Gonna Need It)'dir. Bu prensip genel anlamda vurguladığı şey: İhtiy...

Clean Code: DRY Prensibi

19.04.2022 yasinsunmaz 1040 0

Clean Code ve SOLID konuları ile birlikte bilmemiz gereken bir diğer prensip DRY(Don’t Repeat Yourself)'dir. Bu prensib genel anlamda vurguladığı şey: Kendini tekrar...

RedisConnectionException Hatası ve Çözümü: AbortOnConnectFail=false

31.07.2023 yasinsunmaz 1346 0

Redis, popüler bir açık kaynaklı veri yapısı sunucusudur ve günümüzde birçok uygulama tarafından kullanılmaktadır. Ancak, bu tür veri tabanla...

ASP.NET Core Web API'de Parametre Bağlama Yöntemleri: FromQuery, FromBody ve FromRoute

12.07.2023 yasinsunmaz 1888 0

ASP.NET Core web API projeleri, istemcilerden gelen verileri API metotlarıyla etkileşimde bulunmak için kullanılır. Bu verileri doğru bir şekilde almak ve işlemek içi...

Deployment Stratejileri (Blue Green, Rolling Update/Rollback) Nedir?

23.06.2023 yasinsunmaz 1272 0

Yazılım geliştirme sürecinde, uygulamaları güncellemek ve yeni sürümleri piyasaya sürmek önemli bir adımdır. Ancak, kullanıcıların kesintisiz hizmet a...

SonarQube Kurulumu: Adım Adım Kılavuz

18.06.2023 yasinsunmaz 2067 0

SonarQube, açık kaynaklı bir statik kod analizi platformudur ve geliştiricilere kod kalitesini, güvenliğini ve performansını iyileştirmeleri için yardımcı olur. ...

Active Directory LDAP İle Kullanıcı Kimlik Doğrulama .NET

05.12.2022 yasinsunmaz 3010 0

Active Directory LDAP ile kullanıcıyı belirli bir filtre üzerinde arama veya kullanıcının kimliğini doğrulama işlemleri yapabilmekteyiz. Bu LDAP protokolünde DirectorySer...

SOLID Yazılım Prensipleri

26.11.2022 yasinsunmaz 932 0

SOLID prensipleri yazılım geliştirmede başlarda anlayıp uygulaması zor olsa da buna uyarak kod geliştirmenin faydasını zamanla görebilirsiniz. Yazdığınız kodlarda sonradan yap...

Regex, Regular Expressions Genel Kullanımı

03.08.2022 yasinsunmaz 2510 0

Bir çok yazılım dilinde bazı kontroller için Regex ifadeler ihtiyaç duyabiliyoruz. Bunların en başında e-posta, telefon ve web site geliyor. Bunların doğruluğu...