Некоторые методы не работают для наиболее часто используемых конструкторов. - PullRequest
0 голосов
/ 29 октября 2011

Я столкнулся с классом, в котором более 2000 строк.У него два конструктора - простой и сложный.Большинство методов работают хорошо для обоих конструкторов, но есть несколько методов, которые либо потерпят неудачу, либо будут вести себя странно, если объект будет создан с помощью простого конструктора.

Наследование в этом случае возможно, но это будетнемного странноЭто не другой объект, это просто другой конструктор.

Создание исключения при вызове метода, для которого требуется сложный конструктор, будет ужасным патчем.

Существует ли стандартный рефакторинг илишаблон, который решает это?

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Если ваше намерение состоит в том, чтобы доступность методов зависела от того, какой конструктор вызывается, то они должны быть разными объектами.

Было бы лучше определить отдельные классы или исправитьоба ваших конструктора создают действительные объекты со всеми функциональными методами.

Если вы решите, что это действительно должен быть один класс, общий шаблон, который может помочь в этом, - это «цепочечные конструкторы», где ваш более простой конструктор вызывает более сложныйконструктор с соответствующими значениями по умолчанию для отсутствующих параметров.

Если, с другой стороны, вы решите использовать два класса, это может быть отношение наследования, причем более сложный класс расширяет более простой или можетразумно быть составным отношением, где более сложный класс содержит поле, являющееся объектом более простого класса, и делегирует некоторые функциональные возможности другому.

Более конкретный и определенный совет потребует просмотра некоторого кода (но неБолее 2000 строк)выпуск.

2 голосов
/ 29 октября 2011

Это не просто другой конструктор. У вас есть определенные методы, которые не работают должным образом при вызове одного из конструкторов. Т.е. они недействительны. Это как определение транспортного средства, и у него есть методы для запуска двигателя, перемещения элеронов и возврата в обратное. Один относится к обоим, один относится к самолетам, один относится к автомобилям. Тебе нужно наследство, на мой взгляд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...