Demeter Yasası, kuplaj ve uyum ile ilgili nesne yönelimli sistemlere nasıl uygulanır? [kapalı]


15

Demeter Yasası, birleşme ve uyum ile nesne yönelimli sistemlere nasıl uygulanır?

"Yazılım geliştirme ve profesyonel uygulama" adlı bir kitap okuyordum ve LoD ile ilgili bölüme rastladım ve bu prensibin nesne yönelimli sistemlere nasıl uygulandığını merak ediyordum.


Bir keresinde yüksek düzeyde bir bağlantıya (yıldız topolojisi) sahip bir projeyi miras aldım. Nesneler arasındaki bağlantıyı sınırlamak ve bunun yerine aracının her bir nesneyle konuşmasına izin vermek için bir 'Arabulucu Deseni' kullanarak işleri temizledim. Halen bir eşleştirme olmasına rağmen, kaç kişinin eşleştirildiğini sınırlar. Bazıları, tasarımlarında yüksek bir bağlantı sorunu olduğunu düşünüyorlarsa bunu daha da keşfetmek isteyebilirler.
Jeach

Yanıtlar:


9

Göre Emerson Macedo Demeter Kanunu şöyle der:

  • Her birim diğer birimler hakkında sadece sınırlı bilgiye sahip olmalıdır: sadece mevcut birim ile ilgili "yakından" birimler.
  • Her birim sadece arkadaşlarıyla konuşmalıdır; yabancılarla konuşma.
  • Sadece yakın arkadaşlarınızla konuşun.

Bu , yukarıda olduğu gibi, birimlerin (veya nesnelerin) olması gerektiği gibi doğrudan düşük kuplaj prensibine karşılık gelir :

  • Birbirine sıkıca bağlanmamalıdır. Sadece en yakın olanlar.
  • Her biri ortak çalışanlarıyla değil, yalnızca ortaklarıyla konuşmalıdır.
  • Sadece anında işbirliği yapan nesnelerle konuşun

Kuplajın en düşük biçimlerinden biri mesaj geçirmektir, yani veriler parametrelerle yöntem çağrıları yoluyla nesneler arasında paylaşılır.

Dahası, görebildiğim kadarıyla, Demeter Yasası yüksek uyum ilkesine doğrudan karşılık gelmez , çünkü yalnızca nesnelerin kendilerinin hangi verilere sahip olduklarını bilmeleri gerektiğini belirtir. Düşük kohezyonlu bir nesne, kendi yöntemlerinde sık kullanmadığı veri üyelerine sahiptir. Bir nesnenin ilişkileri ve işbirliği yapan nesneler yerine içerikle ilgilidir.


8

Bağlantı, basitleştirilmiş

Bir nesne başka bir nesnenin yöntemini, özelliğini vb. Çağırdığında, nesnelerin birbirine bağlı olduğunu söyleriz. Buna kaplin diyoruz çünkü artık callee kendi yöntemi / pervane hakkında hiçbir şeyi değiştiremiyor . w.out arayanın kırılması .

Böylece, daha fazla bağlantı - yöntemleri, sahne. - callee kodunu kullanan tüm kodu bozmadan değiştirmek daha zordur .

bağlantıyı düşünmek

  • Tek bir pervane bile referansla, yöntem iki nesneyi birleştirir.
  • Yazılım oluşturmak için eşleştirme gereklidir.
  • Kuplajın 'kilit adımı' doğası göz önüne alındığında, onu hem sınırlamak hem de izole etmek istiyoruz. Bu amaç sadece genel yazılım geliştirici ile birlikte gider. prensipler.
  • Ne kadar az konuşmamız gerekiyorsa, bağlantı o kadar düşük olur.
  • 20 farklı yöntem çağrısı yapmam gerekiyorsa, 20 çağrının tümü bir sınıfa / nesneye aitse kaplin daha düşüktür, aynı yöntemleri birkaç sınıf / nesneye yayar.

Çoğu Bilgi çılgın eşleşmeye neden olur

Burada bir var Employeebir sahip olduğunu Personbir 'Adres' sahip olduğunu

public class Employee {
    public Person me = new Person();
}
public class Person {
    public Address home = new Address();
}
public class Address {
    public string street;
} 

Sokak almak için ben aramalıdır: myEmployee.me.home.street. Bu, en az bilgi ilkesinin 180 derece tersidir. Eğer mecbur biliyorum iç işleyişi, kompozit yapının, yaklaşık Employee, Personve Addresssınıflar.

Bu arızalı sınıf tasarım yapmamı güçleri biliyorum bütün bu sınıfları hakkında ve böylece myEmployee.me.home.streeten az 3 sınıflara çiftler beni (arayan nesne) - yalnızca tek özelliği alma!

En Az Bilgi Günü Kurtarır

Ben sadece konuşursanız Employeesınıf I başına en az bilgi prensibini uygulayarak ediyorum ve yaparak otomatik böylece sınırlamak sadece bu sınıfın bir şekilde birleşerek, ve aynı zamanda en izolatı olduğu bir sınıfa bağlanması.

EmployeeSınıfta gerekli tüm özellikleri ekleyerek kuplajı düzeltiriz.

Böylece

public class Employee {
    public Person me = new Person();
    public string street { return me.home.street; }
}

Aramamı sağlar: myEmployee.street-

  1. Sadece "biliyorum" Employee
  2. Ben sadece Employeeyapısına bağlıyım - yapısı ne kadar karmaşık olursa olsun.

En Az Bilgi

Biz gelen myEmployee ayrılmış Personve Addressve ideal biz ekleyerek az bilgiyi uygulayarak devam etmelidir aracılığıyla geçiş özelliklerine öyle ki Employeesadece konuşur Personve Personsadece konuşurAddress


1

Çalışma ( V. Basili, L. Briand ve WL Melo. Kalite göstergeleri olarak nesne yönelimli tasarım metriklerinin doğrulanması ), daha büyük yanıt kümelerine sahip sınıfların, daha fazla yanıt kümesi nedeniyle daha küçük yanıt kümesine sahip sınıflardan daha fazla hata yaratma eğilimlerine sahip olduğunu göstermiştir. daha yüksek bağlantı şansı anlamına gelir.

Demeter Kanununun değeri, tanımı gereği belirlenen yanıtı azaltmasıdır. Bir nesnenin yöntemi yalnızca kendi yöntemini, yönteme iletilen herhangi bir parametreyi, oluşturduğu herhangi bir nesnenin yöntemini ve doğrudan tutulan herhangi bir nesnenin yöntemini çağırabilir. Yanıt seti daha küçük olduğundan, yüksek kuplaj şansı daha azdır. Modül / yöntem sadece hemen kullanılabilir referanslar kullandığından daha yüksek uyum vardır.


1
Çalışma ( Anquetil, N. ve Laval, J. Legacy Yazılımının Yeniden Yapılandırılması: Somut Bir Durumun İncelenmesi ) de birleşimin azaltılmasının ve artan uyumun her zaman daha iyi kaliteyle sonuçlanmadığını göstermiştir. Zararlı sayılan tek bir küçük çalışmanın sonucuna dayanarak.

0

Oldukça basit; A'nın B'ye ve B'ye bağlı olduğunu söyleyin. Demeter Yasası olmadan A'da hem B'yi hem de C'yi kullanabilirsiniz, ancak bu yasaya bağlı kalarak, A sadece B'ye bağlıdır, C'ye bağlı olamaz.

Bu, bir modülün bağımlılık sayısını büyük ölçüde azalttığı için düşük kuplajı mümkün kılar; kohezyon, kavramda kuplajdan farklı olmasına rağmen, aynı şekilde elde edilir. Bir modüle daha az bağımlı olmak, bunlar o modüle daha spesifik hale gelir ve böylece uyumu arttırır. Ayrıca toplam modül sayısı artacak ve doğrudan daha tutarlı bir sisteme dönüşen bağımlı modül (tanrı nesnelerinin aksine) için özel şeyler yapmak için daha uzmanlaşmış hale gelecektir.

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.