Пишу классы, которые должны формировать игровые правила определенным образом. И столкнулся со следующей проблемой:
К пример есть игра "В дурака", там есть правила:
- Кол-во игроков (2, 3, 4)
- Командная игра
- Переводной / Подкидной
Однако правило "Командная игра" может сработать только, если пользователь указал правило "Кол-во игроков" = 4.
Тут сразу 2 проблемы.
1) Как наставить data атрибутов, чтобы можно было js скажем скрывать и показывать зависимые правила из выбора определенных значений ?
2) Как эти самые зависимости указывать.
Сейчас у меня есть
GameProposalInterface и метод, который реализует класс игры:
public function getRules()
{
return [
new CountPlayersRule([2, 3, 4]),
new TeamGameRule(),
new TimeHitRule(),
];
}
Я смотрел в сторону паттерна composite, однако он не очень подходит. Как вариант сделать еще 1 метод, в котором описывать зависимости в массивах, однако, тогда нужно получить имя правила,а это повторно инициализировать объект и делать что то такое:
public function getRulesDependency()
{
return [
(new CountPlayersRule())->getName() => [(new TeamGameRule())->getName() => [4]]
];
}
Тут как минимум проблемы в том, что постоянно нужно инициализировать объекты, можно внести константы, но это будет не очень удобно, так как их реализовать в интерфейсе не заставишь, а классов с правилами много.
Ну и еще проблема, если нужно сделать сложную зависимость, например:
- Если в правиле А выбрано значение 1, то в правиле Б будет доступно значение 10 и 11
- Если в правиле А выбрано значение 2, то в правиле Б будет доступно значение 12 и 13
Есть у кого-то советы на этот счет ?