Несколько равных ifs должны возвращать разные значения из разных методов (C #)? - PullRequest
0 голосов
/ 18 мая 2011

У меня есть несколько методов, которые используют условия if, например:

string method1()
{
    bool x= Convert.ToBoolean(...);
    bool y= Convert.ToBoolean(...);

     if (x && y)
     {
         return " ";
     }

     if (!x && y)
     {
         return " ";
      }

      if (!y && x)
      {
          return " ";
      }

      if (!x && !y)
      {
          return "X";
      }

      return " ";
  }

Это мой первый метод, теперь у меня есть аналогичный метод, который имеет те же проверки и те же логические значения, но возвращает другиестроки (не пробел или X).Какой подход Elegeant для решения этой проблемы?

Спасибо

Ответы [ 6 ]

4 голосов
/ 18 мая 2011

Согласно вашему коду вы возвращаете «X» только в том случае, если x и y ложны.В этом случае любая другая комбинация должна возвращать "".Это может быть сокращено, но я оставил его для удобства чтения.

method1("X", " ");
method1("OtherValue", " ");

string method1(string matchValue, string nonMatchValue)
{
    bool x= Convert.ToBoolean(...);
    bool y= Convert.ToBoolean(...);

      if (!x && !y)
      {
          return matchValue;
      }

      return nonMatchValue;
  }
2 голосов
/ 18 мая 2011

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

Пример

private int BinaryTruthTest(bool x, bool y)
{
   if(x && y)
   {
      return 3;
   }
   if(!x && y)
   {
      return 1;
   }
   if(!y && x)
   {
      return 2;
   }
   if(!x && !y)
   {
      return 0;
   }
}

string method1()
{
   bool x = Convert.ToBoolean(...);
   bool y = Convert.ToBoolean(...);

   int testResult = BinaryTruthTest(x, y);

   if(testResult==0)
   {
      return "X";
   }
   else
   {
      return " ";
   }
}
2 голосов
/ 18 мая 2011

Почему бы не передать нужные возвращаемые значения в качестве параметров методу?

string method1(string returnVal1, string returnVal2)
{
    bool x= Convert.ToBoolean(...);
    bool y= Convert.ToBoolean(...);

    if (x && y)
    {
        return returnVal1;
    }

    if (!x && y)
    {
        return returnVal1;
    }

    if (!y && x)
    {
        return returnVal1;
    }

    if (!x && !y)
    {
        return returnVal2;
    }

    return returnVal1;
}
0 голосов
/ 18 мая 2011

Если вы хотите, чтобы метод два возвращал четыре разных значения для четырех разных случаев, тогда вы могли бы сделать:

string method1(string[] values)
{
if (x && y)
 {
     return values[0];
 }

 if (!x && y)
 {
     return values[1];
  }

  if (!y && x)
  {
      return values[2];
  }

  if (!x && !y)
  {
      return values[3];
  }

}

Однако это не очень красиво. Какая польза от этого метода в вашем приложении?

0 голосов
/ 18 мая 2011

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

class DecisionMaker
{
    string _both;
    string _notX;
    string _notY;
    string _neither;
    string _default;

    public DecisionMaker(string both, string notX, string notY, string neither, string defaultVal)
    {
        _both = both;
        _notX = notX;
        _notY = notY;
        _neither = neither;
        _default = defaultVal;
    }

    public string Method1(bool x, bool y)
    {
        if (x && y)
            return _both;

        if (!x && y)
            return _notX;

        if (!y && x)
            return _notY;

        if (!x && !y)
            return _neither;

        return _default;
    }
}

Или, опционально, вы можете иметь Convert.ToBoolean (...)вещи внутри Method1 и make Method1 не имеют параметров.Или вы можете создать абстрактный класс DecisionMakerBase с защищенными абстрактными методами, которые позволяют вам изменять только то, что вам нужно изменить.Это действительно зависит от вашего сценария.

0 голосов
/ 18 мая 2011

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

string method1(string[][] result) {
   bool x= Convert.ToBoolean(...);
   bool y= Convert.ToBoolean(...);
   int u = (x ? 1 : 0);
   int v = (y ? 1 : 0);
   return result[u][v];
}
...