На этот вопрос было дано несколько правильных ответов, но я бы придерживался другого мнения: если код выглядит слишком сложным, что-то не совсем верно .Код будет трудно отлаживать и, скорее всего, он будет «одноразовым».
В реальной жизни, когда мы находим ситуацию, подобную этой:
Scenario 1 | Scenario 2 | Scenario 3
bValue1: true | true | true
bValue2: true | true | false
bValue3: true | true | false
bValue4: true | false | false
Когда четыре состояниясвязаны таким точным шаблоном, мы имеем дело с конфигурацией некоторого «объекта» в нашей модели .
Крайняя метафора - это то, как мы описываем «людей» в модели, если бы мы не знали об их существовании как унитарных сущностей с компонентами, связанными с определенными степенями свободы: нам пришлось бы описывать независимые состоянияиз "туловища", "руки", "ноги" и "голова", которые усложнили бы понимание описанной системы. Непосредственным результатом были бы неестественно сложные логические выражения.
Очевидно, что путь к снижению сложности - это абстракция, а инструментом выбора в c ++ является парадигма объекта .
Итак, вопрос: почему существует такая модель?Что это такое и что оно представляет?
Поскольку мы не знаем ответа, мы можем прибегнуть к математической абстракции: массив : у нас есть три сценария, каждый из которыхтеперь массив.
0 1 2 3
Scenario 1: T T T T
Scenario 2: T T T F
Scenario 3: T F F F
В этот момент у вас есть начальная конфигурация.как массив.Например, std::array
имеет оператор равенства:
В этот момент ваш синтаксис становится:
if( myarray == scenario1 ) {
// arrays contents are the same
}
else if ( myarray == scenario2 ) {
// arrays contents are the same
}
else if ( myarray == scenario3 ) {
// arrays contents are the same
}
else {
// not the same
}
Так же, как ответ Джан Паоло, он короткий, понятный и легко проверяемый / отлаживаемый.В этом случае мы делегировали детали булевых выражений компилятору.