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: High Cohesion Low Coupling
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.