рефакторинг мой оператор if - PullRequest
1 голос
/ 26 августа 2010

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

   if x is not Number      ;// if x is string
   {
      if y is not Number      ;// x, y both strings
      {
         Eval(x)
         Eval(y)
         return
      }
      else                    ;// x is string, y is Number
      {
         Eval(x)
         Scale(y)
         return
      }
   }
   else if y is not Number    ;// x is Number, y is string
   {
      Scale(x)
      Eval(y)
      return
   }
   else                       ;// both are numbers
   {
      Scale(x)
      Scale(y)
      return   
   }

Ответы [ 2 ]

7 голосов
/ 26 августа 2010

Похоже, вы хотите Eval строк и Scale чисел.Вместо четырех явных случаев (которые стали бы восемью с тремя переменными), обрабатывайте каждый случай для x и y независимо:

if x is Number
    Scale(x)
else
    Eval(x)

if y is Number
    Scale(y)
else
    Eval(y)

Или, еще лучше, вы можете нажать Eval /Scale в служебный метод:

ScaleOrEval(z):
    if z is Number
        Scale(z)
    else
        Eval(z)

... и затем используйте его ...

ScaleOrEval(x)
ScaleOrEval(y)

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

2 голосов
/ 26 августа 2010
// First handle x
if x is Number
{
    Scale(x)
}
else
{
    Eval(x)
}

// Then handle y
if y is Number
{
    Scale(y)
}
else
{
    Eval(y)
}

return
...