Следующее является вопросом относительно использования свойств в классе.
Я использовал общественные собственности вместо того, чтобы выставить членские переменные публично. Большинство сообщает, что этот подход помогает инкапсуляции. Однако я не понимаю преимущества инкапсуляции путем создания этого свойством.
многие люди donot знают настоящую причину использования свойств. Они просто делают это как часть кодирования стандарта.
Кто-то может ясно объяснить, как свойство лучше, чем общедоступная членская переменная и как это улучшает инкапсуляцию?
Инкапсуляция помогает изолировать вызывающие классы от изменений.
Представим, что у вас есть простой класс, моделирующий двигатель автомобиля (потому что все ОО-примеры должны включать аналогию с автомобилем :)). У вас может быть простое поле вроде этого:
private bool engineRunning;
Если просто сделать это поле общедоступным или предоставить метод получения IsEngineRunning (), похоже, ничем не отличается.
Теперь предположим, что вы сделали свой класс более сложным, вы хотите удалить это поле и заменить его на:
private bool ignitionOn;
private bool starterWasActivated;
Теперь, если у вас есть много классов, обращающихся к старому полю engineRunning
, вам нужно перейти и изменить их всех (плохие времена).
Если вместо этого вы начали с:
public bool IsEngineRunning()
{
return this.engineRunning;
}
, теперь вы можете изменить его на:
public bool IsEngineRunning()
{
return ignitionOn && starterWasActivated;
}
, и интерфейс класса останется прежним (хорошие времена).
Некоторые мысли:
Вы можете изменить внутреннее представление данных, не затрагивая вызывающие классы .
Например. (до)
публичное логическое значение isActive () {
вернуть this.is_active;
}
(после)
public boolean isActive () {
вернуть this.is_active && this.approved && this.beforeDeadline;
}
Это особенно важно, если ваш код используется другими (т.е. ваш код сторонний ). В определенной степени ваш интерфейс / API должен оставаться стабильным. Небольшие изменения не должны влиять на код другого кода, который их использует.
Вы можете выполнять более сложные операции. Рассмотрим переменную is_active
. Возможно, изменение значения этой переменной также влияет на другие свойства объекта. Если вы инкапсулируете доступ в метод, вы можете позаботиться об этом внутри этого метода, и вызывающему абоненту не нужно заботиться.
Например.
public void setActive (логическое активное) {
this.is_active = активный;
this.startTimeout ();
this.updateOtherInformation ();
}
Следовательно, он вынуждает выполнять определенную серию действий. Вы не полагались на тот факт, что вызывающий абонент выполняет эти действия должным образом. Ваш объект всегда будет в правильном состоянии.
Лучше открывать свойства вместо переменных-членов, потому что это позволит вам выполнять все виды проверок при установке или получении значения переменной-члена.
предположим, что у вас есть переменная-член:
private int id;
и у вас есть общедоступное свойство:
public int ID
{
get
{
// do something before returning
}
set
{
// do some checking here may be limits or other kind of checking
}
}
Я буду краток. Свойства=гибкость
1 Свойства полезны для создания членов, которые вы не хотите держать в классе постоянно или которые являются агрегатами/функциями существующих членов.
Например, возраст может быть выведен на основе даты рождения, canSwim может быть сгенерирован из hasLimbs && floats
2 Выставление членов в качестве свойств может быть полезно при работе с неожиданными изменениями [кто-нибудь когда-нибудь предсказывал все запросы клиента?] в системах с существующей базой данных.
Например, isAllowed истинно, если пользователь старше 18 лет, и кэшируется для повышения производительности. Клиент хочет запустить сервис в США, и вы можете вернуть false, если false кэшируется, и проверять возраст только тогда, когда кэш истинен
.