级联布尔逻辑

时间:2013-07-14 23:18:46

标签: coding-style boolean

对这个问题的抽象性质有所了解,但是虽然我正在考虑像java或c#这样的实现,但总的来说这个概念在我看来有点烦恼。

对于大多数语言,当使用布尔逻辑进行测试时,只有一个答案有效。

if (fridgeDoorClosed !=true)
closeFridge();
else
eatSandwich();

但是当多条路径可能正确时呢?假设网页上的表单,用户使用复选框选择他/她想要查看的内容。一种非常不优雅的方式是:

if ((checkbox1==true)&&(checkbox2==true)&&(checkbox3==true))
blah
else if
((checkbox1==true)&&(checkbox2==true)&&(checkbox3==false))
blah

等等,当然要小心顺序。

在java和c#等语言中,可以使用switch语句,省略通常的break语句来强制级联。但这种方法能否以实用的方式使用?

2 个答案:

答案 0 :(得分:1)

一般来说,我会这样做:

if( checkbox1) {
  if( checkbox2) {
    if( checkbox3) {
      // all three
    }
    else {
      // a, b, not c
    }
  }
  // .......
}

但视情况而定,你可以这样做:

boxes = (checkbox1?1:0)+(checkbox2?2:0)+(checkbox3?4:0);
switch(boxes) {
case 0: // no boxes
  break;
case 1: // box 1, not 2 or 3
  break;
case 2: // box 2, not 1 or 3
  break;
// ........
}

答案 1 :(得分:1)

已经在论坛中有类似的东西 - > get-rid-of-ugly-if-statements

如果你认识波兰语,你可以观看演讲,关于'get-fid-of-if'youtube film from confitura (interesting part is from 25.20)

如果你不认识波兰语,作者说: a)最重要的是可读性(不工作,但可读代码比工作和不可读更好) b)什么代码(3个中的一个)是最好的?这取决于许多条件(例如,如果你和大学生一起工作,最好的很简单,如果你为图形引擎编写代码使用'数学')。

P.S。在c#if语句中,你不需要写'= true'

if ((checkbox1)&&(checkbox2)&&(checkbox3)
blah