Конструктор или свойства: какой из них лучше выбрать при назначении значений - PullRequest
12 голосов
/ 13 ноября 2010

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

Ответы [ 4 ]

31 голосов
/ 13 ноября 2010

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

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

2 голосов
/ 13 ноября 2010

Используйте конструктор, если значения параметров действительно необходимы для построения вашего объекта (без них объект не может начать жить). Используйте свойства для параметров, которые имеют приемлемое значение по умолчанию, поэтому можно не назначать их вообще. Вы можете предоставить некоторые дополнительные конструкторы, которые будут любезно предоставлены вашим свойствам.

1 голос
/ 13 ноября 2010

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

  1. Для «чистых» изменяемых объектов данных, в которых простая установка свойств не может иметь побочных эффектов.Например, у вас может быть объект, который представляет некоторую сущность в базе данных, но изменение его свойств не будет иметь никакого эффекта, пока вы явно не выполните операцию Commit.Объект представляет собой пакет для хранения данных, но ничто не реагирует на изменения данных напрямую.

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

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

0 голосов
/ 13 ноября 2010

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

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