【发布时间】:2013-01-14 19:08:45
【问题描述】:
即使我认为我理解单一职责原则和高/低内聚原则,以下问题仍然让我有些困惑
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 和Bird 属性被Car 实例的方法用来完成特定任务,那么Car 将具有高内聚性,即使在概念上这两个属性不属于Car(因此最好将Planet 和Bird 实例作为参数传递给对其进行操作的Car 方法)
谢谢
HELTONBIKER:
1)
当您将 Bird 和 Planet 封装在 Car 中时(如果它们是 private),所以现在 Car 类有三个改变的理由:
我看不出Car 有三个改变的理由,因为在我的第一个问题Car's 方法甚至不对这两个属性进行操作,因此对Planet's 和Bird's 公共API 的任何更改都不会'不影响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 实例而必须修改,无论 @987654351 是否完全相同@ 和 Bird 实例是包含还是聚合?
b) 在第二个问题中,Car 的方法确实对这两个属性进行操作以执行单个特定任务,所以它们在概念上至少不是有些相关吗?您是否会说即使在第二个问题中类具有低凝聚力,即使它只执行一个单一任务(并且正在使用这两个属性来完成任务)?
【问题讨论】:
标签: oop design-patterns single-responsibility-principle