Эффективное выражение логической сетки 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.

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

Думаю, я ' Я задаю этот вопрос, потому что я часто получаю эти логические сетки, и они не всегда 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

Каковы ваши идеи? Я вознаграду за любое материальное участие.$ @ ”(Перенаправление вывода на цель) неправильно? Трудно поверить, но мне кажется, что общая идиома Makefile"> $ @ "неверна. В частности, цель, в правиле которой есть команда, которая не работает, но использует это перенаправление, не удастся первой ...

Трудно поверить, но мне кажется, что общая идиома Makefile "> $ @..

мое verbose_name иностранного поля ключа не печатается в моих формах. (Я создаю модели с помощью modelformset_factory

model

class MOrders(models.Model):
    amount = models.IntegerField('Bestellmenge', null=True, blank=True)
    order_date = models.DateField('Bestelldatum')
    id = models.AutoField(primary_key=True)
    m_product_types = models.ForeignKey(MProductTypes)
    class Meta:
        db_table = u'm_orders'
        verbose_name = 'Bestellung'
        verbose_name_plural = 'Bestellungen'
        unique_together = (('id','order_date','m_product_types'))
    def __unicode__(self):
        return "%s" % (self.order_date)

verbose_name of m_product_types установлен. B

class MProductTypes(models.Model):
    id = models.AutoField(primary_key=True)
    stock = models.IntegerField('Bestand',null=True, blank=True)
    m_products = models.ForeignKey(MProducts, verbose_name='Produkt')
    m_sizes = models.ForeignKey(MSizes, verbose_name='Groesse')
    m_colors = models.ForeignKey(MColors, verbose_name='Farbe')
    class Meta:
        verbose_name = u'Produktart'
        verbose_name_plural = 'Produktarten'
        db_table = u'm_product_types'

Я что-то делаю не так? Я использую последнюю версию Django из ствола.

7
задан onigunn 27 August 2010 в 19:43
поделиться