即使我认为我理解单一职责原则和高/低内聚原则,以下问题仍然让我有些困惑
1)假设Planet
和Bird
属性在Car
类中任意/随机放置(即,没有代码Car
需要或对这两个属性返回的两个对象进行操作) - 换句话说,Planet
属性Bird
不属于 Car 类
一种)
SRP声明对象应该只有一个改变的理由。
public class Car
{
public void StartEngine()
{ ... }
private Planet Planet
{
get { ... }
}
private Bird Bird
{
get { ... }
}
}
班级是否Car
违反 SRP?我会说它不会破坏 SRP,因为任何更改Planet
或Bird
实例都不会传播到Car
类?
b)
内聚是指一个类中方法和类级别变量的密切程度。在高度内聚的类中,所有方法和类级变量一起使用以完成特定任务。在具有低内聚度的类中,函数被随机插入到一个类中并用于完成各种不同的任务
假设即使Car
类包含这两个随机属性,它仍然只完成一个特定任务(或几个密切相关的任务):
我们会说它Car
具有 低内聚性,即使它仍然执行特定任务(或几个密切相关的任务)?
2)假设实例的方法使用Planet
and属性来完成特定任务,那么即使在概念上这两个属性不属于(因此最好将and实例作为传递)对它们进行操作的 a 方法的参数)Bird
Car
Car
Car
Planet
Bird
Car
谢谢你
赫尔顿自行车:
1)
当您将 Bird 和 Planet 封装在 Car 中时(如果它们是私有的则更糟),所以现在 Car 类有三个改变的理由:
我看不出Car
有什么改变的三个原因,因为在我的第一个问题中,Car's
方法甚至不对这两个属性进行操作,因此对公共 API 的任何更改Planet's
都Bird's
不会影响Car
类?
2)
The problem here has two components:
1. Bird and Planet are contained (as opposed to aggregated) in Car class;
2. Bird and Planet are not conceptually related to Car, much less by some containment relationship.
a)这令人困惑:无论是否包含或聚合实例 ,由于实例的Car
修改而必须修改的机会(至少在我的第一个问题中)是否完全相同?Planet
Bird
Planet
Bird
b)在第二个问题中,Car
do 方法对两个属性进行操作以执行单个特定任务,所以它们在概念上至少不是有些相关吗?你会说即使在第二个问题中,类的凝聚力也很低,即使它只执行一个任务(并且正在使用这两个属性来完成任务)?