Конструктор: полноценный или минимальный? - PullRequest
2 голосов
/ 22 декабря 2009

При разработке классов вам обычно приходится выбирать между:

  • предоставляет «полный» конструктор, который принимает в качестве аргументов начальные значения для всех обязательных полей: неудобно в использовании, но гарантирует полностью инициализированные и действительные объекты
  • предоставляет только конструктор и методы доступа по умолчанию для всех необходимых полей: иногда может быть удобно, но не гарантирует правильной инициализации всех членов перед вызовом некоторых критических методов.
  • смешанный подход (больше кода, больше работы, может устранить проблему "не полностью инициализированной")

Я видел несколько API и фреймворков, которые используют один из вышеперечисленных или даже противоречивый подход, который отличается от класса к классу. Каковы ваши мысли и лучшие практики по этому вопросу?

Ответы [ 11 ]

0 голосов
/ 22 декабря 2009

Всегда полностью инициализируйте перед использованием, не требуя от пользователя класса делать что-либо, кроме создания и использования объекта.

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

Используйте только двухэтапную инициализацию (т. Е. Пользователь ДОЛЖЕН построить, а затем ДОЛЖЕН вызвать пользовательскую функцию Init (), прежде чем использовать объект для реального), где это ЕДИНСТВЕННЫЙ способ достижения инициализации.

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

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