什么是内容耦合?

时间:2014-11-28 11:58:43

标签: java

任何人都可以解释什么是内容耦合,以及它是如何在以下代码中发生的:

public class Line
{
  private Point start, end;
  ...
  public Point getStart() { return start; }
  public Point getEnd()  { return end; }
}
 
public class Arch
{
  private Line baseline;
  ...
  void slant(int newY)
  {
    Point theEnd = baseline.getEnd();
    theEnd.setLocation(theEnd.getX(),newY);
  }
}

谢谢。

3 个答案:

答案 0 :(得分:4)

当您将一个实例存储在另一个实例中时,会发生内容耦合,并且您可以通过非预期或透明的方式从外部实例修改内部实例。

在这里,您有一个存储在Line实例中的Arch实例;并且Line存储两个Point个。当您在slant()上调用Arch时,它会从Point内部获取Line之一并更改它。因此,基础Point的状态发生了变化。

如果此Point存储在应用程序的其他位置,则在发现Point移动时可能会感到震惊。

答案 1 :(得分:0)

  • 确保每个人都遵循规则,即不修改自身存储在其他对象的实例变量中的对象的实例变量
  • 使用不可变或只读界面设计模式
  • 将所有实例变量设为私有,并提供访问方法,如getVal和setVal。
  • 如果你这样做,那么你就可以确信访问和修改变量的唯一地方是这些方法

答案 2 :(得分:0)

通常,内容耦合是一种设计缺陷,其中一个模块依赖于另一个模块的实现细节,而不是完全依赖于它的公共接口。大多数情况下,这意味着一个模块读取/写入应该封装在另一个模块中的数据,绕过它的合同。

这是最紧密(最差)的耦合,因为这样的模块:

  • 目前糟糕的抽象
  • 很难理解
  • 无法彼此独立更改

在您的示例Arch中,内容与Line相关联,因为Arch修改了LinePoint个实例)的内部数据。

现在,如果Line必须更改存储数据的方式,或者添加其他代码来处理点更新,那么Arch类也必须更新,因为它绕过Line的接口{1}}并使用Point的界面代替。