Вещи, которые следует учитывать относительно этого шаблона:
- Принцип нарушения единой ответственности
- Реализация функционального разложения Антипаттерн
- Несоблюдение общих ожиданий потребителей
Принцип единой ответственности
Это небольшое отклонение от первоначального принципа, но оно применяется вместо функций. Если ваш конструктор делает больше, чем одну вещь (конструирование и обработку), вы усложняете обслуживание этого метода в будущем. Если вызывающий не хочет обрабатывать во время строительства, вы не оставляете ему выбора. Если для «обработки» в один прекрасный день требуются дополнительные шаги, которых не должно быть в конструкторе, вам придется выполнять рефакторинг везде, где вы используете этот метод.
Функциональная декомпозиция Антипаттерна
Не зная специфики, я был бы обеспокоен тем, что код, который делает это, реализует этот антипаттерн. Объекты на самом деле не являются объектами, а функциональными единицами программирования, обернутыми в объектно-ориентированную маскировку.
Общие ожидания потребителей
Ожидает ли обычный абонент такое поведение конструктора? Могут быть места, где дополнительная обработка во время строительства может быть удобной для программирования. Но это должно быть явно задокументировано и хорошо понято звонящими. Общее использование объекта все еще должно иметь смысл в этом контексте, и для вызывающего абонента должно быть естественно использовать его таким образом.
Также поймите, что вы навязываете своему потребителю. Если вы выполняете обработку в конструкторе, вы заставляете потребителя платить за эту обработку (с точки зрения времени обработки), хочет он этого или нет. Вы исключаете возможность выполнения «ленивой» обработки или других форм оптимизации.
Допустимое использование?
Только в тех местах, где обычное использование класса требует инициализации, которая может быть необязательной во время сборки. Класс File является хорошим примером:
/* This is a common usage of this class */
File f;
f.Open(path);
/* This constructor constructs the object and puts it in the open state in one step
* for convenience */
File f(path);
Но даже это сомнительно. Сохраняет ли класс файла путь к файлу внутри или он просто используется для открытия дескриптора файла? Если он хранит путь к файлу, то теперь Open () и новый конструктор несут более чем одну ответственность (SetPath (p) и Open ()). В этом случае, возможно, удобный конструктор File (path) не должен открывать файл, а должен просто указать путь в объекте.
Есть много соображений, основанных на рассматриваемых объектах. Подумайте о написании модульных тестов для ваших объектов. Они помогут вам решить многие из этих проблем использования.