'Kuplajda düşük ve yüksek uyumda' ne anlama geliyor


151

İfadeyi anlamada sorun yaşıyorum low in coupling and high in cohesion. Google'la ilgili çok şey okudum ve okudum, ancak yine de anlaşılması zor.

Anladığım kadarıyla, High cohesionbelirli bir işlevi yerine getirmek için uzmanlaşmış sınıflara sahip olmamız gerektiği anlamına gelir. Umarım bu doğru mu? Sadece kredi kartlarını doğrulamak için uzmanlaşmış bir kredi kartı doğrulama sınıfı gibi.

Ve hala düşük Kuplajın ne anlama geldiğini anlamıyor musunuz?


4
Daha ayrıntılı bir açıklama için, bu gönderinin cevabını Cohesion & Coupling
Infinity

Bu cevap , burada verilenlerden kesinlikle daha iyi ve özlüdür.
Lokesh

Aslında, bu iki kopya. Infinity tarafından cevap, şimdiye kadar burada belirtilmeyen tek kopya olmayan.
cellepo

Yanıtlar:


232

Inandığım bu:

Uyum, bir modülün / sınıfın öğelerinin bir araya gelme derecesini ifade eder, ilgili kodun birbirine yakın olması önerilir, bu nedenle yüksek uyum için çaba göstermeli ve tüm ilgili kodu mümkün olduğunca birbirine bağlamalıyız. Modül / sınıf içindeki elemanlarla ilgilidir .

Bağlama, farklı modüllerin / sınıfların birbirine bağlı olma derecesini ifade eder, tüm modüllerin mümkün olduğunca bağımsız olması önerilir, bu yüzden düşük bağlanma. Farklı modüller / sınıflar arasındaki unsurlarla ilgilidir .

Resmin tamamını görselleştirmek yardımcı olacaktır:

resim açıklamasını buraya girin

Ekran görüntüsü Coursera'dan alınmıştır .


20
Profesörümüz "Yüksek uyum modülün pek çok şey yapmadığından emin olmakla ilgilidir, sadece belirli bir şey yapmak içindir".
Lokesh

2
Ben daha çok "bir modül bir şey yapmak emin olun, pek çok modül aynı şeyi yapmak" gibi olduğuna inanıyorum, bu sayede sadece tek bir modülün davranış belirtmek, böylece bir şey için genel davranış uyumlu olduğunu garanti edebilirsiniz.
sschrass

6
@Lokesh Bence yorumunuz bir şeyleri karıştırıyor. Profesörünüz "Tek sorumluluk ilkesi" ile yüksek uyumu karıştırıyor. Yüksek uyum, benzer ve ilgili şeyleri bir arada tutmak anlamına gelir. Birçok işlevden oluşan bir nesnede veya hizmette yüksek bir kaynağa sahip olabilirsiniz.
Max Hodges

17
Bu diyagram kelimenin tam anlamıyla hiçbir şey ifade etmiyor.
Liam

1
Mikro hizmet mimarisi açısından yüksek uyum, güçlü bir şekilde ilişkili olan şeylerin bir mikro hizmette bir arada tutulması gerektiği anlamına gelir ve gevşek bağlantı, bir mikro hizmetin sınırlı bağlamda çalışmak için ince taneli olması gerektiği anlamına gelir, yani bir şeyi bağımsız olarak yapın.
sactiw

41

Yazılım mühendisliğinde uyum , gerçek hayatta olduğu gibi, bir bütünden oluşan öğelerin (bizim durumumuzda bir sınıf diyelim) aslında bir araya geldikleri söylenebilir. Bu nedenle, bir yazılım modülünün kaynak kodu tarafından ifade edilen her bir işlevsellik parçasının ne kadar güçlü ilişkili olduğunun bir ölçüsüdür.

OO açısından uyuma bakmanın bir yolu, sınıftaki yöntemlerin özel niteliklerden herhangi birini kullanmasıdır.

Şimdi tartışma bundan daha büyük ancak Yüksek Uyum (veya uyumun en iyi türü - fonksiyonel uyum) bir modülün parçalarının gruplandırılmasıdır çünkü hepsi modülün iyi tanımlanmış tek bir görevine katkıda bulunur.

Basit bir ifadeyle eşleştirme , bir bileşenin (bir sınıfın mutlaka zorunlu olmasa da, ne kadar hayal edilse de) bir diğerinin iç işleyişini veya iç öğelerini, yani diğer bileşenin ne kadar bilgisine sahip olduğunu bilmesidir.

Gevşek kuplaj , bir sistem veya ağdaki bileşenlerin birbirine bağlanması için bir yöntemdir, böylece bu bileşenler birbirine mümkün olan en az ölçüde bağlıdır…

Bununla ilgili bir blog yazısı yazdım . Tüm bunları örnekler vb. İle çok ayrıntılı olarak tartışır. Ayrıca, bu ilkelere neden uymanız gerektiğinin faydalarını da açıklar.


26

Yazılım tasarımında yüksek uyum , sınıfın bir şeyi ve bir şeyi çok iyi yapması gerektiği anlamına gelir. Yüksek uyum Tek sorumluluk prensibi ile yakından ilişkilidir .

Düşük kuplaj , sınıfın mümkün olan en az bağımlılığa sahip olması gerektiğini gösterir. Ayrıca, var olması gereken bağımlılıklar zayıf bağımlılıklar olmalıdır - somut sınıfa bağımlı olmaktan ziyade arayüze bağımlılığı tercih etmeli veya miras yerine kompozisyonu tercih etmelidir.

Yüksek Uyum ve düşük bağlantı, bakımı daha kolay olan daha iyi tasarlanmış kod sağlar.


Bağımlılık Enjeksiyonunu kaçırdınız. Bir sınıfın en az bağımlılığa sahip olması / hiç bağımlı olmaması, düşük bağlanma ile yakından ilgilidir.
BugHunterUK

16

Kısa ve net cevap

  • Yüksek uyum : Bir sınıf / modül içindeki elemanlar işlevsel olarak birbirine ait olmalı ve belirli bir şey yapmalıdır.
  • Gevşek bağlantı : Farklı sınıflar / modüller arasında minimum bağımlılık olmalıdır.

9

Düşük kuplaj, iki veya daha fazla modül bağlamındadır. Bir modüldeki bir değişiklik diğer modüldeki birçok değişikliğe yol açarsa, bunların yüksek oranda bağlandığı söylenir. Arayüz tabanlı programlama bu noktada yardımcı olur. Aralarındaki arayüz (etkileşim ortalaması) değişmediğinden, modül içindeki herhangi bir değişiklik diğer modülü etkilemez.

Yüksek uyum- Benzer şeyleri bir araya getirin. Bu yüzden bir sınıfın ilgili işi yapmak için yöntem veya davranışları olmalıdır. Sadece abartılı bir kötü örnek vermek için: List arabirimi uygulaması String ile ilgili işlem olmamalıdır. String sınıfının yöntemleri, String ile ilgili alanları ve benzer şekilde List'in uygulanmasında karşılık gelen şeyler olmalıdır.

Umarım yardımcı olur.


5

Uzun hikaye kısa, düşük bağlantı, bileşenlerin bir sistemin düzgün çalışmasını etkilemeden değiştirilebileceği anlamına geldiğini anladım. Temel olarak sisteminizi, sistemi bozmadan ayrı ayrı güncellenebilen çalışan bileşenlere dönüştürün


1
Yüksek Uyum ile aynı değil mi?
user1315906

4

Akıllı telefonun var mı? Büyük bir uygulama veya çok sayıda küçük uygulama var mı? Bir uygulama diğerine yanıt veriyor mu? Bir uygulamayı başka bir uygulamayı yüklerken, güncellerken ve / veya kaldırırken kullanabilir misiniz? Her uygulamanın kendine yeten olması yüksek uyumdur. Her uygulamanın diğerlerinden bağımsız olması düşük bağlantıdır. DevOps bu mimariyi tercih eder, çünkü sistemin tamamını bozmadan sürekli sürekli dağıtım yapabileceğiniz anlamına gelir.


> Bir uygulama diğerine yanıt veriyor mu? . . evet, bazıları var. Birçok uygulama Kamera uygulamasını kullanır, egzersiz uygulaması Kalp ve egzersiz verilerini Sağlık ve Etkinliklere besler. Snippet'i bir uygulamadan diğerlerine paylaşabilirim. Alarm uygulamam zamanı biliyor ve Müzik uygulamasından bir parça çalıyor ...
Max Hodges

@MaxHow (düşük uyum ve yüksek bağlanma) değerinin amortismana uğradığını ve mümkün olan en aza indirgenmesi gerektiğini belirtmektedir. Bazı durumlarda, belirttiğiniz gibi. Bu tamamen kaldırılamaz.
M. Habib

2

Kalıtım veya genelleme, yüksek bağlantıya (örn. Yüksek bağımlılık) bir örnektir. Bununla kastettiğim şey, mirasta genellikle ebeveyn sınıfının çocuk sınıfı tarafından kullanılan temel işlevleri tanımlaması ve ebeveyn sınıfı yöntemlerindeki değişimin çocuk sınıflarını doğrudan etkilemesidir. Dolayısıyla sınıflar arasında daha fazla bağımlılık olduğunu söyleyebiliriz.

Gerçekleştirme veya arayüz kullanımı, yüksek bütünlüğe (yani düşük bağımlılığa) bir örnektir. Bunun anlamı, bir arabirimin, onu uygulayan herhangi bir sınıf için bir sözleşme ortaya koymasıdır, ancak her sınıf, arabirimde bildirilen yöntemleri kendi yöntemiyle uygulama hakkına sahiptir ve bir sınıfta bildirilen yöntemdeki değişiklikler, diğer sınıfları etkilemez.


2

Uyum - her şeyin birbiriyle ne kadar yakından ilişkili olduğu.
Kuplaj - her şeyin birbirine nasıl bağlandığı.

Bir örnek verelim - Kendi kendine giden bir araba tasarlamak istiyoruz.

(1) Motorun düzgün çalışması için ihtiyacımız var.

(2) Kendi kendine sürmek için arabaya ihtiyacımız var.

(1) 'deki tüm sınıflar ve fonksiyonlar, motorun çalıştırılması ve birlikte çalışmasını sağlar, ancak aracın yönlendirilmesine yardımcı olmaz. Bu sınıfları bir Motor Kontrolörünün arkasına yerleştiriyoruz.

(2) 'deki tüm sınıflar ve fonksiyonlar, aracı yönlendirmek, hızlandırmak ve fren yapmak için harika çalışıyor. Otomobilin başlatılmasına veya pistonlara benzin göndermesine yardımcı olmazlar. Bu sınıfları kendi Sürüş Kontrolörünün arkasına yerleştiriyoruz.

Bu denetleyiciler, kullanılabilir tüm sınıflar ve işlevlerle iletişim kurmak için kullanılır. Daha sonra kontrolörler sadece birbirleriyle iletişim kurarlar. Bu, otomobilin daha hızlı gitmesi için gaz sınıfından piston sınıfındaki bir işlevi çağıramayacağım anlamına geliyor.

Pedal sınıfı, Sürüş Kontrol Ünitesinden, daha sonra piston sınıfına daha hızlı gitmesini söyleyen Motor Kontrol Ünitesi ile konuşmasını istemelidir. Bu, programcıların sorunları bulabilmemizi ve büyük programları endişelenmeden birleştirmemizi sağlar. Bunun nedeni, kodun tümünün denetleyicinin arkasında çalışmasıydı.


1

Düşük Bağlanma ve Yüksek Uyum önerilen bir fenomendir.

Birleştirme, çeşitli modüllerin ne ölçüde birbirine bağlı olduğu ve diğer modüllerin bir modülün bazı / önemli işlevlerini değiştirmesinden nasıl etkilendiği anlamına gelir. Bağımlılığın düşük tutulması gerektiğinden düşük kuplaj üzerinde durulur, böylece diğer modüllerde çok az / ihmal edilebilir değişiklikler yapılır.


1

Bir örnek yardımcı olabilir. Veri üreten ve bunu diskteki bir dosya veya veritabanındaki bir veri deposuna yerleştiren bir sistem düşünün.

Yüksek Uyum, veri deposu kodunu veri üretim kodundan ayırarak elde edilebilir. (ve aslında disk deposunu veritabanı deposundan ayırmak).

Düşük Kuplaj, veri üretiminin veri deposu hakkında gereksiz bilgiye sahip olmadığından emin olarak elde edilebilir (örn. Veri deposuna dosya adları veya db bağlantıları hakkında soru sormaz).


1

İşte biraz soyut, grafik teorik açıdan bir cevap:

Sadece durum bilgisi olan nesneler arasındaki bağımlılık grafiklerine bakarak (yönlendirilmiş) sorunu basitleştirelim.

Son derece basit bir cevap, iki sınırlayıcı bağımlılık grafiği göz önüne alınarak açıklanabilir :

İlk sınırlayıcı durum : bir küme grafiği .

Bir küme grafiği, yüksek bir bütünlük ve düşük birleştirme (küme boyutları kümesi verildiğinde) bağımlılık grafiğinin en mükemmel gerçekleştirilmesidir.

Kümeler arasındaki bağımlılık maksimaldir (tamamen bağlı) ve kümeler arası bağımlılık minimaldir (sıfır).

Bu, sınırlayıcı durumlardan birinde cevabın soyut bir gösterimidir .

2. sınırlayıcı durum , her şeyin her şeye bağlı olduğu tamamen bağlı bir grafiktir.

Gerçeklik arada bir yerde, kümelenme grafiğine ne kadar yakın olursam, alçakgönüllü anlayışımla o kadar iyi olur.

Başka bir bakış açısından : yönlendirilmiş bir bağımlılık grafiğine bakıldığında, ideal olarak döngüsel olmamalıdır, eğer değilse, döngüler en küçük kümeleri / bileşenleri oluşturur.

Hiyerarşide bir adım yukarı / aşağı, gevşek bağlantının "bir örneğine" karşılık gelir, bir yazılımda sıkı kohezyona karşılık gelir, ancak bu gevşek kuplaj / sıkı kohezyon prensibini, asiklik yönlendirilmiş bir grafiğin farklı derinliklerinde (veya yayılan ağaçlarından biri).

Bir sistemin bir hiyerarşiye böyle ayrıştırılması, üstel karmaşıklığın üstesinden gelmeye yardımcı olur (her kümenin 10 unsuru olduğunu varsayalım). Sonra 6 katmanda zaten 1 milyon nesne var:

10 küme 1 üstkümeyi, 10 üstküme 1 hiperkümkeni ve benzerlerini oluşturur ... sıkı birleşme, gevşek birleşme kavramı olmadan böyle bir hiyerarşik mimari mümkün olmazdı.

Bu, hikayenin gerçek önemi olabilir ve sadece iki kattaki yüksek uyum düşük bağlantısı değil. Üst düzey soyutlamalar ve etkileşimleri göz önüne alındığında, gerçek önem ortaya çıkmaktadır.


0

Sanırım çok fazla tanımınız var, ancak hala şüpheleriniz varsa veya Programlama konusunda yeni olmanız ve derinlere inmek istiyorsanız, bu videoyu izlemenizi öneririm, https://youtu.be/HpJTGW9AwX0 Sadece polimorfizm hakkında daha fazla bilgi almak için referans ... Umarım bunu daha iyi anlarsınız


0

Düşük Kuplaj: - Çok basit tutacaktır. Modülünüzü değiştirirseniz, diğer modülleri nasıl etkiler.

Örnek: - Hizmet API'niz JAR olarak gösteriliyorsa, yöntem imzasında yapılan herhangi bir değişiklik çağrı API'sını (Yüksek / Sıkı bağlantı) bozar.

Modülünüz ve diğer modülünüz zaman uyumsuz mesajlar üzerinden iletişim kurarsa. İletiler aldığınız sürece, yöntem değişikliği imzanız modülünüz için yerel olacaktır (Düşük bağlantı).

Elbette, mesaj biçiminde bir değişiklik varsa, arayan istemcinin biraz değişiklik yapması gerekir.

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.