【问题标题】:Cohesion and Coupling - How does one determine the threshold?凝聚力和耦合 - 如何确定阈值?
【发布时间】:2017-01-26 07:31:03
【问题描述】:

我现在正在进一步介绍 java 类,这是该类简要定义的方式:

凝聚力:以高凝聚力为目标,在这种情况下凝聚力意味着单个模块紧密关注其任务。

耦合:以低耦合为目标,在这种情况下,耦合意味着两个或多个模块相互交织的程度。

如何确定内聚度和耦合度?

例如,我的一些方法调用了同一个类中的其他方法。这意味着调用其他方法的方法依赖于其他方法,以便“调用”方法完成其代码块。这是否意味着我对同一类的方法具有低内聚和高耦合?还是这些概念更多地涉及不同的类和不同的包?

【问题讨论】:

  • 是类/模块问题,不是方法问题。
  • 谢谢!课堂笔记对此不是很清楚,所以我想确认一下。这些概念还有什么重要的我应该知道的吗?

标签: java coupling cohesion


【解决方案1】:

内聚和解耦在各个层面都很重要:每一行代码应该有特定的含义和目的,每个方法应该有特定的含义和目的,每个类应该有特定的含义和目的,每个包应该有特定的含义和目的意义和目的,每个代码库都应该有特定的意义和目的。

这并不意味着一个方法不应该调用另一个方法,一个类不应该使用另一个类,等等;相反,这意味着理想情况下,您应该能够阅读和理解一个方法而不阅读它调用的所有其他方法,阅读和理解一个类而不阅读它使用的所有其他类,等等。

也就是说,我们期望更大的单元具有更大的内聚性和解耦性:类需要比方法更具内聚性和更不紧密耦合,例如,因为假设您的类大小合理,您可以更轻松地去在阅读和维护代码时,在方法之间来回而不是在类之间来回。

【讨论】:

  • 干杯,就像我提出问题的方式一样,您可能会说我对 Java 还是很陌生...我确实阅读了针对 IE 软件工程师的 Reddit AMA,他们提到有很多遗留代码......我的猜测是由于内聚和耦合的水平,但同样是我缺乏经验,所以猜测比什么都重要
【解决方案2】:

有内聚/耦合的指标;见https://softwareengineering.stackexchange.com/questions/151004/are-there-metrics-for-cohesion-and-coupling

因此,“确定”内聚/耦合程度的方法是实施一个衡量相应指标的工具。 (或者找到执行此操作的现有工具。例如,Sonar。)

如何确定内聚和/或耦合水平的阈值

我假设您的意思是......您如何决定何时将代码库中的各个指标的值称为“不可接受”。

基本上,这由您决定。我会通过查看工具报告“坏”值的示例来做到这一点,并确定我认为它到底有多糟糕。或者,坚持使用您正在使用的工具中的默认阈值。

【讨论】:

    【解决方案3】:

    我可能错了,但这只是我的拙见。

    内聚经常与耦合一起被提及,但它们具有相反的关系。高内聚 == 低耦合。

    让我引用你的话

    以高凝聚力为目标,在这种情况下凝聚力意味着一个单一的 模块专注于其任务。

    所以意思就是这样。只做一件事并且做得很好的东西。例如,将实体保存到数据库的方法应该只关注如何将该实体保存到数据库,它不应该担心该实体的正确性(是否所有该实体实例属性都通过所有数据库模式验证,在这种情况下,这个验证应该由拦截器处理)。

    耦合是指两个模块相互依赖的程度,越少越好,因为它促进了维护,以及可重用性等。很多时候,低耦合是通过使用事件来实现的,我们有事件发射器和事件消费者,他们不必互相了解任何事情。甚至发射器也只是即发即弃,当系统将事件传递给消费者时,消费者将接受这些事件。

    【讨论】:

    • 谢谢,我理解了定义,并且根据我在工作中看到的东西(不是作为工程师,我作为艺术家工作),游戏引擎中的逻辑在很大程度上取决于火和-忘记概念。我会进一步研究这个......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多