Элегантный способ написать критерии, основанные на утверждениях - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь найти объект в списке на основе набора критериев.Основная логика выглядит следующим образом

for (objectx obj : list)
{
    if (object.property1 > criteria1)
        //accept object
    else (object.property1 == criteria1)
    {
        if (object.property2 > criteria2)
            //accept object
        else (object.property2 == criteria2)
        {
            if (object.property3 > criteria3)
                  ... etc
        } 
    }                                  
}

Есть ли простой способ упростить этот беспорядок?

Ответы [ 4 ]

1 голос
/ 16 августа 2011
boolean accept = false;
for (int i = 0; i < object.numProps(); i++) {
   if (object.prop[i] > criteria[i]) {
       accept = true;
       break;
   } else if (object.prop[i] < criteria[i]) 
       break;
   // loop continues only if object.prop[i] == criteria[i]
}
0 голосов
/ 16 августа 2011

Добавление методов, названных в соответствии с вашей бизнес-логикой, может помочь. Затем чтение кода должно читаться как английский, а фактические сравнения - где-то еще. Об этом тоже легче думать.

0 голосов
/ 16 августа 2011

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

public bool Archive
    {
        set
        {
            if(value)
            {
                criteria.Add(Restrictions.Eq("Archive", true));
            }
        }
    }

    public bool IsFavorite
    {
        set
        {
            if (value)
            {
                criteria.Add(Restrictions.Eq("IsFavorite", true));
            }
        }
    }

Если вы просто хотите фильтровать объекты в памяти.Вы также можете использовать Спецификация .

0 голосов
/ 16 августа 2011

Я бы создал метод, который проверяет все свойства, а затем внутри вашего цикла вы можете просто сказать:

for (objectx obj : list)
{
    if(checkProperties(obj))
    {
        //Do Stuff
    }
}
...