特定の階層にコードをロックしているため、他の人がコードが良くないと指摘しているのでOKです。デバッグで問題が発生する可能性があり、読みにくいですが、主なポイントは、タスクを実行するコードが、フォルダーを取得するためのトラバースについてあまりにも多くのことを知っていることです。ドーナツにドル、誰かが何かを真ん中に挿入したいと思うでしょう。(すべてのタスクはタスクリストなどにあります)
手足に出て、これらのクラスはすべて同じものの特別な名前ですか? つまり、それらは階層的ですが、各レベルにはおそらくいくつかの追加のプロパティがありますか?
したがって、別の角度から、子クラスが要求されたものでない場合、子クラスがチェーンを委任する列挙型とインターフェイスに単純化します。議論のために、私はそれらをフォルダーと呼んでいます。
enum FolderType { ActionPlan, ClientFile, Client, etc }
interface IFolder
{
IFolder FindTypeViaParent( FolderType folderType )
}
そして IFolder を実装する各クラスはおそらくそうします
IFolder FindTypeViaParent( FolderType folderType )
{
if( myFolderType == folderType )
return this;
if( parent == null )
return null;
IFolder parentIFolder = (IFolder)parent;
return parentIFolder.FindTypeViaParent(folderType)
}
バリエーションは、IFolder インターフェイスを作成することです。
interface IFolder
{
FolderType FolderType { get; }
IFolder Parent { get; }
}
これにより、トラバーサル コードを外部化できます。ただし、これによりクラスから制御が奪われ (複数の親を持つ可能性があります)、実装が公開されます。良くも悪くも。
[とりとめのない]
一見すると、これは設定するのにかなりコストのかかる階層のように見えます。毎回トップダウンでインスタンス化する必要がありますか? つまり、タスクが必要なだけの場合、すべてのバックポインターが確実に機能するように、すべてをボトムアップでインスタンス化する必要がありますか? 遅延ロードであっても、ルートを取得するためだけに階層を上る必要がありますか?
もう一度言いますが、階層は本当にオブジェクト アイデンティティの一部なのでしょうか? そうでない場合は、階層を n-ary ツリーとして外部化できます。
補足として、集計の DDD (ドメイン駆動設計) の概念を検討し、主要なプレーヤーが誰であるかを判断することをお勧めします。責任を負う最終的な所有者オブジェクトは何ですか? たとえば、車の車輪。車をモデルにしたデザインでは、ホイールもオブジェクトですが、車が所有しています。
うまくいくかもしれませんが、うまくいかないかもしれません。私が言ったように、これは暗闇の中でのショットです。