得墨meter耳定律如何适用于有关耦合和内聚的面向对象系统?[关闭]


15

得墨meter耳定律如何应用于具有耦合和凝聚力的面向对象系统?

我正在读一本书“软件开发和专业实践”,偶然发现了有关LoD的一章,并对如何将这一原理应用于面向对象的系统感到好奇。


我曾经继承了一个项目,该项目具有很高的耦合度(星形拓扑)。我通过使用“调解器模式”来限制对象之间的耦合,并让调解器与每个对象进行通信来清理事物。尽管仍然存在耦合,但它限制了耦合的人数。如果某些人认为自己的设计存在高耦合问题,则可能希望对其进行更多研究。
Jeach

Answers:


9

根据艾默生·马塞多Emerson Macedo)的说法,得墨meter耳定律规定如下:

  • 每个单元对其他单元的了解应该有限:只有与当前单元“紧密”相关的单元。
  • 每个单位只能与朋友交谈;不要跟陌生人说话。
  • 只与您的直系朋友交谈。

这直接对应于低耦合原理,因为单元(或对象)应该像上面那样:

  • 不能彼此紧密耦合。只有最接近的是。
  • 每个人仅应与其协作者交谈,而不应与协作者交谈
  • 只与即时协作对象交谈

耦合的最低形式之一是消息传递,即,通过带有参数的方法调用在对象之间共享数据。

此外,据我所知,得墨meter耳定律并不直接对应于高凝聚力原理,因为它仅说明对象本身应该知道其拥有的数据。内聚性低的对象具有其自身方法中不经常使用的数据成员。它更多地是关于对象的内容,而不是其关系和协作对象。


8

联轴器,简化

当一个对象调用另一个对象的方法,属性等时,我们说这些对象是耦合的。我们称之为耦合因为现在被叫不能改变任何有关其自己的方法/道具。不打断电话

因此,更多的耦合-方法,道具。-更改被调用者代码而不破坏使用该代码的所有代码越难。

考虑耦合

  • 即使引用单个prop。,方法也会耦合两个对象。
  • 显然,耦合对于创建软件是必要的。
  • 鉴于耦合的“锁定步骤”性质,我们要限制和隔离它。这个目标只是与通用软件开发人员一起实现的。原则。
  • 我们必须交谈的对象越少,耦合度就越低。
  • 如果我需要进行20个不同的方法调用,那么如果所有20个调用都针对一个类/对象,则耦合度较低,反之,那些相同的方法分布在多个类/对象上。

大多数知识导致疯狂的耦合

在这里,我们有一个Employee,有一个Person具有“地址”

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

要上街,我必须致电:myEmployee.me.home.street。这与最小知识原理相反180度。我必须知道关于内部结构,复合结构,的EmployeePersonAddress班级。

这种缺陷一流的设计力量我知道所有这些类,因此myEmployee.me.home.street夫妻我(主叫对象)不低于3类-只得到一个单一的财产!

最少的知识可以节省一天

如果我仅与Employee班级交谈,那么我本身就是在应用最低限度的知识原理,通过这样做,我们自动耦合仅限于该班级,同时耦合隔离到该班级。

通过在Employee类中添加所有需要的属性,我们修复了耦合。

从而

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

请允许我打电话:myEmployee.street-

  1. 我只“知道” Employee
  2. 我仅耦合Employee-无论其结构多么复杂。

最低的知识

我们从分离myEmployee PersonAddress,理想情况下,我们应继续通过增加应用至少知识通过通特性,使得Employee只会谈Person,并Person只会谈Address


1

研究(V. Basili,L。Briand和WL Melo。对面向对象设计指标作为质量指标的验证)表明,响应集较大的类比响应集较小的类倾向于产生更多错误,因为响应集更多意味着更高耦合的机会。

得墨Law耳定律的价值在于它可以减少定义的响应。对象的方法只能调用自身的方法,传递给该方法的任何参数,它创建的任何对象的方法以及任何直接持有的对象的方法。由于响应集较小,因此发生高耦合的机会较小。由于模块/方法仅使用立即可用的引用,因此具有更高的内聚性。


1
研究(Anquetil,N.和Laval,J. Legacy软件重组:分析具体案例)还表明,减少耦合和增加内聚并不总是会带来更好的质量。依靠单个的小型研究的结果认为有害。

0

这很简单;假设A取决于B,而B取决于C。没有得墨meter耳定律,您可以在A中同时使用B和C,但是如果遵守该定律,则A仅取决于B,而不能取决于C。

这可以实现低耦合,因为它大大减少了模块的依赖性。内聚力虽然在概念上与耦合不同,但以相同的方式实现。通过减少对模块的依赖,它们对该模块变得更加特定,从而提高了凝聚力。模块的总数也将增加,并且它们将变得更加专门用于做依赖于模块(与上帝对象相反)的工作,这些模块直接转换为更一致的系统。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.