ツリー要素を表すクラスがあるとします。要素を変更したり、検査した子要素を追加したりできます(たとえば、add()
メソッドを使用)。しかし、ツリーのrootを含むクラスもあります(State
)。また、便宜上、ルートに要素を追加するadd()
メソッドの静的オーバーロードを追加しました。その結果、要素クラスはシングルトン(存在が正当化される)を通じて現在のアプリケーションの状態を取得する必要があるため、要素クラスはState
クラスにバインドされます。いいですか?それは正当化されますか?それ以外の場合は、メソッドadd
をState
に追加する必要があるためです(ただし、これはSRP違反のようです)。
SRPは1つのことを行うことではなく、 変更する理由について です。
説明するケースは、一方で要素を管理するTree
クラスであり、もう一方では特定のツリーを使用するState
クラスです。
一見すると、ルートレベルでTree
をadd
で強化するためのオーバーロードを作成しても、SRPが壊れるようには見えません。このオーバーロードは、変更の新しい理由を作成しません。それは単に便利です。
残念ながら、root
がTree
のノードとどのように関連しているかは完全には明らかではありません。
root
要素に対して単一のTree
しかありませんか?この場合、それはSRPではなく、OCPとTree
を拡張して再利用できるようにすることです。State
にはルートがあります。しかし、他のクラスは異なるルートを持つ可能性があります。次に、add()
オーバーロードは、カプセル化された要素をアドレス指定するため、State
に属します。しかし、add()
署名はTree::add()
に依存します。この場合、SRPを壊します。add()
を使用できます。