在“敏捷软件开发:原则,模式和实践”一书中,“单一责任原则”部分提供了一个关于具有多个职责的班级Rectangle
的示例:
class Rectangle {
public void draw() { ... }
public double area() { ... }
}
不同的类只能使用其中一种方法:
class ComputationalGeometryApplication {
Rectangle rectangle;
public void someMethod() {
double area = rectangle.area();
}
}
class GraphicalApplication {
Rectangle rectangle;
public void someMethod() {
rectangle.draw();
}
}
(注意:本书以c++
为例,我在这里使用Java代码,因为我不熟悉c++
)
我不清楚这句话:
其次,如果对GraphicalApplication的更改导致Rectangle由于某种原因而发生更改,则该更改可能会强制我们重建,重新测试和重新部署ComputationalGeometryApplication。
假设GraphicalApplication
导致draw()
方法变为draw(boolean)
,为什么会强制我们重建,重新测试和重新部署ComputationalGeometryApplication
?
我的意思是,
ComputationalGeometryApplication
可以选择使用Rectangle
的旧版本编译文件,如果我们知道GraphicalApplication
导致的更改与自身无关
如果ComputationalGeometryApplication
想要使用新版本的Rectangle
,是的,我们应该重建/重新测试/重新部署。但即使draw()
方法不在Rectangle
中,但在另一个相同代码库的类中,如果我们想要使用新版本,我们仍然需要重建/重新测试/重新部署ComputationalGeometryApplication
包含Rectangle
我真的不明白这个好处,我错过了什么?
更新:引用的问题对我有很大的帮助,因为这两个问题略有不同,我想在这里加入我的理解。
关键是该问题的公认答案中的这句话:
“如果GraphicalApplication在Rectangle类中需要新方法或语义更改,那么会影响ComputationalGeometryApplication,因为它们都”链接“到Rectangle库”
关键字link
提醒我Rectangle
位于共享库中。当GraphicalApplication
更改后,ComputationalGeometryApplication
会自动使用Rectangle
类的新版本。如果对Rectangle
的更改与之前的更改不一致,那么它会在Rectangle
的构造函数中添加一些额外类的引用:
class Rectangle {
Rectangle() {
SomeExtraClass cls = new SomeExtraClass()
}
}
对于ComputationalGeometryApplication
,如果我们没有重建它将会失败,因为在初始化SomeExtraClass
类时可能找不到类Rectangle