Эффективное выражение логической сетки 2x2 в коде

В обработчике событий я отвечаю на изменение значения. У меня есть доступ к старому значению и новому значению, и я хочу сделать определенные вещи в зависимости от того, что это за изменение.

Каждый отдельный результат будет выполнять некоторую комбинацию действий / функций 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.

Не стесняйтесь отвечать как дано или с этим дополнительным ограничением. Есть еще немного, но я думаю, что это слишком много, чтобы начать с. Если после этого все будет интересно, я представлю все остальное здесь или в новом вопросе.

Думаю, я Я задаю вопрос, потому что я часто сталкиваюсь с этими элементами логической сетки, и они не всегда 2х2, иногда они немного больше. Приятно заметить, что я могу обрабатывать некоторые ответы целыми «полосами», например, замечая, что X выполняется каждый раз, когда oldvalue! = 0, но похоже, что я начинаю сталкиваться с шаблоном, который просит некоторую выразительную логику для обработки в более общем смысле, вместо того, чтобы кропотливо превращать его в заявления, если не в другое. Я имею в виду, было бы очень здорово, если бы я мог предоставить своего рода сетку логики и позволить компилятору найти лучший способ справиться с этим.

Просто проведу какой-то дикий мозговой штурм:

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

Какие у вас идеи? Я вознагражу любое материальное участие вообще. Мне интересно, какой путь наименьшего сопротивления найти код, который уже использует его.

Пожалуйста, не отвечайте за этот модуль.

Дайте человеку рыбу; ты накормил его на сегодня. Научить человека ловить рыбу; и вы накормили его на всю жизнь

9
задан xenoterracide 27 August 2010 в 18:39
поделиться

3 ответа

Попробуйте Поиск кода Google, пытаясь найти такие строки, как "use Dist::Zilla::App::Tester" (кавычки важны).

5
ответ дан 4 December 2019 в 20:21
поделиться

Используйте CPANTS — веб-сайт службы тестирования CPAN.

  1. Найдите дистрибутив
  2. Нажмите Другие дистрибутивы, требующие этого

Вот страница для Дист-Zilla

Кроме того, вы всегда можете прочитать источник, нажав кнопку Источник в верхней части страницы на search.cpan.org. В этом случае в пакете изначально не так много кода. Кроме того, многие большие модули в наши дни имеют ::Cookbooks ::Manuals или ::Tutorials Dist-Zilla тоже имеет один

Я думаю :: Tester просто предоставляет команду dzil test через свою подпрограмму test_dzil.

5
ответ дан 4 December 2019 в 20:21
поделиться

Один из вариантов — использовать Google Code Search (Google для этой фразы для ссылки :) ); в сочетании с чистым гуглением. Найдите строку «use my::module::name».

Если имя модуля плохо поддается поиску (например, слишком много совпадений), его можно объединить с «

1
ответ дан 4 December 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: