現在、9 つの異なるコンストラクターを持つクラスを変更しています。全体として、このクラスの設計は非常に不十分だと思います...クラスが非常に多くのコンストラクタを持つのは設計が悪いのではないかと思います。
最近、クラス (以下のコードの SomeManager) をリファクタリングして再設計しようとして、このクラスに 2 つのコンストラクターを追加したため、問題が発生しました。これにより、単体テストが可能になり、すべてのメソッドが静的であることに依存しなくなります。ただし、他のコンストラクターは、クラスの先頭から約 100 行下に隠れていたため、コンストラクターを追加したときにそれらを見つけることができませんでした。
現在起こっていることは、これらの他のコンストラクターを呼び出すコードは、以前は静的であったため、既にインスタンス化されている SomeManager クラスに依存しているということです....結果は null 参照例外です。
だから私の質問は、どうすればこの問題を解決できますか? コンストラクターの数を減らそうとすることによって?既存のすべてのコンストラクターに ISomeManager パラメーターを持たせることによって?
確かに、クラスに 9 つのコンストラクターは必要ありません。...さらに、このファイルには 6000 行のコードがあります。
上記で話しているコンストラクターの検閲された表現を次に示します。
public MyManager()
: this(new SomeManager()){} //this one I added
public MyManager(ISomeManager someManager) //this one I added
{
this.someManager = someManager;
}
public MyManager(int id)
: this(GetSomeClass(id)) {}
public MyManager(SomeClass someClass)
: this(someClass, DateTime.Now){}
public MyManager(SomeClass someClass, DateTime someDate)
{
if (someClass != null)
myHelper = new MyHelper(someOtherClass, someDate, "some param");
}
public MyManager(SomeOtherClass someOtherClass)
: this(someOtherClass, DateTime.Now){}
public MyManager(SomeOtherClass someOtherClass, DateTime someDate)
{
myHelper = new MyHelper(someOtherClass, someDate, "some param");
}
public MyManager(YetAnotherClass yetAnotherClass)
: this(yetAnotherClass, DateTime.Now){}
public MyManager(YetAnotherClass yetAnotherClass, DateTime someDate)
{
myHelper = new MyHelper(yetAnotherClass, someDate, "some param");
}
アップデート:
皆様の回答に感謝します...彼らは素晴らしいものでした!
私がやったことの最新情報を提供したいと思っただけです。
null 参照例外の問題に対処するために、ISomeManager を受け取るように追加のコンストラクターを変更しました。
現時点では、この特定のクラスのリファクタリングが許可されるかどうかについて、私の手は結ばれているため、時間があるときに再設計するクラスの todo リストにフラグを立てます。現時点では、SomeManager クラスをリファクタリングできたことをうれしく思います...この MyManager クラスと同じくらい巨大で恐ろしいものでした。
MyManager を再設計するときは、機能を 2 つまたは 3 つの異なるクラスに抽出する方法を探します... または、SRP を確実に遵守するために必要な数のクラスにします。
最終的に、特定のクラスに最大数のコンストラクターがあるという結論には達していませんが、この特定のインスタンスでは、それぞれ 2 つまたは 3 つのコンストラクターを持つ 2 つまたは 3 つのクラスを作成できると思います。