У меня проблема с одним из моих классов. В нем много bools, а функции в указанном классе должны обрабатывать множество разных путей на основе этих значений. Все эти пути делают код очень раздутым и трудно читаемым. Мне было интересно, есть ли шаблон дизайна или какое-то принципиальное правило, которым я мог бы следовать, чтобы код работал одинаково, но его легче понять и прочитать.
Чтобы быть более конкретным, класс называется Actor. Это для видеоигры, с которой я помогаю. Класс Актера управляет руками гуманоида в игре. Руки работают вместе в некоторых действиях и действуют независимо друг от друга. Таким образом, существует огромное количество булевых переменных, чтобы проверить, что делает каждый из них. Это все в цикле обновлений (где-то), и я думаю, что эта функциональность должна быть как-то перемещена или упрощена. Я думаю, что существует около 20 различных значений bool, причем больше в пути.
Кроме того, я знаю, что мой пост связан с игрой, но я чувствую, что вопрос является общим.
Так есть ли способы исправить/помочь этому?
Редактировать:
Я объясню больше. Скажем, у вас есть 4 bools: isAttacking, isDefending, isCasting, isDrugged.
Поэтому вам нужно проверять каждую руку, если она занята, и обрабатывать пути, такие как: Игрок пытается атаковать двуручным оружием ->
if not isDefending и not isCasting then isAttacking = true, если isDrugged, тогда атака со значением 1 else 5.
Это просто усложняется быстро, и когда вы делаете больше в bools, он становится очень сложным. Так что я говорю: я ленивый, есть ли лучший способ сделать это?
В вашем примере с 4 bool
вас есть 16 (2 ** 4) возможных поведения:
поэтому вы можете создать массив поведения, а затем отправить его, что-то вроде:
void UpdateTick()
{
const std::uint32_t behaviorIndex =
(isAttacking << 0)
| (isDefending << 1)
| (isCasting << 2)
| (isDrugged << 3);
const std::function<void(void)> behaviors[16] = {
f_NoDrugNoCastNoDefNoAtt,
f_NoDrugNoCastNoDefAtt,
f_NoDrugNoCastDefNoAtt,
f_NoDrugNoCastDefAtt,
f_NoDrugCastNoDefNoAtt,
f_NoDrugCastNoDefAtt,
f_NoDrugCastDefNoAtt,
f_NoDrugCastDefAtt,
f_DrugNoCastNoDefNoAtt,
f_DrugNoCastNoDefAtt,
f_DrugNoCastDefNoAtt,
f_DrugNoCastDefAtt,
f_DrugCastNoDefNoAtt,
f_DrugCastNoDefAtt,
f_DrugCastDefNoAtt,
f_DrugCastDefAtt,
}
behaviors[behaviorIndex]();
}
std::array
илиstd::tuple
?