Вот некоторые аргументы для свойств и мои контраргументы:
Проще использовать, чем писать методы получения и установки
Пары методов получения и установки являются запахом кода. Упростить их написание - это все равно, что облегчить прохождение математического теста, используя форму Scantron и заполнив все буквы "С". Объекты, которые содержат только состояние, для персистентности, не должны использовать геттеры / сеттеры и должны создавать неизменяемые объекты во время персистентности.
Для потребителя объекта важно то, что он делает, а не то, как он это делает. Его поведение - это то, что он делает; его состояние таково, как оно это делает. Если вы заботитесь о состоянии объекта (за исключением постоянства, хотя это также нарушает ОО), вы просто не выполняете ООП и теряете его преимущества.
Они дают приблизительное представление о производительности для потребителей
Это то, что может измениться в будущем для любого данного свойства. Предположим, что в версии 1.0 доступ к PropertyX просто возвращает поле. В версии 1.5, если поле имеет значение null, PropertyX использует шаблон Null Object для создания нового нулевого объекта. В версии 2.0, поле получает дальнейшую проверку методом getter в PropertyX.
По мере того как свойство становится все более и более сложным, показатель эффективности использования свойства кажется все менее правдивым.
Они лучше публичных полей
Это правда. Но методы тоже.
Они представляют принципиально иной аспект объекта, чем метод, и все потребители объекта должны заботиться об этом
Вы уверены, что оба вышеприведенных утверждения верны?
Их легче набирать, чувак
Конечно, печатать myObject.Length
легче, чем печатать myObject.Length()
, но разве это нельзя исправить небольшим синтаксическим сахаром?
Зачем использовать методы вместо свойств?
Нет гарантий производительности. API останется правдивым, даже если метод станет более сложным. Потребитель должен будет профилировать свой код, если он сталкивается с проблемами производительности, и не полагаться на слово API.
Меньше для потребителя думать. Есть ли у этого свойства установщик? Метод, конечно, нет.
Потребитель думает с правильного мышления ООП. Как потребитель API я заинтересован во взаимодействии с поведением объекта. Когда я вижу свойства в API, это выглядит как состояние. Фактически, если свойства делают слишком много, они даже не должны быть свойствами, поэтому на самом деле свойства в состоянии API ARE таковы, какими они кажутся потребителям.
Программист API будет более глубоко задумываться о методах с возвращаемыми значениями и по возможности избегать изменения состояния объекта в таких методах. Отделение команд от запросов должно выполняться везде, где это возможно.
Поэтому я спрашиваю вас, зачем использовать свойства вместо методов? Большинство точек в MSDN являются запахами кода сами по себе и не принадлежат ни свойствам, ни методам.
(Эти мысли пришли ко мне после размышлений о CQS.)
type GetFoo() void SetFoo()
десять тысяч раз. За все время написания кода на C # меня никогда не смущало свойство.