Собственность и Инкапсуляция - PullRequest
5 голосов
/ 25 мая 2010

Ниже приведен вопрос об использовании свойств в классе.

Я использовал открытые свойства вместо публичного раскрытия переменных-членов. Большинство советуют, что этот подход помогает инкапсуляции. Тем не менее, я не понимаю преимущества инкапсуляции, делая его свойством.

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

Может ли кто-то четко объяснить, как свойство лучше, чем открытая переменная-член, и как оно улучшает инкапсуляцию?

Ответы [ 4 ]

6 голосов
/ 25 мая 2010

Инкапсуляция помогает, изолируя классы вызовов от изменений.

Давайте представим, что у вас есть простой класс, который моделирует автомобильный двигатель (потому что все примеры ОО должны включать аналогию с автомобилем :)). У вас может быть простое поле, подобное этому:

private bool engineRunning;

Если просто сделать это поле общедоступным или указать метод получения IsEngineRunning (), это не будет чем-то отличаться.

Теперь предположим, что вы делаете свой класс более сложным, вы хотите удалить это поле и заменить его на:

private bool ignitionOn;
private bool starterWasActivated;

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

Если вместо этого вы начали с:

public bool IsEngineRunning()
{
    return this.engineRunning;
}

Теперь вы можете изменить его на:

public bool IsEngineRunning()
{
    return ignitionOn && starterWasActivated;
}

и интерфейс класса остается прежним (хорошие времена).

4 голосов
/ 25 мая 2010

Лучше предоставлять свойства вместо переменных-членов, поскольку это позволит вам выполнять все виды проверок при установке или получении значения переменной-члена.

предположим, у вас есть переменная-член:

private int id;

и у вас есть публичная собственность:

public int ID
{
    get 
    { 
       // do something before returning
    }
    set 
    {
      // do some checking here may be limits or other kind of checking
    }
}
2 голосов
/ 25 мая 2010

Я сделаю это коротким. Свойства = гибкость

1 Свойства полезны для создания элементов, которые вы не хотите постоянно хранить в классе или которые являются совокупностями / функциями существующих элементов.

Например. возраст может быть выведен на основе даты рождения, canSwim может быть сгенерирован из hasLimbs && floats

2 Предоставление элементов в качестве свойств может быть полезно при работе с неожиданными изменениями [кто-нибудь когда-либо прогнозировал все запросы клиента?] В системах с существующей базой данных.

Например. isAllowed имеет значение true, если пользователь старше 18 лет и кэшируется для повышения производительности. Клиент хочет запустить службу в США, и вы можете вернуть значение false, если установлено значение false, и проверять возраст, только если кэш имеет значение true

1 голос
/ 25 мая 2010

Некоторые мысли:

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

    например. (до)

    public boolean isActive() {
        return this.is_active;
    }
    

    (после)

    public boolean isActive() {
        return this.is_active && this.approved && this.beforeDeadline;
    }
    

    Это особенно важно, если ваш код используется другими (т. Е. Ваш код сторонний ). В определенной степени ваш интерфейс / API должен оставаться стабильным. Небольшие изменения не должны влиять на код другого кода, который его использует.

  • Вы можете выполнять более сложные операции. Рассмотрим переменную is_active. Возможно, изменение значения этой переменной также влияет на другие свойства объекта. Если вы инкапсулируете доступ в метод, вы можете позаботиться об этом внутри этого метода, и вызывающий не должен заботиться.

    1026 * Е.Г. *

    public void setActive(boolean active) {
        this.is_active = active;
        this.startTimeout();
        this.updateOtherInformation();
    }
    

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

...