Fad*_*mic 5 language-agnostic encapsulation single-responsibility-principle
我无法将单一责任原则与封装协调一致.似乎在类之间分配责任需要暴露大量数据.举个例子,考虑一些叫做的对象DataPoints.DataPoints其中包括x和y坐标.我可以创建一个填充的Generator类DataPoints.现在,假设我想绘制这些数据点.显然,这是一个单独的责任,可能来自一个叫做的类DataPointsPlotter.但是为了绘制数据,我需要知道内部x和y坐标是什么.只需一个处理两个类,这没问题.x和y是内部变量,但create()和print()方法都可以访问这些变量.我可以暴露x和y(也许是通过getter/setters - 呃)或者我可以通过DataPointsPlotter类的结构,但它仍然需要进入x和y.我可以在DataPoints我发送x和y 的类中声明一个Plotter实例.但这仍然是曝光.
在这个例子中,如何使用绘图仪绘制x和y而不违反封装?
class DataPoint {
protected x, y
public function construct(theX, theY) {
x = theX
y = theY
}
public function getX {
return x
}
public function getY {
return y
}
}
Run Code Online (Sandbox Code Playgroud)
这封装了以已知格式表示数据点的责任。假设还进行了一些健全性检查来确认这一点x并y具有良好的价值,这是这里封装的一项责任。
class Plotter {
public function plot(DataPoint dp) {
x = dp.getX
y = dp.getY
... plot ...
}
}
Run Code Online (Sandbox Code Playgroud)
绘图仪接受 的实例DataPoint并绘制它。这也是一项责任:绘制DataPoint. 它不需要Plotter了解 的内部结构的任何知识DataPoint。它只需要一个定义好的、稳定的接口,如何Plotter从DataPoint. 哪些是吸气剂getX和getY。您可以根据需要更改 around 的内部结构DataPoint,只要其界面保持不变即可。的职责DataPoint是保存一个数据点并让其他代码以定义的方式访问其数据。如果没有办法从中获取数据DataPoint,那么它的存在就毫无用处。
所以不,SRP 和封装并不矛盾。您只需要明确责任到底是什么。