Вопрос

Ниже приведен вопрос, касающийся использования свойств в классе.

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

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

Может кто-то четко объяснить, как недвижимость лучше, чем вариабель члена 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();
    }
    

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top