【问题标题】:removing nesting of if statements删除 if 语句的嵌套
【发布时间】:2011-11-04 22:42:49
【问题描述】:

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

数据库中有两列可以为 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;
   }
}

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

【问题讨论】:

    标签: refactoring nested-if


    【解决方案1】:

    使用一些逻辑与和非,我们得到了更易读的东西。 我们可以通过默认为 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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答。它不是 C,所以没有三元运算符。它是内部服务器端脚本语言之一
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多