问题标签 [cohesion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
809 浏览

oop - 高内聚如何帮助我们减少耦合?

承担方法M1M2 具有密切相关的职责

第一个例子:

如果

M1M2在类中定义A(因此类A是高度内聚的)

• 类B用途A.M1和类C用途A.M2

然后

ABC类耦合

• 更改 will 的签名 M1只需要更改 in B,而不需要更改C

第二个例子:

如果

M1在类中定义A1(因此B与 耦合A1

•与M2类一起定义A2(因此C与 耦合A2

然后

• 更改 will 的签名M1只需要更改 in B,而不需要更改C

a)据我了解,上一个示例中的类并不比第一个示例中的类更耦合!还是我错过了什么?

b)据我所知,第一个示例中的类比第二个示例中的类更松散耦合,前提是:

  • 我们假设更改 的签名M1也需要我们更改 的签名M2,但我不认为这种情况经常发生?!

  • 或者如果两者都M1M2相同类型的数据 T1 进行操作,那么将 T1 替换为 T2 将需要同时更改M1M2?!

  • 或者,如果我们假设由于M1并且具有密切相关的责任,那么改变通常需要M2改变的机会要大得多(即使不直接或间接调用)?!M1M2M1M2

  • 或者,如果我们假设由于M1并且具有密切相关的职责,那么某些类需要两者的M2可能性要大得多(因此在单个类中具有and会减少耦合)?!M1M2M1M2

M1c) 定义and M2within A(而不是定义M1withinA1M2within )是否有任何其他原因A2会减少耦合?

注意 - 我知道我们应该拥有高度内聚的模块,因为它更易于维护和可重用

谢谢

0 投票
4 回答
4542 浏览

oop - “高凝聚力”是“单一职责原则”的代名词吗?

高凝聚力单一职责原则的同义词吗?如果不是,它们有何不同?

0 投票
2 回答
1934 浏览

oop - 代码纠缠和内聚之间的区别?

关于横切关注点和面向方面的编程,您经常阅读有关代码缠结的信息。本文1将代码纠缠描述为:

软件系统中的模块可以同时与多个需求交互。例如,开发人员经常同时考虑业务逻辑、性能、同步、日志记录和安全性。如此众多的需求导致同时存在来自每个关注点的实现的元素,从而导致代码纠结。

这不和低凝聚力完全一样吗?高缠结和低内聚之间有什么区别,还是两个不同的词描述的是同一件事?

0 投票
1 回答
267 浏览

ajax - 在 mvc 中将表单的 ajax 脚本(什么控制器)放在哪里?

这是我的情况:我有一个视图(我们称之为视图V),它带有一个带有多个组合框的表单,用于选择一些参数。

我想通过 AJAX 调用动态加载这些组合框的选项(在组合框中选择一个项目将加载其他带有数据的项目)

每个组合框向框架上的不同控制器(依次调用不同模型以获取数据)发出 AJAX 请求。让我们将这些控制器称为C1C2C3和模型M1M2M3

C1C2C3上的这些 AJAX 脚本很可能在未来的其他视图上使用

但我怀疑这是否是正确的方法。我把那些 AJAX 脚本放在哪里?在每个控制器或单独的控制器上(可能称为 FormAPI 或类似的东西)

在每个控制器上放置一个 ajax 脚本我将 V 与C1C2C3耦合,而为三个请求制作一个控制器只会将我的视图 V 与一个控制器耦合。此外,从我的角度来看,这样的控制器将具有高度的凝聚力。

但是,我可能不会保持我的代码 DRY,因为C1C2C3已经有一些逻辑来接收“获取M1M2M3的列表”类型的请求,我可以将其呈现为 JSON 并将其返回到视图V

如果我有另一个视图V2需要对C1C2C3、 ... CN的请求,将来会发生什么?我想很快我的代码将是“意大利面条耦合”

你怎么看?

另一个问题:我是否应该在 M1、M2、M3 上有逻辑来获取数组和项目列表?例如,如果 M1 有多个 M2 实例,创建方法 M1->getM2asArray() 是否正确

0 投票
2 回答
80 浏览

c - 在保持松散耦合的同时保留对象

我在微控制器中处理一个项目,我需要保留一些设置。假装这是一个 iPod。我需要保存各种设置,如CurrentSongPlayingCurrentVolume等,以便再次打开时可以恢复这些设置。我遇到的麻烦是将我所有的非易失性设置存储在一个结构中是有意义的,我可以从内存中序列化/反序列化,但是如果没有类执行,我无法找到一种方法来实现这一点来自非易失性存储器的序列化/反序列化,包括每个包含需要保存以获取大小/类型信息的设置的类。是否有某种设计模式可以让我将所有这些设置保存到内存中,而不必知道我正在保存什么?

0 投票
5 回答
867 浏览

java - 识别 (JAVA) 代码内聚块的工具

我想知道是否有一种工具可以识别 JAVA 源代码中的内聚代码块。例如,如果我有一个很长的方法,我想从中提取另一个方法 - 是否有任何工具可以自动告诉我值得提取的大量代码?

0 投票
2 回答
576 浏览

architecture - 将顺序内聚转变为功能内聚?

本网站所述,

具有(仅)程序凝聚力的模块是支持不同且可能不相关的活动的模块,其中控制从一个活动传递到下一个活动。Page-Jones 给出了一个模块示例(其名称可能类似于“准备假日餐:”

  • 清洁前一餐的餐具
  • 准备烤火鸡
  • 打电话
  • 洗澡
  • 切菜
  • 设置表

现在我的问题是,如果这些活动中的每一个,即打电话,都被提取到它们自己的方法中,但仍然以相同的顺序调用,即

这种方法仍然是程序凝聚力的一个例子吗?或者它是否在功能上具有凝聚力,因为它支持执行一项与问题相关的任务的活动,在这种情况下是准备一顿饭?

0 投票
1 回答
1513 浏览

c - 开源或免费软件 C 代码度量工具?

我一直在尝试找到一种工具(希望适用于 MAC OS X,但我不介意迁移)——适用于这些尺寸,但我没有运气。Maultech提到了一些,这个页面也是如此,但我无法让它们工作。Meter 和 ccount(在该页面上列出)似乎涵盖了我想要的大部分内容。这些工具似乎也不再是最新的了,这让我不确定输出是否仍然可以信任。

当前是否有任何免费或开源的 C 工具可以做到这一点?我发现的大部分内容都是针对 Java 或 OO 的。

我所说的简单指标是指例如计算数量、字符、空格、函数、方法、语句数量、嵌套深度等。

大小是指代码行和注释。

我所说的复杂性至少是指 mccabe 和 halstead 度量。

耦合和凝聚力是指函数调用等之间的交互(这是已知的 SE 原则)。

0 投票
2 回答
70 浏览

oop - 共享重要实例而不耦合

假设您正在编写一个“更大”的应用程序,并且您想在类中记录某些错误。现在几乎每个班级都需要访问 Logger。

一个简单的解决方案如下(PHP,但这没关系):

这种方法的问题是它使每个使用 Logger 的类都依赖它,并且你不能简单地在没有 Logger 的其他项目中使用相同的类。它是紧密耦合的。如果不更改SomeClass.

上述方法的“小”升级如下:

这并不能真正解决问题,因为SomeClass现在只依赖于LoggerFactory并且它与它紧密耦合。这样做的好处是,它LoggerFactory现在可以返回该类的不同实例Logger。因此,如果您想更改记录消息的方式,则无需更改SomeClass.

另一种方法是使用依赖注入:

现在这不SomeClass与任何特定的类耦合。它只需要一个实现Logger接口的类。但是我遇到的问题是,Logger每当您创建一个对象时,您都需要将一个实例传递给构造函数。

我遇到的另一个问题是,Logger 并不是真正的Position类的一部分,例如$xand $y。它只是一个实用程序。

你如何最好地处理这种情况?在这种情况下,耦合和内聚之间的最佳折衷是什么?

0 投票
2 回答
937 浏览

c# - Remove coupling and then mock for unit test

This is a dilemma. Say we have two classes

Now this presents two tightly coupled classes. For testing B.fun(), we need to mock Class A and provide multiple values for A.memberValue.

As the A object is not required anywhere else beyond the scope of B.fun(), I dont see why should we inject it through B's constructor. How can we unit test this method fun() ?