Использование вспомогательных полей внутри класса - PullRequest
0 голосов
/ 11 июня 2019

В тех случаях, когда мы используем свойства с вспомогательными полями, является ли хорошей практикой - с точки зрения ООП и инкапсуляции - прямой доступ к этим вспомогательным полям или мы всегда должны проходить через свойство класса?

public class SomeClass
{
   private string _name;

   public string Name
   {
      get { return _name; }
      set { _name = value == null ? "" : value; }
   }

   public void SetField()
   {
      ...
        _name = "alice";
      ...
    }

   public void SetProperty()
   {
      ...
      Name = "bob";
      ...
   }
}

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

Просто чтобы прояснить, потому что я не хочу, чтобы меня неправильно поняли, я знаю, что настройки _name и Name - это разные вещи, и я не спрашиваю, является ли такой сеттер, как в моем примере, хорошей идеей.

EDIT: Я не спрашиваю, следует ли мне использовать автоматические свойства, такие как дублированный вопрос / ответ.

1 Ответ

2 голосов
/ 12 июня 2019

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

Представьте, например, следующеесвойство, представляющее возраст людей:

int Age { get; set; }

Без какой-либо логики вы можете присвоить этому свойству любой int, например, отрицательное значение.Для этого вы вводите некоторую проверку в установщик:

int Age {
    { get => return _age; }
    { set => _age = value > 0 ? value : 0 }
}

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

_age = -10;

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

Поэтому я предпочитаю также использовать свойства в объявленном классе.

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