Предоставление данных в виде свойств C # - хорошо или плохо? - PullRequest
3 голосов
/ 21 ноября 2011

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

Так вот в чем проблема, у меня есть класс, в котором нет обязательных параметров.Если пользователь не устанавливает поля, я могу принять значение по умолчанию и продолжить.Ранее я проектировал тот же класс, что и шаблон Builder Джошуа Блоха (Effective Java) (неизменный объект).У меня не было веской причины сделать класс неизменным, за исключением того факта, что я не хотел иметь телескопические конструкторы и не хотел раскрывать данные этого класса.

Но теперь друг-программист пытается убедить меня, что можно выставлять данные из класса, используя свойства C #.Я не уверен в этом, и я все еще чувствую, что не должен позволять пользователю копаться в данных.

Может быть, я совершенно не прав в моем понимании.Может ли кто-нибудь прояснить мои сомнения по этому поводу, хорошо ли это или плохо выставлять данные из класса?

Если это хорошо, то в каком случае это хорошо?Или, если кто-то может указать мне на статью / книгу, которая разъясняет это, я был бы очень признателен.

Спасибо!

Ответы [ 5 ]

4 голосов
/ 21 ноября 2011

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

2 голосов
/ 21 ноября 2011

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

Настраиваемые свойства также являются единственным способом кодирования объектов для некоторых конкретных платформ или библиотек (например, ORM, таких как NHibernate), потому что вы не можете контролировать, как библиотека / каркас инициализирует объект.

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

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

0 голосов
/ 21 ноября 2011

Но теперь друг-программист пытается убедить меня, что можно выставлять данные из класса, используя свойства C #.Я не уверен в этом, и я все еще чувствую, что не должен позволять пользователю копаться в данных.

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

0 голосов
/ 21 ноября 2011

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

public string MyInformation { get; private set; }

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

public string MyChangeableInformation { get; set; }

Но если у потребителя нет необходимости получать информацию, то спрячьте ее в своем классе!

0 голосов
/ 21 ноября 2011

Это в основном зависит от того, какова цель вашего класса в контексте приложения (не могли бы вы дать нам более подробную информацию?). В любом случае, считайте, что вы можете защитить свойство от внешних изменений, объявив setter как private: http://msdn.microsoft.com/en-us/library/bb384054.aspx

public string UserName { get; private set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...