5

我无法将单一职责原则与封装相协调。似乎在类之间划分职责需要公开大量数据。例如,考虑一些名为DataPoints. DataPoints填充了 x 和 y 坐标等。我可以创建一个生成器类来填充DataPoints. 现在,假设我想绘制这些数据点。显然,这是一个单独的职责,可能来自一个名为DataPointsPlotter. 但要绘制数据,我需要知道内部 x 和 y 坐标是什么。一个班级同时处理这两个问题,这没问题。x 和 y 是内部变量,但 create() 和 print() 方法都可以访问这些变量。我可以公开 x 和 y(也许通过 getters/setters--ugh)或者我可以通过DataPoints结构到 Plotter 类,但它仍然需要进入内部以获取 x 和 y。我可以在DataPoints发送 x 和 y 的类中声明一个 Plotter 实例。但这仍然是一个曝光。

在此示例中,如何在不违反封装的情况下使用绘图仪绘制 x 和 y?

4

1 回答 1

3
class DataPoint {

    protected x, y

    public function construct(theX, theY) {
        x = theX
        y = theY
    }

    public function getX {
        return x
    }

    public function getY {
        return y
    }

}

这封装了以已知格式表示数据点的责任。假设还进行了一些健全性检查以确认这一点xy具有良好的价值,这是此处封装的一项责任。

class Plotter {

    public function plot(DataPoint dp) {
        x = dp.getX
        y = dp.getY

        ... plot ...
    }

}

绘图仪接受一个实例DataPoint并绘制它。这也是一项责任:绘制DataPoint. 它不需要对 . 的内部结构Plotter任何了解。它只需要一个已定义且稳定的接口,如何从中获取必要的数据。哪些是吸气剂和. 只要它的界面保持不变,你就可以随意改变它的内部结构。的职责是保存一个数据点并让其他代码以定义的方式访问其数据。如果没有办法从中获取数据,那么它的存在将毫无用处。DataPointPlotterDataPointgetXgetYDataPointDataPointDataPoint

所以不,SRP 和封装并不矛盾。你只需要明确责任到底是什么。

于 2012-11-20T14:49:03.867 回答