Дизайн класса - свойства или параметры? - PullRequest
4 голосов
/ 11 марта 2009

Я проектирую класс ...

Существуют важные методы, которым нужно передать объект или они должны иметь возможность "получить" объект.

Таким образом, вопрос в том, следует ли вам использовать метод получения / установки ИЛИ напрямую отправлять объект в качестве аргумента метода - для того, чтобы метод работал правильно. Или вы должны устанавливать объекты через конструктор, если они действительно важны для правильной работы класса?

Ответы [ 4 ]

5 голосов
/ 11 марта 2009

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

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

5 голосов
/ 11 марта 2009

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

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

Я бы настоятельно рекомендовал внедрение зависимости конструктора в большинстве случаев.

3 голосов
/ 11 марта 2009

Как вы упомянули, у вас есть следующие три варианта:

Используйте геттеры / сеттеры

Как вы, возможно, знаете, get / set будет указывать состояние объекта, к которому обращаются несколько раз (обычно) в течение времени жизни объекта. Так что, если у вас есть сценарий от «CrucialMethod1» до «CrucialMethodN», использующий это состояние, то это можно использовать. Кроме того, это также поможет в разоблачении государства извне.

Использовать в качестве параметра для конструктора

Как правило, параметр конструктора будет "диктовать" состояние, в которое будет инициализирован объект. Так что если у вас есть сценарий, в котором CrucialMethod может вызываться или не вызываться, то это не будет наиболее уместным.

Использовать в качестве параметра метода

Это было бы полезно в сценарии, когда CrucialMethod действует / трансформируется (зависит) от переданных параметров. Это облегчает вызов метода без зависимости от состояния параметра.

Ваш звонок!

1 голос
/ 11 марта 2009

Если они необходимы классу, работающему правильно, вы должны указать их в конструкторе или установить их внутри него.

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

...