High Cohesion ve Low Coupling Prensipleri
Bu yazımızda, yazılım tasarımının temel taşlarından olan “Yüksek Yapışma” (High Cohesion) ve “Düşük Bağlama” (Low Coupling) prensiplerini ele alacağız. İyi bir yazılım sistemi, bu iki prensibi uygulayarak modüler, esnek ve sürdürülebilir bir yapı oluşturur. Şimdi bu kavramları detaylı bir şekilde inceleyelim.
Yüksek Yapışma (High Cohesion)
High Cohesion, bir yazılım modülünün içindeki bileşenlerin, işlevlerin ve değişkenlerin birbiriyle ne kadar ilgili olduğunu ve birlikte nasıl bir bütün oluşturduğunu ifade eder. Yüksek yapışmaya sahip bir modül, tek bir sorumluluğa odaklanır ve bu sorumluluğu en iyi şekilde yerine getirir.
Yüksek Yapışmanın Avantajları
- Okunabilirlik ve Anlaşılabilirlik: Modül, net bir şekilde tanımlanmış bir işlevi yerine getirdiği için kolayca anlaşılır.
- Bakım kolaylığı: Değişiklik gerektiğinde, modülün tek bir amacı olduğu için güncelleme süreci daha basit olur.
- Test edilebilirlik: Modülün net bir sorumluluğu olduğundan, bağımsız olarak test edilmesi kolaydır.
Düşük Bağlama (Low Coupling)
Low Coupling, yazılım modüllerinin birbirlerine olan bağımlılığını en aza indirmeyi ifade eder. Bir modülün diğer modüllerle doğrudan bağlantısının olmaması veya bu bağlantıların sınırlı tutulması, sistemde esneklik yaratır ve yeniden kullanılabilirliği artırır.
Düşük Bağlamanın Avantajları
- Esneklik: Bir modülde yapılan değişiklikler diğer modülleri etkilemez.
- Yeniden Kullanılabilirlik: Modüller bağımsız olduğu için farklı projelerde kolayca kullanılabilir.
- Hata İzolasyonu: Bir modülde oluşan bir hata, diğer modülleri minimum düzeyde etkiler.
Örneğin bir alışveriş platformunda aşağıdaki gibi modüller oluşturulabilir:
- ProductCatalog yalnızca ürün bilgisi sağlar ve ShoppingCart ile direkt bir bağlantısı yoktur. Kullanıcı bir ürünü sepete eklemek istediğinde, ShoppingCart modülü yalnızca ProductCatalog tarafından sağlanan ürün ID’sini kullanır.
- ShoppingCart, sepetin içeriği hakkında bilgi sağlar, ancak CheckoutService’in ödeme işlemini nasıl gerçekleştirdiğini bilmez. Sadece gerekli olan toplam tutarı ve seçilen ürünleri sağlar.
- CheckoutService, ödeme sürecini yönetirken, ShoppingCart’ın içeriğiyle ilgilenmez. Sadece ihtiyaç duyduğu bilgileri alır.
Bu iki prensip birbiriyle yakından ilişkilidir. Yüksek yapışma, bir modülün kendi içinde düzenli ve odaklanmış olmasını sağlarken, düşük bağlama, modüller arası etkileşimin minimum seviyede tutulmasına odaklanır.
class ProductCatalog:
def list_products(self):
return ["Ürün1", "Ürün2", "Ürün3"]
def get_product_details(self, product_id):
return f"Detaylar: {product_id}"
class ShoppingCart:
def __init__(self):
self.items = []
def add_to_cart(self, product_id):
self.items.append(product_id)
return f"Sepete eklendi: {product_id}"
def get_cart_total(self):
return len(self.items) * 100 # Her ürün 100 birim
class CheckoutService:
def checkout(self, cart_total):
return f"Ödeme işlemi tamamlandı. Toplam tutar: {cart_total}"
# Modülleri kullanarak alışveriş akışı
catalog = ProductCatalog()
cart = ShoppingCart()
checkout = CheckoutService()
# Ürün listeleme ve sepete ekleme
print(catalog.list_products())
print(cart.add_to_cart("Ürün1"))
print(cart.add_to_cart("Ürün2"))
# Ödeme işlemi
total = cart.get_cart_total()
print(checkout.checkout(total))
- ProductCatalog, sadece ürün bilgisi sağlama sorumluluğuna sahiptir.
- ShoppingCart, yalnızca sepet yönetimi ile ilgilenir.
- CheckoutService, ödeme işlemlerini yönetir ve diğer modüllerle minimum düzeyde bağlantı kurar.
Bu iki prensip, yazılımın okunabilirliğini, bakımını, test edilebilirliğini ve esnekliğini artırır. İyi bir yazılım tasarımında, yüksek yapışma ve düşük bağlama bir arada uygulanarak modüler ve sürdürülebilir bir yapı elde edilir.