Чистый код: должны ли объекты иметь публичные свойства? - PullRequest
27 голосов
/ 07 июля 2010

Я читаю книгу «Чистый код» и борюсь с концепцией.Обсуждая объекты и структуры данных, он заявляет следующее:

  • Объекты скрывают свои данные за абстракциями и предоставляют функции, которые работают с этими данными.
  • Структуры данных предоставляют свои данные и не имеютзначимые функции.

Итак, что я получаю из этого, так это то, что у меня не должно быть никаких открытых свойств для моего объекта, у меня должны быть только методы, которые выполняют операции со свойствами.Если мне нужно получить доступ к свойствам, они должны быть в структуре данных, которая может быть возвращена из метода моего объекта?При таком подходе кажется, что мне потребуется метод GetHeight () и SetHeight () для моего свойства Height моего объекта, а не просто использование get и set свойства.

Возможно, я не совсем понимаю, что предлагается, но это мое понимание " Объекты скрывают свои данные ".Если бы вы могли помочь мне понять это, я был бы очень признателен!

Заранее спасибо!

Ответы [ 13 ]

2 голосов
/ 07 июля 2010

Генерация открытых методов доступа с закрытыми полями устанавливает договор между кодом пользователя и вашим классом.В идеале, этот контракт не должен изменяться при пересмотре кода.

В C # способ обеспечить соблюдение контракта - это interface.Интерфейсы позволят вам указать необходимые реализации методов и свойств, но не позволяют использовать поля.

Более того, в различных точках .NET свойства часто предпочтительнее полей.например, PropertyGrid элемент управления только перечисляет свойства, классы модели ASP.NET MVC требуют свойства и т. д.

1 голос
/ 07 июля 2010

Как и другие сообщения в этой теме, я укажу, что свойства в C # - это просто особые случаи функций доступа, которые вы упоминаете. Фактически, вы можете изобразить методы get_Property и set_Property в IL вашего объекта, у которых есть флаг, указывающий, что они являются свойствами, то же самое верно и для событий, которые реализуют методы с префиксами add_ и remove_.

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

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

0 голосов
/ 07 июля 2010

На самом деле, используя свойство, например,

public class Temp
{
   public int SomeValue{get;set;}
   public void SomeMethod()
   {
     ... some work
   }
}

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

Если у вас есть

public class Temp
{
   private int someValue;
   public int SomeValue
   {
     get{ return this.someValue;}
     set{ this.someValue = value;}
   }
   public void SomeMethod()
   {
     this.someValue++;
   }
}

Тогда ты поймешь, что я имею в виду. Вы скрываете данные объекта someValue и ограничиваете доступ к нему, используя свойство SomeValue.

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