虽然这个论坛上有很多很好的例子包含了耦合和凝聚的例子,但我很难将它完全应用到我的代码中。我可以在代码中识别可能需要更改的部分。是否有任何Java专家能够查看我的代码并向我解释哪些方面是好的和坏的。我根本不介意改变它。只是很多人似乎彼此不同意,我发现很难真正理解要遵循的原则......
答案 0 :(得分:3)
首先,我想说你得到如此不同答案的主要原因是,随着时间的推移,这确实会成为一门艺术。你得到的许多意见并不归结为一个严格的快速规则或事实,更多的是归结为一般经验。在这样做10到20年后,你开始记住你做了什么导致疼痛的事情,以及你如何避免再次这样做。许多答案适用于某些问题,但个人的经验决定了他们的意见。
我的代码中只有一个非常重要的东西会改变。我会考虑调查所谓的命令模式。无论是在网上还是在GoF书中,都不难发现有关这方面的信息。
主要思想是你的每个命令“add child”,“add parent”成为一个单独的类。单个命令的逻辑包含在一个易于测试和修改的小类中。然后应该“执行”该类以从主类开始工作。通过这种方式,您的主类只需要处理命令行解析,并且可能失去大部分对FamilyTree的了解。它只需知道哪些命令行映射到哪些Command类并启动它们。
那是我的2美分。
答案 1 :(得分:1)
我可以推荐艾伦和詹姆斯的书 Design Patterns explained -- A new perspective on object-oriented design (ISBN-13:978-0321247148):
这是一本关于 has-a 和 is-a 决定的好书,包括面向对象设计中的内聚和耦合。
答案 2 :(得分:1)
简而言之:
软件工程中的凝聚力,就像在现实生活中一样,整体构成的元素(在我们的例子中,我们说是一个类)可以说它们实际上属于一个整体。因此,它是衡量软件模块源代码表示的每个功能的强烈关系的度量。
根据OO观察内聚的一种方法是,如果类中的方法使用任何私有属性。
现在讨论比这更大但是高凝聚力(或凝聚力的最佳类型 - 功能凝聚力)是模块的某些部分被分组,因为它们都有助于模块的单个明确定义的任务。
简单地说,一个组件(再次,想象一个类,虽然不一定)知道另一个组件的内部工作或内部元素,即它对另一个组件有多少知识。
松散耦合是一种互连系统或网络中组件的方法,以便这些组件在实际可能的最小程度上相互依赖...
长期:
I wrote a blog post about this. 它通过示例等详细讨论了所有这些内容。它还解释了为什么要遵循这些原则的好处。我认为这可能会有所帮助......
答案 3 :(得分:0)
耦合定义了每个组件依赖于系统中其他组件的程度。给定两个组件A和B,如果A发生变化,B中的代码必须改变多少。 Cohesion定义了单个软件组件的各种功能的连贯性或强相关性的度量。它指的是该类的功能。 低凝聚力意味着班级会做各种各样的行动,而不是专注于它应该做的事情。高凝聚力意味着课程专注于它应该做的事情,即只有与课堂意图有关的方法。 注意:良好的API表现出松耦合和高内聚力。 应始终避免的一种特别令人厌恶的紧耦合形式是具有直接或间接相互依赖的两个部件,即依赖性循环或循环依赖性。 以下链接中的详细信息 http://softwarematerial.blogspot.sg/2015/12/coupling-and-cohesion.html