2014-11-15 2 views
1

Предположим, что у нас есть сложный класс, который взаимодействует с несколькими другими другими объектами, и эти взаимодействия зависят от состояний друг от друга.Является ли сохранение нескольких логических переменных как переменных состояния плохой практикой программирования?

Сразу же я попытался использовать несколько булевых состояний, чтобы попытаться отслеживать эти состояния, но это часто приводит к запутанному коду, заполненному операторами IF.

Есть ли разрешенные решения или шаблоны проектирования, чтобы справиться с этим, минимизируя беспорядок?

В качестве примера рассмотрим что-то вроде этого:

int Foo(int A, int B, inc C) 
{ 
    if(_state1 && !_state2) 
     return A+B; 

    else if(_state1 && _state2 && _state3) 
     return A+C; 

    else if(!_state1 && (_state4 || _state5) 
     return C;  
    ... 
}  

Это легко увидеть, как что-то, как это будет работать из-под контроля очень быстро

+0

Государственный шаблон приходит на ум, но ваш вопрос слишком расплывчатый. Вы лучше опубликуете код, чтобы мы видели, как его улучшить. –

+0

Нет конкретного примера, это просто то, с чем я столкнулся несколько раз. Я попытаюсь получить пример, но – Daniel

+0

Вы говорите о чем-то, где у вас есть последовательность переменных состояния, таких как 'is_ready_for_method_a',' is_ready_for_method_b' и т. Д.? В этом случае вы будете искать конечный автомат. –

ответ

1

Скорее всего, один из лучших способов осуществить это будет быть с конечным автоматом, в зависимости от деталей, которые не были предоставлены. (Я собираюсь привести свой пример на Java, потому что это то, с чем я знаком, и вы не указали, однако оно должно быть применимо к большинству языков OO.)

Вам нужно перечисление, и использовать оператор switch для выбора.

Итак, вы хотите перечисление:

public static enum ExampleState { 
    // You would want explanatory names in a real program. 
    INITIAL_STATE, SOME_STATE, OTHER_STATE 
} 

И затем, на своем сложном классе:

private ExampleState state = ExampleState.INITIAL_STATE; 

public int foo(int a, int b, int c) { 
    switch (state) { 
    case INITIAL_STATE: return a + b; 
    case SOME_STATE: return a + c; 
    case OTHER_STATE: return c; 
    default: throw new IllegalStateException("Unexpected state " + state); 
    } 
} 

Для нормального состояния машины, вы также хотите, такие методы, как

public void changeStateInSomeSpecificWay() { 
    switch (state) { 
    case INITIAL_STATE: 
     someAction(); 
     state = SOME_STATE; 
     break; 
    case SOME_STATE: 
     someOtherAction(); 
     state = INITIAL_STATE; 
     break; 
    case OTHER_STATE: 
     someThirdAction(); 
     state = INITIAL_STATE; 
     break; 
    default: 
     throw new IllegalStateException("Unexpected state " + state); 
    } 
} 
Смежные вопросы