Свойство и инкапсуляция

Следующее является вопросом относительно использования свойств в классе.

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

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

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

5
задан Muhammad Ahsen Haider 5 February 2016 в 20:20
поделиться

4 ответа

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

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

private bool engineRunning;

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

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

private bool ignitionOn;
private bool starterWasActivated;

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

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

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

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

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

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

6
ответ дан 18 December 2019 в 14:42
поделиться

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

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

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

     публичное логическое значение 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 ();
    }
    

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

1
ответ дан 18 December 2019 в 14:42
поделиться

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

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

private int id;

и у вас есть общедоступное свойство:

public int ID
{
    get 
    { 
       // do something before returning
    }
    set 
    {
      // do some checking here may be limits or other kind of checking
    }
}
4
ответ дан 18 December 2019 в 14:42
поделиться

Я буду краток. Свойства=гибкость

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

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

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

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

.
2
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: