标签: cohesion

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

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

cohesion

77
推荐指数
5
解决办法
8万
查看次数

耦合,内聚和Demeter定律

得墨忒耳定律指出你应该只给你关于直接了解对象说话.也就是说,不要执行方法链接与其他对象交谈.当您这样做时,您正在与中间对象建立不正确的链接,不恰当地您的代码与其他代码耦合.

那很糟.

解决方案是针对您所知道的类,基本上公开简单的包装器,将责任委托给与其有关系的对象.

非常好.

但是,这似乎导致班级具有低凝聚力.它不再只是简单地对其所做的事情负责,但它也有代表在某种意义上,通过复制其相关对象的部分界面使代码更具凝聚力.

那很糟.

它真的会降低凝聚力吗?它是两个邪恶中的较小者吗?

这是发展的灰色区域之一,您可以在哪里讨论线路的位置,或者是否有强有力的,有原则的方式来决定在哪里划线,以及您可以使用哪些标准来做出决定?

oop refactoring coupling cohesion law-of-demeter

64
推荐指数
3
解决办法
7544
查看次数

凝聚力和解耦

谁能告诉我什么是凝聚力和解耦?我找到了耦合,但在任何地方都没有去耦.我需要了解它们的含义.

任何帮助将不胜感激.感谢回复.

oop coupling cohesion decoupling

34
推荐指数
2
解决办法
4万
查看次数

是否值得尝试为世界上最紧密耦合的网站编写测试?

想象一下,90%的工作仅仅是为了在一个非常庞大,非常破碎的网站上分类问题.想象一下,这个网站是用你所见过的最紧密耦合,最不具有凝聚力的PHP代码编写的,这种代码类型可以将原始开发人员添加到你的"一瞥"栏目中.想象一下,这个Web应用程序由4个非常不同的部分组成(1个商业,2个"重新定位",1个自定义)和一堆垃圾虚拟胶带和垫片.想象一下,它包含了一种编程实践,其中网站的主要组件实际上依赖于不正常工作的东西,修复这些破碎的东西通常会破坏其他东西.想象一下,你从太多糟糕的经历中知道改变一个看似无害的网站部分,比如拆分"名字" 字段分为两个单独的"第一"和"最后"字段,将使网站瘫痪,需要数小时的回滚,合并和补丁.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.想象一下,多年来恳求客户抛弃代码并重新开始,但遭遇企业级绝望和手工绞尽脑汁.然后想象获得ASAP/EMERGENCY门票以实现新功能,在任何其他网站上需要4个小时,但你对这个网站有更好的了解,所以你引用了40个小时,然后直接吹了80个小时,但它没关系,因为客户端用于他们的网站.

以下是您还应该想象的其他一些事情:

  • 现在没有任何测试
  • googleteen有不同的登录层.有些客户实际上有3个不同的帐户用于网站的不同部分
  • 当我说"紧耦合"时,我的意思是include/require语句的循环可能会像凯尔特结一样映射出来
  • 当我说"最不具凝聚力"时,我的意思是某些东西有点像MVC,但它不是真正的MVC.在某些情况下,您可能需要几个小时才能找到URI A如何映射到文件B.
  • 用户界面写得像"突兀","无法访问"是当时的流行语

想象一下,甚至值得尝试达到中等水平的测试覆盖率?或者,在这个想象的情景中,你应该继续尽你最大的努力,你已经给予了什么,并希望,祈祷,甚至牺牲,客户将同意重写其中一天,然后你就可以开始写作了测试?

附录

因为你们中的许多人提出了这个问题:我已经接触过每次机会重新写作的可能性.与我合作的营销人员知道他们的代码是垃圾,他们知道这是他们最初使用的"最低出价"公司的错.作为承包商,我可能已经超越了我的界限,指出他们花了我一大笔钱给我这个网站提供临终关怀服务,而且从头开始重新开发他们会很快看到投资回报率.我还说我拒绝按原样重写网站,因为它实际上并没有按照他们的意愿去做.计划是重写它的BDD风格,但让所有关键球员都在一个地方很难,我仍然不确定他们知道他们需要什么.无论如何,我完全希望这是一个非常大的项目.

感谢到目前为止的所有反馈!

php testing cohesion tightly-coupled-code

30
推荐指数
5
解决办法
903
查看次数

"高凝聚力"是"单一责任原则"的同义词吗?

高内聚的代名词单一职责原则?如果没有,它们有何不同?

oop cohesion

15
推荐指数
2
解决办法
2925
查看次数

在一个窗口中嵌入多个视图控制器

我想要一个包含多个视图的视图.见下图: 在此输入图像描述

如您所见,pageController控件页面导航并在viewController(页面)之前和之后提供.

pageContentController显示文本并处理它们.

soundPlayer管理播放相关的声音

我可以将它们全部放在一个控制器中,但我的控制器必须完成很多任务并且管理它将是一项艰巨的任务.因为它违反了光视图控制器.并降低其凝聚力.所以我想知道如何实现这一点,请详细解释.

objective-c cohesion uiviewcontroller ios

7
推荐指数
1
解决办法
4613
查看次数

如何在不使用Spring等时将Swing GUI与Business Logic分开

请注意,这是一篇很长的帖子.对不起,但我想澄清一点:

我想知道如何将Swing GUI与Presentation和Business Logic分开很长一段时间.在工作中,我必须使用一个小的Swing对话框为一些数据实现3 MD Excel Export以配置导出.我们不使用像Spring这样的框架,所以我必须自己实现它.

我想完全将GUI与Business Logic分开,这些都是精确的后续任务:

  • 告诉BL从GUI开始工作
  • 从BL到GUI报告进度
  • 报告从BL到GUI的日志记录
  • 将BL结果委托给GUI

当然,GUI不应该注意BL实现,反之亦然.我创建了上述所有这些任务,例如几个接口ProgressListener,LogMessageListener,JobDoneListener等,要由业务逻辑被解雇.例如,如果业务逻辑想要告诉记录,则会调用

fireLogListeners("Job has been started");
Run Code Online (Sandbox Code Playgroud)

实现公共接口LogListener +的类附加到BL,现在将通知有关"作业已启动"的日志消息.所有这些监听器此时都是由GUI本身实现的,一般看起来像这样:

public class ExportDialog extends JDialog implements ProgressListener, LogListener, JobFinishedListener,  ErrorListener {

    @Override
    public void jobFinished(Object result){
        // Create Save File dialog and save exported Data to file.
    }

    @Override
    public void reportProgress(int steps){
        progressBar.setValue(progressBar.getValue()+steps);
    }

    @Override
    public void errorOccured(Exception ex, String additionalMessage){
        ExceptionDialog dialog = new ExceptionDialog(additionalMessage, ex);
        dialog.open();
    }

    // etc.
}
Run Code Online (Sandbox Code Playgroud)

"GUI和BL创建类"只是将GUI(作为所有这些侦听器的界面)附加到BL,它看起来像这样: …

java oop swing cohesion decoupling

7
推荐指数
1
解决办法
1269
查看次数

高内聚和松耦合的优化

我在一次关于项目凝聚力和耦合的技术访谈中受到了质疑.我广泛地解释了他们的定义,尽管我没有正确回答问题的第二部分,正如他所说的那样.

"我们怎样才能在项目中同时实现高度内聚和松散耦合的设计,请解释如何在单一项目中实施这种方法?"

我回答说这两个目标是矛盾的,所以我们需要找出每个项目或模块的最佳选择,但我无法提供全面的答案.

如果有人帮助我,我将不胜感激.

java oop cohesion loose-coupling

7
推荐指数
1
解决办法
946
查看次数

如何手动计算群集的轮廓,内聚力和分离度

美好的一天!

不幸的是,尽管资源丰富,但我一直在Internet上寻找如何计算轮廓系数,内聚力和分离度的方法,但我只是不明白所发布的公式。我知道某些工具中有它的实现,但是我想知道如何手动计算它们,尤其是在给定向量空间模型的情况下。

假设我具有以下群集:

群集1 = {{{1,0},{1,1}}
群集2 = {{1,2},{2,3},{2,2},{1,2}},
群集3 = {{ 3,1},{3,3},{2,1}}

我根据[1]理解它的方式是,我必须获得每个群集的平均点数:

C1 X = 1; Y = .5
C2 X = 1.5; Y = 2.25
C3 X = 2.67; Y = 1.67

给定均值,我必须通过平方误差和(SSE)来计算我的内聚力:

内聚(C1)=(1-1)^ 2 +(1-1)^ 2 +(0-.5)^ 2 +(0-.5)^ 2 = 0.5
内聚(C2)=(1-1.5) ^ 2 +(2-1.5)^ 2 +(2-1.5)^ 2 +(1-1.5)^ 2 +(2-2.5)^ 2 +(3-2.5)^ 2 +(2-2.5)^ 2 +(2-2.5)^ 2 = 2
内聚力(C3)=(3-2.67)^ 2 +(3-2.67)^ 2 +(2-2.67)^ 2 +(1-1.67)^ 2 +(3- 1.67)^ 2 +(1-1.67)^ 2 = 3.3334 …

validation cluster-analysis cohesion

5
推荐指数
2
解决办法
7809
查看次数

对象凝聚力的Java标准是什么?对象中的太多信息是否意味着糟糕的设计? - 见例子

我正在创建一个模拟机场着陆系统的项目.我有一个plane存储我需要排序的所有信息对象planequeue和存储在数据库中.所有重要信息都包含在对象中,但我还包括每个平面的坐标.我的问题是它可能不被认为具有凝聚力,因为每个人都plane做了很多不同的事情.

我只是想知道这是否被认为是糟糕的设计还是有更好的方法来做到这一点?

此外,对象内部凝聚力的"规则"是什么?是否有特定的设计模式可以解决这个问题?

public class Plane extends Aircraft {
/*
 * Flight status should only take one of these enum values
 */
private static enum Status {
    REGISTERED, IN_QUEUE, LANDING, LANDED
};

// Set aircraft status to REGISTERED when created
private Status status = Status.REGISTERED;

private double fuelLevelPercentage;
private int passengerCount;
private int aircraftNumber;
private String airlineCompany;
private String departureAirport;

// This is used by the constructor to assign a random city …
Run Code Online (Sandbox Code Playgroud)

java design-patterns object cohesion

5
推荐指数
1
解决办法
520
查看次数