Сложная логика - PullRequest
       7

Сложная логика

6 голосов
/ 02 августа 2010

Друзья

Как реализовать следующую сложную логику?

flag1 может быть "N" или "A" или "I"
flag2 может быть "N" или "A""или" I "
flag3 может быть" N "или" A "или" I "* функция 1007 *

(строка flag1, строка flag2, строка flag3) begin

Функция должнаreturn:

  1. вернуть «None», если flag1, flag2 и flag3 - «N»

  2. иначе вернуть «Active», если flag1, flag2 иflag3 - «A»

  3. , в противном случае возвращает «Неактивно», если flag1, flag2 и flag3 - «I»

  4. , в противном случае возвращает «оба», еслиflag1, flag2 и flag3 - это либо «A» И «I» (ИЛИ «N»)

например, 1) flag1 это «A», а flag2 это «I», а flag3 это «I "
например, 2) flag1 - это" I ", а flag2 - это" A ", а flag3 - это" I "
например, 2) flag1 - это" A ", а flag2 - это" N ", а flag3 - это" I "

результат повторного запуска

end

Спасибо за ответ, но никто из постов не дает ответа.Я знаю, если еще ограничить и искать логику для реализации выше psedocode.Все четыре являются возможными условиями, особенно № 4 сложен и должен знать, как это реализовать.

Ответы [ 5 ]

20 голосов
/ 02 августа 2010

Ваша логика для пункта 4 сбивает с толку ...

Я бы использовал для этого значение enum, а не строки - это намного более безопасно для типов (например, что если кто-то передал "WIBBLEWOBBLE" вашему методу? Что он должен возвращать?)

enum Value { None, Active, Inactive, Both }

private Value GetValue(Value flag1, Value flag2, Value flag3) {
    if (flag1 == flag2 && flag2 == flag3)    // they are all the same
        return flag1;
    else return Value.Both;    // there is a difference
}
2 голосов
/ 03 августа 2010
[Flags]
enum SomeWierdReturn
{ Both = 0, None = 1, Active = 2, Inactive = 4 }

public SomeWierdReturn DoSomething(SomeWierdReturn flag1, SomeWierdReturn flag2, SomeWierdReturn flag3)
{
    return (SomeWierdReturn)(flag1 & flag2 & flag3);
}
1 голос
/ 02 августа 2010

Я думаю, что это служит как удобочитаемости, так и скорости, если вы сначала проверите, равны ли все 3 значения.

if ((flag1 == flag2) and (flag1 == flag3))
   // use a switch or table to go 'I' -> Inactive etc
else
  return "Both"; // as far as i understood 4)
0 голосов
/ 03 августа 2010

Robaticus дал вам правильный ответ, но в комментарии, а не в посте, поэтому я остановлюсь на нем.

У нас есть три флага, которые могут принимать каждое из трех состояний.Таким образом, существует 3 * 3 * 3 = 27 возможных вариантов.

Когда сталкиваешься со сложной логикой if..then и таким маленьким адресным пространством, вообще не имеет смысла пытаться закодировать все if ifthen.Вместо этого один трехмерный массив содержит всего 27 элементов.

const int None = 0;const int Неактивно = 1;const int Active = 2;

private int ParseFlag (строка Flag) {switch (Flag) {case "N": return None;регистр "I": возврат неактивен;регистр "A": возврат активен;по умолчанию выбрасывать новое исключение (string.Format («Получил значение флага {0}, но ожидал N, I или A», Flag));}}

public Lookup FlagResult (строка Flag1, строка Flag2, строка Flag3) {return FlagData [ParseFlag (Flag1), ParseFlag (Flag2), ParseFlag (Flag3)];}

Я позволю вам построить массив.

0 голосов
/ 02 августа 2010

Это будет * работать. Не могу сказать, что мне это нравится.

 string key = flag1 + flag2 + flag3;
 switch(key){
     case "NNN":
         return "None";
      case "AAA":
        return "Active";
      case "III":
        return "Inactive";
      default:
        break;
  }
  // ;)
 //Trying to make it as confusing as your requirement #4
  var four = (
     from s in key
     select s
   ).Distinct();

  if(four.Count() > 1){
    return "Both";
  }



 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...