2009-03-28 2 views
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; 
} 

?

ответ

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

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

2

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

+0

За счет N классов. И сделать намного сложнее переключиться между состояниями. Независимо от того, что делает чувства, зависит от того, что представляют собой государства. – derobert

+0

Я не думаю, что полиморфизм будет работать, так как этот блок if/else/switch должен идти в коде пользовательского интерфейса. То, что происходит для каждого случая, не будет таким же везде, где оно используется. –