Не уверен, что вы можете уменьшить количество операторов if, но лучше всего улучшить удобство обслуживания (поскольку вы ожидаете большего количества критериев вознаграждения).
Вместо 5 различных функций вознаграждения создайте простую ипройти номер критерия.В этой функции вы можете снова разделить их с помощью оператора switch.Это не уменьшает if, но у вас есть одна точка входа, поэтому вы можете вызывать критерии вознаграждения в цикле for.Пусть цикл for возвращает значения в массиве.Чем вы можете объединить значения массива в одно число, чтобы найти окончательную награду.
Как псевдокод:
class RewardWeight {
public boolean checkReward(int number)
{
bool reward = False
switch (number)
{
case 0: // 200th order
// Logic or call function
case 1: // Next
...
}
return reward
}
Альтернатива 1:
bool weights[MAX_REWARDS];
public int getRewardWeight() {
for (int reward = 0; reward < MAX_REWARDS; reward++) {
weights[reward] = checkReward(reward) ? 1 : 0;
// Here you can use all if statements for the conditions.
Альтернатива 2:
Если у вас будет действительно большой список, вы можете поместить объединенный коэффициент в одно значение и создать большой массив, содержащий весовые коэффициенты:
Rewards[] = { 1, 6, 3, 4, 6, ..., 25, 2, 3, 4, 3} // Means e.g.
// Assuming there are 4 conditions, there are 16 values, the 5th value
// from the end
// which is 0101 binary, means: condition 1 false, condition 2 true,
// condition 3 false, condition 4 true has value 25.
public int getRewardWeight() {
for (int reward = 0; reward < MAX_REWARDS; reward++) {
weights += Power(2, reward) * checkReward(reward) ? 1 : 0;
return Rewards[weights];
Обратите внимание:Альтернатива 2 может привести к большому массиву.