删除if语句的嵌套

时间:2011-11-04 22:42:50

标签: refactoring nested-if

我有一段代码,我不知道如何重构。它不是很易读,我想让它可读。这是一个问题

数据库中有两列可以是NULL,0或每个都有一个值。在网页上有一个复选框 - 启用和文本框 - 这两列中的每一列的值。

x = checkbox1
z = textbox1
y = checkbox2
w = textbox2

逻辑是如果未选中两个复选框,则两个值都应为0.如果选择了其中一个而其他未选中,则其他值应为NULL。对于选中的那个,如果文本框为空,则其值应为NULL,否则应为文本框中的值

if{x}
{
   if(z)
   {
      a = NULL;
   }
   else
   {
      a = z;
   }
   if(y)
   {
      if(w)
      {
          b=w;
      }
      else
      {
          b = NULL;
      }
   }
   else
   {
      b = null
   }
}
else
{
   if(y)
   {
      a = NULL;
      if(w)
      {
          b=w;
      }
      else
      {
          b = NULL;
      }
   }
   else
   {
      a = 0;
      b = 0;
   }
}

相信我这是一个有效的方案。让我知道这是否有意义,或者我应该提供更多信息

2 个答案:

答案 0 :(得分:2)

使用一些逻辑和nots,我们得到更具可读性的东西。 我们可以通过默认为NULL来保存一点(因此不需要将另一个设置为NULL)。我们还可以通过放置用于检查文本框是否已设置的代码或将null用于小函数来保存。

在伪代码中:

a = NULL
b = NULL
if (not checkbox1) and (not checkbox2):
  a = 0
  b = 0
if (checkbox1):
  a = valueornull(textbox1)
if (checkbox2):
  b = valueornull(textbox2)


function valueornull(textbox):
  if textbox value:
    return value
  else:
    return null

答案 1 :(得分:2)

我认为在这里使用单个字母的更多描述性名称会有所帮助,但假设这是C代码,它看起来与内联if语句相当简洁:

if(x)
{
   a = z ? NULL : z;
   b = (y && w) ? w : NULL;
}
else
{
   a = y ? NULL : 0;
   b = (y && w) ? w : 0;
}
相关问题