В обработчике событий я отвечаю на изменение значения. У меня есть доступ к старому и новому значению, и я хочу делать определенные вещи в зависимости от изменения.
Каждый отдельный результат будет выполнять некоторую комбинацию действий / функций X, Y или Z. Z принимает параметр от -1 до 1. Порядок их выполнения не важен.
Посмотрите на следующую логическую сетку. Старое значение - это крайний левый столбец меток, а новое значение - это верхний ряд меток:
New:
0 !=0
-------- -------
Old: 0 | nothing Y, Z(1)
!=0 | X, Z(-1) X, Y -- Z(0) is okay but not required for this quadrant
Как лучше всего это представить?
Я работаю на C #, но буду принимать ответы на любом языке поскольку это не совсем языковой вопрос - я могу перевести все, что угодно.
Пример:
if (oldvalue == 0 && newvalue == 0) return;
if (oldvalue != 0) X();
if (newvalue != 0) Y();
Z(oldvalue != 0 ? -1 : 0 + newvalue != 0 ? 1 : 0);
Полагаю, это выглядит неплохо, но есть и другие способы сделать это.
int which = (oldvalue == 0 ? 0 : 1) + (newvalue == 0 ? 0 : 2)
switch (which) {
case 1:
X(); Z(-1);
break;
case 2:
Y(); Z(1);
break;
case 3:
X(); Y();
break;
}
На самом деле это немного более простой случай, чем то, с чем я имею дело. В случае, если oldvalue и newvalue отличны от нуля и равны друг другу, обрабатывайте newvalue, как если бы оно было 0.
Не стесняйтесь отвечать как дано или с этим дополнительным ограничением. Есть еще кое-что, но я думаю, что это слишком много для начала. Если потом что-то покажется интересным, остальное я представлю либо здесь, либо в новом вопросе.
Думаю, я задаю этот вопрос, потому что часто получаю эти логические сетки, и они не всегда 2x2, иногда они немного больше. Приятно отметить, что я могу обрабатывать некоторые ответы целыми «полосами», например замечать, что X выполняется каждый раз, когда oldvalue! = 0, но похоже, что я начинаю сталкиваться с шаблоном, который требует некоторой выразительной логики для обработки это в более общем плане вместо того, чтобы кропотливо превращать его в операторы if then else. Я имею в виду, было бы действительно здорово, если бы я мог предоставить своего рода сетку логики и позволить компилятору выяснить, как лучше всего с этим справиться.
Просто проводил безумный мозговой штурм:
Conditions:
oldvalue == 0 ? 0 : 1
newvalue == 0 ? 0 : 2
Actions:
X = {false, true, false, true}
Y = {false, false, true, true}
Z(-1) = true where condition = 1
Z(1) = true where condition = 2
Какие у вас идеи? Я вознаграду за любое материальное участие.