Определение возвращаемого значения сеттера - PullRequest
1 голос
/ 01 декабря 2011

У меня только что была проблема в одном из моих проектов. Может быть, я неправильно понял концепцию инкапсуляции. Инкапсуляция защищает переменные-члены от классов, определяя методы getters и setters, теперь я читал, что setters должен быть пустым, но в таком случае, как я могу узнать, действительно ли функция устанавливает значение, переданное аргументом. Например

void setArea(int a) {
  if(a>0)
    Area = a;
}

Как я могу быть уверен, что аргумент "a" был правильным значением, не лучше было бы определить функцию, подобную этой

bool setArea(int a) {
  if(a>0) {
    Area = a;
    return true;
  }
  return false;
}

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

1 Ответ

1 голос
/ 01 декабря 2011

Я думаю, что вы ищете охранное предложение , которое выдает исключение, если установлены недопустимые значения:

void setArea(int a) {
  if (a <= 0) throw new InvalidArgumentException(...);
  Area = a;
}

Но если вы хотите, чтобы клиентский код проверял наличие недопустимых значений до их установки, вы можете получить следующее:

bool isAreaValid(int a) {
  return a > 0;
}

void setArea(int a) {
  if (!isAreaValid(a)) throw new InvalidArgumentException(...);
  Area = a;
}

Клиенты могут быть закодированы следующим образом:

if (obj.isAreaValid(myArea)) {
  obj.setArea(myArea);
}

Но не останавливайтесь на этом. Если концепция области важна, вставьте ее в свой собственный объект значения , чтобы сделать ваш дизайн более понятным.

...