如果我有一个包含可以有多个状态的标志的数据库表,我应该这样做吗
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;
}
答案 0 :(得分:2)
当然,无论哪个都有道理。
开关看起来更干净。但是,你正在检查这个'状态'是什么?如果要翻译字符串,请使用数组,例如。
if与switch有不同的行为。方法调用MAY可能有副作用。如果多个状态可以同时在对象上激活,则if更好。
答案 1 :(得分:2)
从OO的角度来看,两者都是沮丧的。如果您具有不同的状态,则可能需要创建虚方法,并在继承的类中覆盖它。然后基于多态性,可以避免使用if和switch语句。
答案 2 :(得分: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;
}
}
当然,其他人可能不同意。我只是不喜欢让课程与“几乎相同”的方法混在一起。