Gevşek Bağlılık
- İngilizcesi
- Loose Coupling
- Okunuşu
- lus kapling
Günlük kullanımda iki ad da yaygın.
Kısaca
Gevşek bağlılık, bileşenlerin birbirine olabildiğince az bağımlı olduğu, böylece birinin diğerlerini bozmadan değişebildiği bir tasarım ilkesidir.
Gevşek bağlılık (loose coupling) nedir?
Bağlılık (coupling), bir sistemin bir parçasının başka bir parçanın ayrıntılarına ne kadar bağımlı olduğunu anlatır. Sıkı bağlı bir tasarımda bir sınıf, modül ya da servis, diğerinin somut sınıfı, veritabanı tabloları veya veri biçimi gibi iç yapısı hakkında çok şey bilir; bu yüzden birini değiştirmek diğerinde de değişiklik gerektirir. Gevşek bağlılık bu bağımlılıkları küçük ve kararlı bir sözleşmeye indirger; böylece her parça daha bağımsız biçimde değiştirilebilir, test edilebilir, yenisiyle değiştirilebilir veya dağıtılabilir.
Yaygın teknikler arasında somut sınıflar yerine arayüzlere bağımlı olmak, bağımlılıkları dependency injection ile dışarıdan geçirmek, iyi tanımlanmış API'lerle iletişim kurmak ve gönderenin kimin tepki vereceğini bilmesine gerek kalmaması için olaylar ya da mesaj kuyrukları kullanmak bulunur. Kapsülleme de yardımcı olur, çünkü diğer kodlar yalnızca bilerek açığa çıkarılana güvenebilir. Sistem düzeyinde, bir veritabanını paylaşan mikroservisler ayrı dağıtılsa bile sıkı bağlıdır; kendi verisine sahip olup sürümlenmiş API'lerle konuşan servisler ise gevşek bağlıdır.
İyi bir benzetme priz ve lambadır: standart fişli her lamba herhangi bir prizde çalışır ve evi yeniden kablolamadan ikisinden birini değiştirebilirsiniz. Duvara doğrudan kablolanmış bir lamba sıkı bağlı olurdu. Gevşek bağlılık, küçük fonksiyonlardan ve sınıflardan eklenti sistemlerine, mikroservislere ve olay güdümlü mimarilere kadar her yerde karşımıza çıkar.
Gevşek bağlılık çoğunlukla yüksek uyum (cohesion) ile birlikte tartışılır ama bunlar farklı fikirlerdir. Uyum, tek bir modülün içindeki şeylerin ne kadar birbirine ait olduğuyla, bağlılık ise ayrı modüllerin birbirine ne kadar bağımlı olduğuyla ilgilidir; iyi tasarımlar yüksek uyum ve gevşek bağlılığı hedefler. Gevşek bağlılık, bağlılığın hiç olmaması da değildir, çünkü parçalar yine de iletişim kurmalıdır ve çok fazla dolaylılık katmanı eklemek kodu takip etmeyi zorlaştırabilir.
Önemli noktalar
- Bağlılık, bir bileşenin diğerinin ayrıntılarına ne kadar bağımlı olduğunu ölçer.
- Gevşek bağlı parçalar daha bağımsız biçimde değiştirilebilir, test edilebilir ve dağıtılabilir.
- Arayüzler, dependency injection, API'ler ve olaylar bağlılığı azaltır.
- Modüllerin içinde yüksek uyum, aralarında gevşek bağlılık hedefleyin.
- Aşırı dolaylılığın maliyeti vardır; bu yüzden değişimin olası olduğu yerlerde ayrıştırın.
Örnek
// Tightly coupled: the service creates a specific email client itself
// class SignupService { private mailer = new SmtpMailer("smtp.example.com"); }
// Loosely coupled: the service depends only on a small interface
interface Notifier {
send(to: string, message: string): Promise<void>;
}
class SignupService {
constructor(private notifier: Notifier) {}
async register(email: string) {
// ...save the user...
await this.notifier.send(email, "Welcome aboard!");
}
}Sık sorulan sorular
Gevşek bağlılık ile sıkı bağlılık arasındaki fark nedir?
Sıkı bağlılıkta bileşenler birbirlerinin iç ayrıntılarına bağımlıdır; bu yüzden birindeki değişiklik çoğunlukla diğerini bozar. Gevşek bağlılıkta ise arayüzler ya da API'ler gibi küçük ve kararlı sözleşmelerle etkileşirler, böylece her biri bağımsız değişebilir.
Bağlılık (coupling) ile uyum (cohesion) arasındaki fark nedir?
Bağlılık modüller arasındaki bağımlılıklarla, uyum ise tek bir modülün içindeki sorumlulukların birbirine ne kadar uyduğuyla ilgilidir. İyi tasarlanmış kod, modüller arasında gevşek bağlılığı, her modülün içinde ise yüksek uyumu bir arada taşır.
Mikroservisler gevşek bağlılığı nasıl sağlar?
Her servis kendi verisine sahiptir, sürümlenmiş bir API sunar ya da olay yayınlar ve veritabanlarını veya iç kodları diğer servislerle paylaşmaktan kaçınır. Bu, ekiplerin servisleri bağımsız olarak dağıtmasına ve ölçeklemesine olanak tanır.
İlgili sayfalar
- Dependency InjectionYazılım Mimarisi, s. 10Dependency injection, bir nesnenin ihtiyaç duyduğu diğer nesneleri kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım tekniğidir.
- InterfaceProgramlamanın Temelleri, s. 26Interface, bir türün sağlamayı vaat ettiği metot ve özellik imzalarından oluşan adlandırılmış bir kümedir; bu üyelerin nasıl gerçekleştirildiğini söylemez.
- İlgilerin AyrılmasıYazılım Mimarisi, s. 19İlgilerin ayrılması, bir programı her biri davranışının açıkça tanımlanmış tek bir yönünden sorumlu ayrı parçalara bölen bir tasarım ilkesidir.
- MikroservislerYazılım Mimarisi, s. 24Mikroservisler, bir uygulamanın ağ üzerinden iletişim kuran, küçük ve bağımsız olarak dağıtılabilen servislere bölündüğü bir mimari tarzdır.
- Olay Güdümlü MimariYazılım Mimarisi, s. 29Olay güdümlü mimari, servislerin bir siparişin verilmesi gibi olaylar üreterek ve bunlara tepki vererek iletişim kurduğu bir yazılım tasarım tarzıdır.
- Hexagonal ArchitectureYazılım Mimarisi, s. 18Hexagonal architecture, çekirdek iş mantığının dış dünyayla yalnızca portlar ve değiştirilebilir adaptörlerle konuştuğu bir yazılım yapılandırma yöntemidir.
- UyumYazılım Mimarisi, s. 45Uyum, bir modül, sınıf ya da servis içindeki sorumlulukların birbirine ne kadar ait olduğunun ölçüsüdür ve yüksek uyum iyi tasarımın işaretidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin