0

良いOOPの方法は何ですか?

これで、コンテナーへの参照と、そのコンテナー内でそれ自体を識別するためのキーまたはインデックスのコピーを含むすべてのオブジェクトができました。DeleteMe() メソッドは、コンテナの Delete(key) メソッドを呼び出します。密結合、循環参照、およびキー/インデックスの重複コピーのため、これは悪いことだと思います。

これを行う理由は、各オブジェクトが UI に表示され、「削除」や「名前の変更」などのオプションを使用して独自に生成されたコンテキスト メニューがあるためです。

ここでデリゲートまたはイベントを使用できると聞きましたが、それらの背後にある動機と、それらが私にとって単なる YAGNI であるかどうかはよくわかりません。

4

1 に答える 1

2

理想的には、削除、名前変更操作はオブジェクトに属すべきではなく、これらはコンテナにのみ属すべきです。

これを行う理由は、各オブジェクトが UI に表示され、「削除」や「名前の変更」などのオプションを使用して独自に生成されたコンテキスト メニューがあるためです。

コンテナに対する静止操作は、次のように呼び出す必要があります

  container.Delete(Object)
  container.Rename(Object, String newName)

オブジェクト自体に DeleteMe、Rename を作成すると、コンテナーに依存するオブジェクトが作成され、List、Dictionary などの他のコンテナーに格納するために使用できなくなります (または、DeleteMe は失敗します)。

削除ハンドラーがコンテナーからオブジェクトを削除する必要があるという要件については、コマンド patternを使用できます。例えば

DeleteCommand command = new DeleteCommand(); // Create new Command 
CommandManager.Register(command); // Create CommandManager class that will have mechanism of registering command, and has reference to object container. method is something like command.Set(Object container)
command.Execute(this); // pass instance as parameter, and in the Execute it will be similar to container.Remove(parameter);

上記のコードは単なる概要であり、要件に応じてカスタマイズできます。他のアクション (名前の変更など) も同様に追加できます。

于 2012-05-16T03:30:40.970 に答える