В настоящее время я модифицирую класс с 9 различными конструкторами. Теперь, в целом, я считаю, что этот класс очень плохо разработан... поэтому мне интересно, плохо ли он для класса, у которого так много конструкторов.
Проблема возникла из-за того, что недавно я добавил два конструктора к этому классу в попытке реорганизовать и перепроектировать класс (SomeManager в приведенном ниже коде), чтобы он был единым тестируемым и не полагался на каждый из его методов, статичный. Однако, поскольку другие конструкторы были удобно спрятаны из вида около ста строк ниже начала класса, я не заметил их, когда добавил свои конструкторы.
Что происходит сейчас, так это то, что код, который вызывает эти другие конструкторы, зависит от того, какой класс SomeManager уже создан, потому что он был статичным... результат является исключением для ссылки.
Итак, мой вопрос в том, как я могу исправить эту проблему? Попытка уменьшить количество конструкторов? Если все существующие конструкторы принимают параметр ISomeManager?
Конечно, классу не нужны 9 конструкторов!... oh, и для этого в этом файле есть 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");
}
Update:
Спасибо всем за ваши ответы... они были превосходны!
Просто подумал, что я дам обновление о том, что я закончил делать.
Чтобы устранить проблему с исключением нулевой ссылки, я изменил дополнительные конструкторы, чтобы взять ISomeManager.
В настоящий момент мои руки привязаны, когда им разрешается реорганизовывать этот класс, поэтому я буду отмечать его как один из моих списков классов todo для редизайна, когда у меня есть свободное время. На данный момент я просто рад, что мне удалось реорганизовать класс SomeManager... он был таким же огромным и ужасным, как этот класс MyManager.
Когда я перейду к перепроектированию MyManager, я буду искать способ извлечь эту функциональность в два или три разных класса... или сколько угодно, чтобы обеспечить выполнение SRP.
В конечном счете, я не пришел к выводу, что для любого данного класса существует максимальное количество конструкторов, но я считаю, что в этом конкретном случае я могу создать два или три класса каждый с двумя или тремя конструкторами каждый..