Должен ли я использовать методы или постоянные флаги? - PullRequest
0 голосов
/ 28 марта 2009

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

if ($Object->isStateOne()) {
  // do something
}
else if ($Object->isStateTwo()) {
  // do something else
}
else if ($Object->isStateThree()) {
  // do yet something else
}

или это

switch ($Object->getSomeFlag()) {
  case ObjectMapper::STATE_ONE:
    // do something
    break;

  case ObjectMapper::STATE_TWO:
    // do something else
    break;

  case ObjectMapper::STATE_THREE:
    // do yet something else
    break;
}

Ответы [ 3 ]

2 голосов
/ 28 марта 2009

С точки зрения ОО, обоим не рекомендуется. Если у вас другое состояние, вы можете создать виртуальные методы и переопределить его в унаследованном классе. Затем, основываясь на полиморфизме, вы можете избежать оператора if и switch.

2 голосов
/ 28 марта 2009

Что имеет смысл, конечно.

Переключатель выглядит намного чище. Но что это за «состояние», которое вы проверяете? Если вы переводите строку, используйте массив, например.

Оператор if отличается от поведения переключателя. Вызовы метода МОГУТ иметь побочные эффекты. Если лучше, если на объекте одновременно могут быть активны несколько состояний.

1 голос
/ 28 марта 2009

Второй вариант кажется лучшим решением. ИМХО, неприглядное дублирование кода сравнения, которое сопровождало бы методы первого решения, было бы для меня показом, например:

public function isStateOne() {
  if(strcmp(ObjectMapper::STATE_ONE, '1') == 0) {
      return true;
  }
}
public function isStateTwo() {
  if(strcmp(ObjectMapper::STATE_TWO, '2') == 0) {
      return true;
  }
}
public function isStateThree() {
  if(strcmp(ObjectMapper::STATE_THREE, '3') == 0) {
      return true;
  }
}

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

...