0

如果我有一个包含可以有多个状态的标志的数据库表,我应该这样做吗

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;
}

?

4

3 回答 3

2

当然,无论哪个有意义。

开关看起来更干净。但是,您正在检查的这个“状态”是什么?例如,如果您要翻译字符串,请使用数组。

if 具有与 switch 不同的行为。方法调用可能有副作用。但是,如果多个状态可以同时在对象上处于活动状态,则 if 会更好。

于 2009-03-28T02:15:43.987 回答
2

从 OO 的角度来看,两者都不鼓励。如果您有不同的状态,您可能想要创建一个虚拟方法,并在继承的类中覆盖它。然后基于多态性,可以避免 if 和 switch 语句。

于 2009-03-28T02:38:40.717 回答
1

第二种选择似乎是更好的解决方案。恕我直言,与第一个解决方案的方法相伴的比较代码的难看重复对我来说将是阻碍,例如:

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;
  }
}

当然,其他人可能不同意。我只是不喜欢用“几乎相同”的方法把类弄得乱七八糟。

于 2009-03-28T02:28:13.863 回答