web-dev-qa-db-ja.com

これはSRP違反ですか?

ツリー要素を表すクラスがあるとします。要素を変更したり、検査した子要素を追加したりできます(たとえば、add()メソッドを使用)。しかし、ツリーのrootを含むクラスもあります(State)。また、便宜上、ルートに要素を追加するadd()メソッドの静的オーバーロードを追加しました。その結果、要素クラスはシングルトン(存在が正当化される)を通じて現在のアプリケーションの状態を取得する必要があるため、要素クラスはStateクラスにバインドされます。いいですか?それは正当化されますか?それ以外の場合は、メソッドaddStateに追加する必要があるためです(ただし、これはSRP違反のようです)。

2
wcobalt

SRPは1つのことを行うことではなく、 変更する理由について です。

説明するケースは、一方で要素を管理するTreeクラスであり、もう一方では特定のツリーを使用するStateクラスです。

一見すると、ルートレベルでTreeaddで強化するためのオーバーロードを作成しても、SRPが壊れるようには見えません。このオーバーロードは、変更の新しい理由を作成しません。それは単に便利です。

残念ながら、rootTreeのノードとどのように関連しているかは完全には明らかではありません。

  • すべてのroot要素に対して単一のTreeしかありませんか?この場合、それはSRPではなく、OCPとTreeを拡張して再利用できるようにすることです。
  • いくつかのツリーがあり、それぞれに独自のルートがありますか?この場合、どのようにして正しいルートを見つけますか? 2つのバリアントがあります:
    • 直接的な関係はありません。使用コンテキストはそのルートを知っている必要があります。この場合、Stateにはルートがあります。しかし、他のクラスは異なるルートを持つ可能性があります。次に、add()オーバーロードは、カプセル化された要素をアドレス指定するため、Stateに属します。しかし、add()署名はTree::add()に依存します。この場合、SRPを壊します。
    • 関係があります。たとえば、各ツリーはルートノードを指します。または、各ツリーは親ツリーをポイントし、ルートに戻ることができます。または、ツリーはルートのトレースを保持し、ツリー要素はネストされたクラスです。設計が何であれ、SOLIDの原則を破ることなく、ルートレベルのadd()を使用できます。
1
Christophe