Это не так уж страшно с таким коротким фрагментом кода, но в интересах «Не повторяйся», и в случае, если позже потребуется больше кода, вы можете просто разделить тестирование на предмет того, будет ли что-то сделаноот фактического выполнения этого с использованием флага.
bool need_Paint = false;
if (color == 0) {
// Black?
need_Paint = (c.val[0] >= 0 && c.val[0] <= 64);
}
else if (color == 1) {
// Grey?
need_Paint = (c.val[0] >= 64 && c.val[0] <= 128);
}
else if (color == 2) {
// White Gray?
need_Paint = (c.val[0] >= 128 && c.val[0] <= 192);
}
if (need_Paint)
Paint(cursor.x + x, cursor.y + y);
(Обратите внимание, что оптимизация компилятора может обрабатывать подобные вещи, фактически не помещая bool
в память, просто переходя к оператору вызова функции, еслиСоответствующее условие истинно.)
(Это также выглядит как шаблон, часто записываемый как switch
. Вы можете использовать этот синтаксис вместо всех if
s.)
Но на самом деле этот конкретный код может стать еще проще, потому что есть три простых теста, которые вы делаете: математический шаблон:
if (color >= 0 && color <= 2 && // (if these aren't already guaranteed)
c.val[0] >= 64*color && c.val[0] <= 64*(color+1)) {
Paint(cursor.x + x, cursor.y + y);
}
(Еще одна вещь, которую следует учитывать, - это использовать enum ColorType { BLACK=0, GREY=1, WHITE_GRAY=2 };
вместопросто записать «магические числа» 0
, 1
и 2
напрямую, но если вы используете и enum
, и математическоеверсию этого кода, я бы порекомендовал вам указать точные значения, как показано, хотя по умолчанию для enum
всегда идет последовательный отсчет от нуля, чтобы было ясно, что вы рассчитываете на эти значения.)