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