5

単一責任の原則とカプセル化を両立させるのに苦労しています。クラス間で責任を分割するには、多くのデータを公開する必要があるようです。例として、 というオブジェクトを考えてみましょうDataPointsDataPointsとりわけ、x 座標と y 座標で埋められます。を満たす Generator クラスを作成できますDataPoints。ここで、これらのデータ ポイントをプロットするとします。明らかに、それは と呼ばれるクラスに由来する別の責任ですDataPointsPlotter。しかし、データをプロットするには、内部の x 座標と y 座標が何であるかを知る必要があります。両方を処理する単一のクラスでは、問題ありません。x と y は内部変数ですが、create() メソッドと print() メソッドの両方がそれらにアクセスできます。x と y を (おそらく getter/setter を介して) 公開するか、DataPoints構造体を Plotter クラスに追加しますが、x と y を取得するには内部に入る必要があります。DataPointsx と 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
    }

}

これにより、既知の形式でデータポイントを表す責任がカプセル化されます。xそれを確認し、適切な値を持っていることを確認するための健全性チェックも行われていると仮定するとy、これはここにカプセル化されている 1 つの責任です。

class Plotter {

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

        ... plot ...
    }

}

プロッターは のインスタンスを受け取り、DataPointそれをプロットします。それも 1 つの責任です: のインスタンスをプロットしますDataPointの内部構造に関するPlotter知識は必要ありません。から必要なデータを取得する方法として、定義された安定したインターフェイスが必要です。ゲッターと. インターフェイスが同じままである限り、周りの内部を好きなように変更できます。の責任は、データポイントを保持し、定義された方法で他のコードにそのデータへのアクセスを許可することです。からデータを取り出す方法がなければ、その存在はまったく役に立たないでしょう。DataPointPlotterDataPointgetXgetYDataPointDataPointDataPoint

いいえ、SRP とカプセル化は相反するものではありません。責任が正確に何であるかを明確にする必要があるだけです。

于 2012-11-20T14:49:03.867 に答える