Собственность и инкапсуляция
-
04-10-2019 - |
Вопрос
Ниже приведен вопрос, касающийся использования свойств в классе.
Я использовал публичные свойства вместо публично выставления переменных участников. Большинство советуют, чтобы этот подход помогает инкапсуляции. Однако я не понимаю преимущество инкапсуляции, сделав его свойством.
Многие люди не знают настоящую причину использования свойств. Они просто делают это как часть стандарта кодирования.
Может кто-то четко объяснить, как недвижимость лучше, чем вариабель члена Public и как она улучшает инкапсуляцию?
Решение
Инкапсуляция помогает изолирует вызов классами из изменений.
Давайте представим, что у вас есть простой класс, который моделирует автомобильный двигатель (потому что все примеры OO должны вовлекать автомобильную аналогию :)). У вас может быть простое поле, как это:
private bool engineRunning;
Просто делая эту поле публику или предоставление Getter Isenginerunning (), не похоже на отсутствие.
Теперь предположим, что вы сделаете свой класс более изощренным, вы хотите удалить это поле и заменить его с помощью:
private bool ignitionOn;
private bool starterWasActivated;
Теперь, если у вас много классов, доступа к старому engineRunning
поле вы должны идти и изменить их все (плохие времена).
Если вместо этого вы начали с:
public bool IsEngineRunning()
{
return this.engineRunning;
}
Теперь вы можете изменить его на:
public bool IsEngineRunning()
{
return ignitionOn && starterWasActivated;
}
И интерфейс класса остается прежним (хорошим временем).
Другие советы
Лучше разоблачить свойства вместо переменных элементов, потому что это позволит вам делать всевозможные проверки при настройке или получения значения переменной элемента.
Предположим, у вас есть переменная участника:
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 Выставление членов в качестве свойств могут быть полезными при работе с неожиданными изменениями [Кто-нибудь предсказал все запросы клиента?] В системах с существующей базой данных.
Например. Paulted True True, когда пользователь более 18 лет и кэшируется для производительности. Клиент хочет запустить службу в США, и вы можете вернуть FALSE, если False Chached и Check Age только тогда, когда кэш верно
Некоторые мысли:
Вы можете изменить внутреннее представление ваших данных, не затрагивая вызов классов.
Например (до)
public boolean isActive() { return this.is_active; }
(после)
public boolean isActive() { return this.is_active && this.approved && this.beforeDeadline; }
Это особенно важно, если ваш код используется другими (то есть ваш код 3-го вечеринка). В определенную степень ваш интерфейс / API должен оставаться стабильным. Небольшие изменения не должны влиять на код другого кода, который его использует.
Вы можете иметь более сложные операции. Рассмотрим переменную
is_active
. Отказ Может быть, изменение значения этой переменной также влияет на другие свойства объекта. Если вы инкапсулируете доступ в способе, вы можете позаботиться об этом внутри этого метода, и вызывающий абонент не должен заботиться.Например
public void setActive(boolean active) { this.is_active = active; this.startTimeout(); this.updateOtherInformation(); }
Поэтому он обеспечивает определенную серию действий. Ты не делайте Положитесь на то, что вызывающий абонент выполняет эти действия правильно. Ваш объект всегда будет в правильном состоянии.