Efferent / Afferent kuplaj ne zaman iyi veya kötü


11

Bu hafta yazılım kalıpları sınavım var ve üzerinde çalışacağımız konulardan biri de Efferent ve Afferent coupling.

Bir paketin başka türlere bağlıysa yüksek bir Ce (efferent kuplajı) olduğunu anlıyorum.

Örneğin:

class Car{
    Engine engine;
    Wheel wheel;
    Body body;
}

Bu sınıf, Motor, Tekerlek ve Gövde tiplerine bağlı olduğu için yüksek verimli bir bağlantıya sahip olacaktır.

Oysa başka bir paket (Araba, Uçak, Bisiklet) bağlıysa "Tekerlek" tipi yüksek bir Ca'ya (afferent kaplin) sahip olacaktır.

Sınavımızdaki olası sorulardan biri, Efferent / Afferent kuplajı ne zaman iyi veya kötü? Bu bana garip geliyor çünkü mantıksal olarak bir program yüksek Efferent / Afferent kuplajlı paketler / sınıflara ihtiyaç duyacaktır.

Herkes yüksek verimli veya afferent kaplin iyi / kötü ne zaman / nerede bir örnek var mı ??

Teşekkürler !


4
Keşke daha da benzer olan daha kafa karıştırıcı terimler seçmiş olsaydı ...
user949300

Yanıtlar:


11

Afferent kuplaj, en çok değişim gereksinimi veya olasılığı nedeniyle ne kadar ağrıya neden olduğu / ne kadar tasarruf ettiği açısından değerlendirilebilir. Örneğin, tekerlek sınıfınızı alın ve diyelim ki diğer modüllerin birçoğu bunu çeşitli araçlar yapmak için kullanıyor. Tekerlek sınıfı son derece stabil ise, bu alaşımlı bağlantı faydalıdır çünkü araçlar tekerleklere ihtiyaç duyar ve güvenilir bir tane kullanırlar. Öte yandan, tekerlek sınıfı bakım açısından uçucuysa, bu afferent kaplin, çok sayıda koda tekrar tekrar kırılma değişiklikleri getirdiğiniz için bir ağrı noktası olacaktır.

Daha verimli bağlantı konseptte benzerdir, ancak biraz farklı bir değer teklifine bakacaksınız. Doğrudan çok sayıda bireysel parçaya (yalnızca "Motor" ve "Şasi" demenin aksine ve diğer alt parçalardan oluşan) bir araba sınıfınız varsa, sınıf muhtemelen çok şey yapar ve bu nedenle bir bakım darboğazı. Bu sınıftaki değişikliklerin karmaşıklığı nedeniyle zor ve riskli olması muhtemeldir. Öte yandan, efferent kuplaj yüksekse, ancak aslında oldukça uyumlu ve açıksa, endişelenecek nesneler ve ilişkiler hiyerarşisine sahip değilsiniz.

Mimari / tasarım söz konusu olduğunda, gerçekten dikkate almanız gereken şey sonsuz sınırsızlıktır ve bu metrikler farklı değildir. Eğer iyi ya da kötü bir şeyin bir örneğini bulmak istiyorsanız, "ne olur" oyununu oynayın. Bir örnek düşünün ve "Ya X yapmak istersem ne kadar berbat olur?" Deyin. Cevabın "çok" olduğu X için bir dezavantajınız var ve cevabın "bu gerçekten çok kolay" olduğu X için bir avantajınız var.


5

Genel olarak konuşma, gevşek bağlantı:

pozitif : sistemin bir kısmını bağlı olduğu bir şeydeki değişikliklerden korur (afferent kupling)

negatif : ilişkiyi anlamak daha zor olabilir

Örneğin, HTTTP'ye dayanan bir sistem geliştiriyor olsaydım, HTTP ile sıkıca veya gevşek bir şekilde eşleşmem gerekip gerekmediğine karar verirdim. Sistemin farklı bir protokole geçebileceğini düşünürsem, gevşek bir şekilde bağlanmayı seçebilirim, HTTP'nin protokolüm olduğunu kabul edersem, anlaşılması basitlik için bu protokole sıkıca bağlanabilirdim.

WS * 'deki bazı karmaşıklıkların HTTP'den protokol olarak ayrışmasında olduğunu düşünün.


Akıllı cevap, ama bunun eferent / afferent kuplaj ve sıkı / gevşek kuplaj ile ilgili olmayan soru ile nasıl ilişkili olduğunu görmüyorum.
lbalazscs

Haklısın, @lbalazscs. Soruyu cevaplamadan neden cevap verdiğimi bilmiyorum!
jayraynet

1

afferent

Bir şey bir sürü farklı şey kullanıyorsa (çok sayıda afferent kaplin), bu şeylerden herhangi biri değişirse kırılmaya eğilimli olabilir.

Kararsızlık = 1

resim açıklamasını buraya girin

Gösterişli

Bir şey bir sürü farklı şey tarafından kullanılıyorsa (çok sayıda efferent kaplin), eğer değişirse birçok şeyi kırmaya eğilimli olabilir.

Kararsızlık = 0

resim açıklamasını buraya girin

istikrar

Martin'in "kararlılık" tanımı, "değiştirilmesi zor" ile "değiştirmek için çok az nedeni olması" arasındaki egzotik bir karışımdır. Yine de istikrarsızlığı metriği yalnızca "değişim zorluğu" nu tanımlar. "Değişim nedenleri", yalnızca arayüzlerinizi uygun bir şekilde, uygun bir soyutlama düzeyinde tasarlamak ve kullanıcı sonu gereksinimlerini daha net bir şekilde anlamak gibi kolayca hesaplanamayan faktörlerle çok daha fazla ilgili olacaktır.

Düşük afferent kuplajlı yüksek verimli kuplaj stabilite sağlar (bir sürü şeyi kıracağı için değiştirilmesi zor bir şeyde olduğu gibi), tersi istikrarsızlık verir (bir sürü şeyi kırmayacağı için değiştirilmesi kolay bir şeyde olduğu gibi) .

Çok sayıda afferent kaplin, tasarımınızın odaklanmadığının bir göstergesi olabilir - bir dizi farklı şey kullanıyor, bu yüzden açık ve tek bir sorumluluktan yoksun olabilir.

Çok sayıda verimli bağlantı, başlangıçta tasarımınızın yaygın olarak (yeniden) kullanıldığını gösterdiği için gerçekten iyi bir şey olarak yorumlanabilir. Yine de, tasarımı sık sık her şeyi kıracak şekilde değiştirmek istersiniz, bu kötü olur. Dolayısıyla, çok sayıda verimli kaplin ile, bu tür paketlerin "değiştirmek için çok az nedeni vardır ya da hiç nedeni yoktur". Tasarımlar, değişmek için nedenleri olmamak açısından dengeli olmalıdır, çünkü aynı şekilde değiştirilmesi çok zor olacaktır.

Kararlı Soyutlama Prensibi

Bağımlılık ters çevirme (doğal olarak bağımlılık enjeksiyonunu gerektirir) ve SAP (sabit soyutlamalar ilkesi) gibi kavramların tümü bağımlılıkların soyutlamalara doğru aktığını gösterir. Ve "değişmek için birkaç neden" olması bağlamında "istikrarı" göz önünde bulundurmanın basit bir nedeni var. Soyut bir arayüz somut detaylardan bahsetmez, sadece "şeylerin ne olduğu" yerine "ne yapılması gerektiğine" odaklanır ve bu nedenle değiştirmek için daha az nedeni vardır. Anakartlarımızdaki hızlandırılmış grafik bağlantı noktasının (soyut arayüz) tasarım değişikliğine uğrayabilmesi, GPU'ya takılan GPU'dan (somut bir ayrıntı) daha az nedene sahiptir.

Yeniden Kullanılabilirlik ve Yeniden Kullanım

Martin ile bir şekilde çarpışan birini önerebilirsem kendime ait bir tür metrik, en çok yeniden kullanılabilir kütüphanelerin diğer kodları minimal olarak yeniden kullanması gerektiğini itmek isterim. Bu, istikrarsızlığı zor 0'a doğru iter. Değişmek için asgari nedenlere sahip olmanın pratik nedenlerinden dolayı, aynı zamanda konuşlandırılması en kolay kütüphaneyi tanıtmak içindir. Bir düzine farklı kütüphaneye dayanan genel amaçlı, yaygın olarak kullanılan bir kütüphanenin, değişmesi için birçok nedeni ve konuşlandırılması zor olabilen garip bir şekilde dağıtılmış dağılımı vardır. Buradaki fark, benim durumumda "değişme nedenleri" nin, kütüphanenin kararlı sürümlerini yayınlamayı amaçlayan kütüphane odaklı bir görünümden geldiği için uygulamaya bile uzanmasıdır. Martin uygulamayı çok ayrı bir parça olarak indirebilir,

Dağıtım açısından, uygulama ve arayüz bulanıklaşır veya kararsız bir kütüphaneye kullanıcı bağımlılıkları sağlamak için birlikte bulanıklaşır. Arayüz açısından yalnızca arayüz kullanılır ve ilişkili uygulama ayrıntıları tamamen ayrıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.