Когда считается хорошим дизайном прямое задание значений свойств объекта без использования установщика?

Возможно, это не лучший вопрос, подходящий для stackoverflow, но мне нужен только ответ, который лучше всего описывает почему программисты иногда не используют сеттеры / геттеры для свойств, например в случае внедрения свойств (DI).

Рассмотрим этот пример ...

class Test
{
    public propertyA;
    protected propertyB;

    public function setPropertyB(val)
    {
        // do some logic to validate 'val'
        this.propertyB = val;
    }

    public function getPropertyB()
    {
        return this.propertyB;
    }
}

Почему бы вам выбрать стиль прямой установки propertyA:

var Test = new Test();
Test.propertyA = 1;

За опцией установщика для propertyB:

var Test = new Test();
Test.setPropertyB(1);

Я всегда использую подход setter / getter, но я видел несколько довольно устоявшихся фреймворков, использующих подход propertyA, перемежающийся с подходом propertyB. Какие преимущества дает этот метод?


person JamesHalsall    schedule 19.01.2012    source источник
comment
Такой вопрос также может подойти programmers.stackexchange.com.   -  person Sergey Kudriavtsev    schedule 19.01.2012


Ответы (2)


Почему вас может не заботить инкапсуляция:

  1. Возможно, вы выбросите проект через 15 минут.

  2. Вы могли обнаружить, что геттеры / сеттеры являются узкими местами для вашего кода, привязанного к процессору, заставляя вас оптимизировать производительность, а не дизайн.

  3. Поле экземпляра может быть неизменяемым и доступным только для чтения, поэтому его раскрытие может не представлять опасности.

  4. Вам лень писать геттеры / сеттеры.

person user541686    schedule 19.01.2012

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

Например, допустим, у меня есть класс банковского счета в приложении Java:

class BankAccount {
    private int balance;

    BankAccount() {
        balance = 0;
    }

    public void deposit(int amount) {
        balance = balance + amount;
    }

    public void withdraw(int amount) {
        balance = balance - amount;
    }
}

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

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

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

Зачем вам использовать общедоступные поля? В общем случае, вероятно, не стоит. Некоторые языки позволяют вам иметь область видимости как общедоступную, тогда, если вам понадобится добавить геттер / сеттер позже, вы можете сделать это, не меняя интерфейс вашего объекта (я считаю, что C # делает это, но поправьте меня, если я ошибаюсь).

person Brian Willis    schedule 19.01.2012
comment
да, на 100% согласны с причинами использования сеттеров / геттеров, это то, что меня всегда озадачивало, почему люди не их используют (я видел примеры довольно компетентных программистов - хотя я могу не думаю ни о чем в голову). Это из-за того, что заставляет меня задаться вопросом, есть ли какие-либо серьезные преимущества (особенно при работе с нечувствительными свойствами) от отказа от использования установщиков - person JamesHalsall; 19.01.2012