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

OO の観点からは、どちらも推奨されません。状態が異なる場合は、仮想メソッドを作成し、継承されたクラスでオーバーライドすることができます。次に、ポリモーフィズムに基づいて、if および switch ステートメントを回避できます。

于 2009-03-28T02:38:40.717 に答える
2

もちろん、どちらでも構いません。

スイッチはよりきれいに見えます。しかし、あなたがチェックしているこの「状態」は何ですか?文字列を翻訳する場合は、たとえば配列を使用します。

if は switch とは動作が異なります。メソッド呼び出しには副作用があるかもしれません。ただし、オブジェクトで一度に複数の状態がアクティブになる可能性がある場合は、if の方が適しています。

于 2009-03-28T02:15:43.987 に答える
1

2番目のオプションは、より良い解決策のようです. 私見、最初のソリューションの方法に伴う比較コードの見苦しい重複は、私にとってショーストッパーです。たとえば、次のようになります。

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 に答える