Использование getter-setter в классе - PullRequest
9 голосов
/ 22 января 2011

Следует ли при каких-либо обстоятельствах использовать геттеры-сеттеры класса внутри класса?

Ответы [ 4 ]

7 голосов
/ 22 января 2011

Установщики-геттеры обычно используются извне класса, изнутри напрямую обращаются к полям. Основным преимуществом / целью является инкапсуляция геттерных сеттеров,

Если у ваших установщиков-геттеров есть какой-то логический код, используйте его.

например:

public void setValue(int val){
  if(val > 100)
    this.val = 0;
  else
    this.val = val;
  }

Также см.

5 голосов
/ 22 января 2011

Да, геттеры и сеттеры полезны.Поскольку PHP не поддерживает подсказки типов для простых типов, таких как int или string, вы не можете заставить значение иметь правильный тип.

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

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

1 голос
/ 23 января 2011

@ GolezTrol

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

Вы можете написать:

setX( X $x ){ ...}
setY( Y $y ){ ...}

или просто:

  iAmMethodNotASetter( X $x, Y $y){

    //20lines of code here end then:

    $this->x = $x;
    $this->y = $y;
  }

Как вы видите, мне не нужны сеттеры для принудительного применения типа в свойствах объекта.

И все равно выдавать ошибку в установщик после проверки типа переменной.Это обычная ошибка программистов, которые перешли с языка, статически типизированного, на язык динамического типа.

Сеттеры и геттеры являются КОНВЕНЦИЕЙ, и они ничего не навязывают! Сегодня мы обычно используем их для созданияпростых старых объектов Java.(POJO - в php word POPO) Так что это просто конвенция (стандарт) для создания объекта, который можно использовать между библиотеками или проектами.

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

Об инкапсуляции:

@org.life.java -Джигар Джоши

«Основным преимуществом / целью является инкапсуляция геттерных сеттеров»,

@ Peter Alexander

«Вы должныиспользовать геттеры и сеттеры практически везде, в том числе внутри «класса».Если вы этого не сделаете, то вы потенциально нарушаете инкапсуляцию "" Геттеры и сеттеры инкапсулируют "

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

Encapsulation == объект берет на себя полную ответственность за свои данные и не дает свою строкуданные. И получатель для частной собственности - это не более чем сложная публичная публикация этого свойства == торможение инкапсуляции.

Инкапсуляция абзаца Chceck: http://en.wikipedia.org/wiki/C%2B%2B или http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 Ни одного словао сеттерах или геттерах ...

0 голосов
/ 22 января 2011

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

В качестве простого примера на C ++:

class BankAccount
{
public:
    void withdraw(int amount)
    {
        m_balance -= amount;
        m_withdrawals++;
    }

    void transfer(BankAcount& other, int amount)
    {
        m_balance -= amount;
        other.m_balance += amount;
    }

private:
    int m_balance;
    int m_withdrawals;
};

Видишь ошибку? transfer снимает деньги, но не увеличивает m_withdrawals. Этого можно было бы избежать, если бы он просто вызывал withdraw, а не уменьшал баланс вручную.

То же самое относится к геттерам и сеттерам. Например, довольно часто иметь геттеры, которые лениво инициализируют свои значения. Если другая функция-член попытается получить доступ к неинициализированному члену напрямую, вы получите разыменование нулевого указателя.

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

...