Mobil geliştirmede Bağdaşma (Cohesion): temeller, seviyeler ve nasıl iyileştirilir

Yazar: IT Sectr Yayınlanma: 2026-05-13 Okuma süresi: 9 dk

Bağdaşma (Cohesion), bir modül veya sınıf içindeki öğelerin ne kadar yakından ilişkili olduğunu gösteren bir metriktir. Wikipedia'ya göre, yüksek bağdaşma, tüm metotların ve alanların tek bir görev üzerinde çalıştığı iyi tasarlanmış bir modülün özelliğidir. Bağdaşma, kodun bakım yapılabilirliğini doğrudan etkiler ve birleştirme (coupling) — modüller arasındaki bağlantı — ile karşıtlık oluşturur.

Önemli noktalar

  • Bağdaşma — bir modül içindeki öğelerin ortak bir amaçla ne kadar birleştiğinin ölçüsü
  • Yüksek bağdaşma kodu anlamayı, test etmeyi ve değişiklik yapmayı kolaylaştırır
  • Düşük bağdaşma, modülün birden çok ilişkisiz görevi yerine getirdiği anlamına gelir
  • Bağdaşma ve birleştirme birbiriyle ilişkili metriklerdir: bağdaşma ne kadar yüksekse, birleştirme o kadar düşüktür
  • İşlevsel bağdaşma — hedeflenmesi gereken en yüksek seviye

Bağdaşma Nedir

Bağdaşma, bir sınıf veya modül içindeki metotların, alanların ve özelliklerin mantıksal olarak ne kadar bağlantılı olduğunu değerlendiren bir metriktir. Yüksek bağdaşmaya sahip bir modül, tek bir görevi yerine getirir ve bunu gerçekleştirmek için gerekli olan öğeleri içerir. Düşük bağdaşmaya sahip bir modül aynı anda birkaç şey yapmaya çalışır — metotları anlam bakımından zayıf bir şekilde ilişkilidir.

Nesne yönelimli programlama bağlamında, bağdaşma Tek Sorumluluk Prensibi (S) ile yakından ilişkilidir. Bir sınıfın net bir sorumluluğu varsa, bağdaşması genellikle yüksektir. Bir sınıf aynı anda UI, iş mantığı ve ağ ile ilgileniyorsa — bağdaşma düşüktür ve böyle bir sınıf, daha dar sorumluluklara sahip birkaç ayrı sınıfa bölünmelidir.

Bağdaşmayı anlamak, geliştiricilerin yeniden düzenleme kararları almasına yardımcı olur. Bir sınıfta, sınıfın hiçbir alanını kullanmayan bir metot gördüğünüzde, bu düşük bağdaşmanın bir işaretidir. Böyle bir metot ya sınıfta yanlış yerde bulunuyordur ya da sınıf kötü tasarlanmıştır. Yüksek bağdaşma için çabalamak, kodun her seviyesinde mimariyi iyileştirmek için sürekli bir çabadır.

Bağdaşma Türleri ve Seviyeleri

Yazılım mühendisliğinde, en kötüden en iyiye doğru sıralanmış yedi bağdaşma seviyesi ayırt edilir. Bu ölçeği anlamak, bir modülün kalitesini objektif olarak değerlendirmenize ve yeniden düzenleme yönünü belirlemenize olanak tanır. Seviye ne kadar yüksekse, kod o kadar bakımı yapılabilir ve anlaşılır olacaktır.

Düşük Bağdaşma: Rastlantısal, Mantıksal ve Zamansal

Rastlantısal — en kötü seviye, bir modüldeki öğelerin mantıksal bir bağlantı olmadan rastgele gruplandırıldığı durumdur. Örnek: tarih biçimlendirme, e-posta gönderme ve indirim hesaplama metotları içeren bir Utilities sınıfı. Böyle bir sınıf, tüm metotları okunmadan anlaşılamaz ve bir metodu değiştirmek, sadece birlikte oldukları için diğerlerini bozabilir.

Mantıksal — öğeler mantıksal olarak ilişkili ancak temelde farklı görevler gerçekleştirir. parseJSON, parseXML ve parseCSV metotlarına sahip bir sınıf, “ayrıştırma” konusuyla mantıksal olarak bağlantılıdır, ancak her metot temelde farklı bir iş yapar. Sorun: yeni bir biçim (YAML) eklendiğinde sınıf büyür ve arayüzü şişer.

Zamansal — öğeler yürütme zamanına göre gruplandırılır. Veritabanını kuran, yapılandırmayı yükleyen ve analitiği başlatan bir AppInitializer sınıfı — tüm bunlar uygulama başlangıcında olur, ancak görevlerin kendileri ilişkisizdir. Bunları her sorumluluk alanı için ayrı Initializer'lara bölmek daha iyidir.

Orta Düzey Bağdaşma: Yordamsal ve İletişimsel

Yordamsal — öğelerin bir yürütme sırasıyla birleştirilmesiyle oluşur. Bir “Sipariş İşleme” modülü, validateCart, processPayment ve sendConfirmation metotlarını içerir — her metot bir öncekinden sonra kesin olarak çağrılır. Bu, rastlantısal veya mantıksal bağdaşmadan daha iyidir, ancak yine de ideal değildir: her adım ayrı bir modüle çıkarılabilir.

İletişimsel — öğeler aynı verilerle çalışır. getUser, updateUser ve deleteUser metotlarına sahip bir UserService sınıfı, ortak User varlığıyla birleşmiştir. Bu, yordamsal bağdaşmadan önemli ölçüde daha iyidir: sınıfın net bir alanı vardır. Mobil projelerdeki çoğu Repository sınıfı iletişimsel bağdaşmaya sahiptir.

Yüksek Bağdaşma: İşlevsel

İşlevsel — en yüksek seviye, modülün her öğesinin tek bir görevin yerine getirilmesine katıldığı durumdur. Uzunluğu, karakter varlığını ve parola karmaşıklığını kontrol eden tek bir validate metotuna sahip bir PasswordValidator sınıfı, işlevsel bağdaşmaya bir örnektir. Böyle bir sınıf değişirse, bu yalnızca parola doğrulama kuralları değiştiği içindir.

İşlevsel bağdaşmaya ulaşmak, mimari yeniden düzenlemenin ana hedefidir. Her sınıfın değişmek için tam olarak bir nedeni olmalıdır. Mobil geliştirmede, işlevsel bağdaşma, ayrı Use Case'ler, özel View'lar, biçimlendiriciler ve doğrulayıcılar çıkarılarak elde edilir. Bu tür her sınıf, net bir sorumluluk alanına sahip eksiksiz bir yapı taşıdır.

Bağdaşma vs Birleştirme

Bağdaşma ve birleştirme aynı kalitenin iki yüzüdür. Bir modül içindeki bağdaşma ne kadar yüksekse, modüller arasındaki birleştirme o kadar düşük olma eğilimindedir. İyi tasarlanmış bir sistem aynı anda yüksek iç bağdaşma ve gevşek dış birleştirme için çabalar. Bu ilke, 1970'lerden beri yazılım mühendisliğinde temel olarak kabul edilmektedir.

Bağdaşma-birleştirme ilişkisi bir denge olarak düşünülebilir. Bir geliştirici, birden çok görevi bir sınıfta birleştirerek bağdaşmadan ödün verirse, komşu modüller daha fazla bağımlılık kazanır — farklı amaçlar için bu aşırı yüklenmiş sınıfa erişmek zorunda kalırlar, bu da birleştirmeyi artırır. Tersine, küçük, yüksek bağdaşmaya sahip sınıflara bölmek, modüller arasındaki etkileşim noktalarını azaltır.

Pratikte bu şu anlama gelir: işlevsel bağdaşmaya sahip yeni bir sınıf çıkardığınızda, aynı anda diğer modülleri uygulama ayrıntılarını bilme zorunluluğundan kurtarırsınız. Örneğin, EncryptionManager'ı işlevsel bağdaşmaya sahip ayrı bir sınıfa çıkarmak, diğer modüllere şifreleme algoritmasının ayrıntılarını anlamalarına gerek kalmadan basit bir encrypt/decrypt arayüzü sağlar.

kotlin
// Düşük bağdaşma — sınıf her şeyi aynı anda yapar
class UserManager {
    fun fetchAndSaveUser(id: String) { }
    fun parseUserJson(json: String): User { }
    fun displayUserName(user: User): String { }
    fun validateEmail(email: String): Boolean { }
}

// Yüksek bağdaşma — her sınıf bir görevi çözer
class UserRepository {
    fun fetchUser(id: String): User { }
}

class UserJsonParser {
    fun parse(json: String): User { }
}

class UserNameFormatter {
    fun format(user: User): String { }
}

class EmailValidator {
    fun isValid(email: String): Boolean { }
}

Örnek farkı göstermektedir: UserManager mantıksal bağdaşmaya sahiptir — tüm metotlar kullanıcılarla ilgilidir, ancak her biri temelde farklı bir iş yapar. Yeniden düzenlemeden sonra, her sınıf işlevsel bağdaşmaya sahiptir ve diğer modüller yalnızca ihtiyaç duydukları sınıfa bağımlı olduğundan birleştirme azalır.

Kodda Bağdaşma Nasıl Ölçülür

LCOM (Metotların Bağdaşma Eksikliği), sınıf bağdaşmasını ölçmek için en bilinen metriktir. LCOM, ortak alanları paylaşmayan metot çiftlerinin sayısını hesaplar. 0 değeri ideal bağdaşma anlamına gelir (tüm metotlar aynı alanlarla çalışır), yüksek değer ise düşük bağdaşmayı gösterir. LCOM4 (geliştirilmiş bir sürüm), diğer metotlar aracılığıyla geçişli bağlantıları dikkate alır.

Android geliştirmede, bağdaşma metrikleri Detekt aracılığıyla TooManyFunctions kuralı ile elde edilebilir. Farklı alan gruplarını kullanan düzinelerce metoda sahip sınıfların büyük olasılıkla düşük bağdaşması vardır. iOS'ta SwiftLint, file_length ve function_body_length kurallarına sahiptir — dolaylı göstergeler: uzun dosyalar ve metotlar genellikle düşük bağdaşmayı işaret eder.

Manuel bir değerlendirme yöntemi: “Bu sınıf tek bir nedenden mi yoksa birden çok nedenden mi değişecek?” sorusunu sorun. Birden fazla bağımsız neden sayabiliyorsanız — sınıf düşük bağdaşmaya sahiptir. İkinci bir test: “Bu sınıf iki bağımsız sınıfa bölünebilir mi?” Cevap evet ise — yapın. Kod incelemelerinde bağdaşmayı düzenli olarak kontrol etmek, Tanrı sınıflarını önler ve teknik borcu azaltır.

Bir Mobil Projede Bağdaşma Nasıl İyileştirilir

İlk adım — Tek Sorumluluk Prensibini uygulamak. Her sınıfın net bir sorumluluğu olmalıdır. Bir sınıfın ana göreviyle ilgili olmayan bir metodu varsa, onu ayrı bir sınıfa çıkarın. IDE'lerdeki Extract Class veya Extract Delegate tekniği bu süreci otomatikleştirir. Çıkarma işleminden sonra, orijinal sınıfın daha odaklı hale gelip gelmediğini kontrol edin.

İkinci adım — arayüzü basitleştirmek için Facade desenini kullanmak. Bir sınıf 20 metot sağlıyor ancak istemciler yalnızca 3–4'ünü kullanıyorsa, sınıf düşük bağdaşmaya sahip olabilir — çok fazla çeşitli işlevsellik sunuyordur. Metotları konuya göre gruplayın, her grup için ayrı sınıflar çıkarın ve orijinal sınıfı bir cephe yapın veya kaldırın.

Üçüncü adım — alan gruplarına dikkat etmek. Bir sınıfın yalnızca metotların bir alt kümesi tarafından kullanılan alanları varsa — bu düşük bağdaşmanın bir göstergesidir. Sınıfı alan gruplarına göre bölün. Örneğin, bir sınıf userRepository, networkClient ve analyticsTracker alanlarını içeriyor ancak ilk metot grubu yalnızca userRepository kullanırken ikincisi networkClient kullanıyorsa — bunlar iki farklı sınıftır.

Dördüncü adım — rastgele static metotlara sahip “utility” sınıfları oluşturmaktan kaçınmak. Utils veya Helpers sınıfında bulunan her static metot, uzmanlaşmış bir sınıfa çıkarılmak için adaydır. FormatUtils.dateToString'i DateFormatter'a, ValidationUtils.isValidEmail'i ise EmailValidator'a taşımak daha iyidir. Bu, her sınıfın bağdaşmasını artırır ve kodu kendi kendini belgeleyen hale getirir.

Sıkça Sorulan Sorular

Yüksek bağdaşma her zaman iyi midir?

Neredeyse her zaman. İşlevsel bağdaşma kodu net ve öngörülebilir kılar. Ancak, aşırıya kaçırmak aşırı parçalanmaya yol açabilir: her işlem için ayrı bir sınıf oluşturmak, mimariyi aşırı karmaşık hale getirir. Denge, her özellik için birkaç sınıf oluşturmak ve her birinin işlevsel bağdaşmaya sahip olmasıdır.

Bağdaşma modülerlikten nasıl farklıdır?

Bağdaşma, tek bir modül veya sınıf içindeki iç tutarlılığın bir metriğidir. Modülerlik, bir uygulamanın fiziksel modüllere bölündüğü mimari bir ilkedir. Yüksek bağdaşma, hem bireysel sınıfları hem de tüm modülleri tasarlarken bir hedeftir.

Kod analiz araçları bağdaşmaya nasıl yardımcı olur?

Android için Detekt ve iOS için Xcode Analyzer, şüpheli derecede çok sayıda metot veya alana sahip sınıfları vurgular. IntelliJ IDEA ve AppCode bağımlılık görselleştirmesine sahiptir — bağlantı grafiğini görebilir ve düşük bağdaşmaya sahip sınıfları tespit edebilirsiniz. SonarQube, LCOM metriklerini otomatik olarak hesaplar.

Bir arayüz yüksek bağdaşmaya sahip olabilir mi?

Evet. connect, disconnect ve isConnected metotlarına sahip bir arayüz yüksek bağdaşmaya sahiptir — tüm metotlar bağlantı yönetimiyle ilgilidir. connect, parseData ve renderUI metotlarına sahip bir arayüz düşük bağdaşmaya sahiptir. Arayüz Ayırma Prensibi (SOLID), yüksek bağdaşmaya sahip dar odaklı arayüzler oluşturmayı gerektirir.

Kod incelemesinde bağdaşma nasıl kontrol edilir?

Üç soru sorun: Sınıfın amacı tek bir cümleyle açıklanabilir mi? Tüm metotlar bu amacı destekliyor mu? Sınıfta bazı metotlar tarafından kullanılmayan alanlar var mı? Herhangi bir sorunun yanıtı hayırsa — bağdaşma düşüktür ve sınıf bölünmelidir.

Özet

  • Bağdaşma — modül iç tutarlılığının bir metriği, öğelerinin ortak bir amaçla ne kadar birleştiğini gösterir
  • İşlevsel bağdaşma — tüm modül öğelerinin tek bir görev için çalıştığı en yüksek seviye
  • Rastlantısal ve mantıksal bağdaşma — yeniden düzenleme ihtiyacını işaret eden en kötü seviyeler
  • Bağdaşma ve birleştirme ters orantılıdır: iç bağdaşma ne kadar yüksekse, dış birleştirme o kadar gevşektir
  • LCOM — statik analizörlerde bulunan, bağdaşmanın sayısal değerlendirmesi için bir metrik
  • Tek Sorumluluk Prensibi — yüksek bağdaşma elde etmek için pratik bir araç
  • Kaçının Utils gibi yardımcı sınıflardan — böyle bir sınıftaki her metot ayrı bir uzmanlaşmış sınıf olmalıdır

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun