什么是高凝聚力以及如何使用/制造它?

Nik*_*ntz 77 cohesion

我正在学习计算机编程,在几个地方我偶然发现了凝聚力的概念,我理解软件具有"高凝聚力"是理想的,但它意味着什么?我是一名Java,C和Python程序员,从C++ Primer一书中学习C++,它在索引中没有提到内聚,你能指点我关于这个主题的一些链接吗?我没有找到关于计算机科学凝聚力信息的维基百科页面,因为它只是说它是一个定性测量,并没有给出真正的代码示例.

And*_*i M 226

高凝聚力是指你有一个能完成明确工作的课程.低凝聚力是指一个班级做很多没有太多共同点的工作.

我们来看这个例子:

您有一个添加两个数字的类,但同一个类创建一个显示结果的窗口.这是一个低内聚类,因为窗口和添加操作没有太多共同之处.窗口是程序的可视部分,添加功能是它背后的逻辑.

要创建高度内聚的解决方案,您必须创建一个类Window和一个类Sum.该窗口将调用Sum的方法来获取结果并显示它.这样,您将单独开发应用程序的逻辑和GUI.

  • 老实说,我没有像那样定义Cohesion.您的定义是SRP(单一责任原则).并且凝聚力是关于包装明智的,相同特征轨道的类是否彼此接近. (12认同)
  • SRP(单一责任原则)只是表达相同概念的另一种方式.凝聚力更多是一个指标; SRP是一个务实的指导方针,如果遵循将导致有凝聚力的课程. (4认同)
  • 我认为类窗口不应调用类总和的任何对象,因为它的唯一目的是使它不需要知道类总和或任何其他类的“存在”。应该有另一个类说驱动程序,应从中获取结果sum类,并将结果传递给Window类进行渲染 (2认同)
  • 我不明白。根据鲍勃叔叔的干净代码,这不是内聚力。这是建议零售价 (2认同)

m3t*_*man 45

解释史蒂夫麦康奈尔的代码完成是什么:

内聚指的是一个类中的所有例程或例程中的所有代码都支持一个主要目的.包含 强相关功能的类被描述为具有强大的内聚力,启发式目标是使内聚尽可能强大.Cohesion是管理复杂性的有用工具,因为类中的代码越多,支持中心目的,您的大脑就越容易记住代码所做的一切.

从鲍勃叔叔的清洁代码中获得它的一些方法:

类应该有少量的实例变量.类的每个方法都应该操纵这些变量中的一个或多个.通常,方法操作的变量越多,该方法对其类的内聚性就越强.每种方法使用每个变量的类最大程度地具有内聚性.

一般来说,创建这样最具凝聚力的类别既不可取也不可能; 另一方面,我们希望凝聚力很高.当内聚力很高时,这意味着类的方法和变量是相互依赖的,并且作为一个逻辑整体挂在一起.

凝聚力的概念与耦合的概念密切相关; 此外,还有一个基于高内聚启发式的原则,称为单一责任原则(SOLID中的S).

  • 我认为你的答案比公认的答案更完整,因为它描述了 SRP 和内聚力,因此有助于理解这两个概念之间的特殊性和差异。 (2认同)

nha*_*tdh 17

高凝聚力是一种软件工程概念.基本上,它说一个班级应该只做它应该做的事情,并完全做到.不要使用它不应该执行的函数来重载它,并且与它直接相关的任何内容也不应该出现在其他类的代码中.

示例非常主观,因为我们还必须考虑比例.一个简单的程序不应过于模块化,也不应该分散; 而复杂的程序可能需要更多级别的抽象来处理复杂性.

例如电子邮件类.它应该包含数据成员to,from,cc,bcc,subject,body,并且可能包含这些方法saveAsDraft(),send(),discardDraft().但是login()不应该在这里,因为有很多电子邮件协议,应该单独实现.


RBa*_*rda 11

凝聚力通常使用LCOM(缺乏凝聚力)指标之一来衡量,最初的LCOM指标来自Chidamber和Kemerer.例如,请参阅:http: //www.computing.dcu.ie/~renaat/ca421/LCOM.html

一个更具体的例子:如果一个类有一个私有字段和三个方法; 当所有三种方法都使用此字段执行操作时,该类非常有凝聚力.

有凝聚力的类的伪代码:

class FooBar {
  private SomeObject _bla = new SomeObject();

  public void FirstMethod() {
    _bla.FirstCall();
  }

  public void SecondMethod() {
    _bla.SecondCall();
  }

  public void ThirdMethod() {
    _bla.ThirdCall();
  }
}
Run Code Online (Sandbox Code Playgroud)

如果一个类有三个私有字段和三个方法; 当所有三种方法只使用三个字段中的一个时,那么该类的内聚性很差.

一个不太有凝聚力的类的伪代码:

class FooBar {
  private SomeObject _bla = new SomeObject();
  private SomeObject _foo = new SomeObject();
  private SomeObject _bar = new SomeObject();

  public void FirstMethod() {
    _bla.Call();
  }

  public void SecondMethod() {
    _foo.Call();
  }

  public void ThirdMethod() {
    _bar.Call();
  }
}
Run Code Online (Sandbox Code Playgroud)

做一件事的原则是单一责任原则,它来自Robert C. Martin,是SOLID原则之一.该原则规定一个班级应该只有一个改变的理由.

保持接近单一责任原则可能会产生更具凝聚力的代码,但在我看来,这是两个不同的事情.


She*_* Fn 5

大多数答案都没有解释什么是内聚力,它在鲍勃叔叔的书《干净的代码》中得到了很好的定义。

类应该有少量的实例变量。类的每个方法都应该操作一个或多个这些变量。一般来说,方法操作的变量越多,该方法与其类的内聚性就越高。每个方法都使用每个变量的类具有最大的内聚性。一般来说,创建这种具有最大凝聚力的阶级既不明智也不可能。另一方面,我们希望凝聚力较高。当内聚性高时,意味着类的方法和变量是相互依赖的并且作为一个逻辑整体挂在一起。

让我用类定义来解释它

class FooBar {
private _bla;
private _foo;
private _bar;

function doStuff()

   if(this._bla>10){
     this._foo = 10;
     this._bar = 20;
   }

}
function doOtherStuff(){

    if(this._foo==10){
       this._bar = 100;
       this._bla = 200;
    }
}

}
Run Code Online (Sandbox Code Playgroud)

如果您看到上面的示例,则该类是内聚的,这意味着变量在类之间共享以协同工作,共享更多变量意味着该类具有高度内聚性并作为一个单元工作。