Какой смысл делать отдельные публичные функции для получения / установки приватной ценности? - PullRequest
3 голосов
/ 29 мая 2019

Позвольте мне просто предсказать это, сказав, что я знаю, что это, вероятно, вопрос новичка, я попытался найти его и не могу найти подходящий ответ (вероятно, неправильно).

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

И все же часто я вижу, как другой код использует частные значения в своем классе, а затем создает отдельные функции для получения и установки значения следующим образом:

private bool fooBar;

public void SetFooBar(bool boolean)
{
   fooBar = boolean;
}

public bool GetFooBar()
{
   return fooBar;
}

Извините за мое невежество, но какой в ​​этом смысл? Они оба делают одно и то же (по крайней мере, по логике моего новичка). Я знаю, что закрытые переменные полезны тем, что они гарантируют, что вы не можете нарушить функциональность программы, изменяя их в другом месте кода, но в любом случае вы изменяете их в других местах кода, так что же дает? Почему я вижу, что люди делают это?

Ответы [ 2 ]

8 голосов
/ 29 мая 2019
  1. Потому что прямое изменение состояния объекта в ООП - нет-нет
  2. Поскольку вы не можете поместить поля в интерфейс (и, как только вы доберетесь достаточно далеко, вы в конечном итоге получите доступ к большинству других объектов через интерфейсы)
  3. Поскольку он допускает дополнительную логику (например, генерирование событий), когда другой объект хочет взаимодействовать с полем
  4. Поскольку некоторые вещи (например, привязки WPF) работают только со свойствами, а не с полями

  5. Поскольку вы, возможно, захотите позже изменить / получить / сохранить значение (не только в памяти)

(Обратите внимание, что в C # вы обычно делаете это как свойство, а не методы, как public bool Foo {get; set;})

5 голосов
/ 29 мая 2019

Это позволяет вам изменить способ хранения значения независимо от того, как внешние пользователи получают к нему доступ.

Используя функции Getter и Setter, вы можете запрашивать данные из локального кэша или извлекать их из базы данных.

C # поддерживает реализации функциональности Getter Setter с использованием средства доступа к стилю свойств.

private bool _fooBar
public bool FooBar
{
 get { return _fooBar; }
 set {  _fooBar = value; }
}

Как указано в комментариях BradleyDotNET , вы можете написать их так, чтобы напоминает лямбды начиная с C # 7.0

private bool _fooBar
public bool FooBar
{
    get => _fooBar;
    set => _fooBar = value;
}

Как упоминалось BradleyDotNET , вы можете написать эту точную реализацию как

public bool FooBar { get; set; }

, которая будет действовать так же,

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

public bool FooBar { get; protected set; }
...