2011-03-01 71 views
1

我有这个功能对以下清理交替代码

bool flag = true; 
while(true){ 
    if(flag){ 
     function1(); 
    }else{ 
     function2(); 
    } 
    flag = !flag; 
} 

我看着它,它并没有真正似乎干净。我只是想在这两个功能之间切换。有没有办法让这个更清洁一点,更具可读性,或者你只是保持这种方式?因为现在我有5行代码似乎有点混乱。

PS:while(true)实际上并不是代码的一部分,只是一段演示,它已经持续了一段时间。

+2

我假设'bool flag = true'是为了超出for循环吗? – 2011-03-01 17:49:59

+0

呵呵,是的,你可以。谢谢你;) – 2011-03-01 17:51:08

+0

你的例子写入标志的方式永远是真的吗? – 2011-03-01 17:51:28

回答

3

恕我直言,没关系。很明显是什么意思。

0

你可以做的东西像一个C#EQIV。 JQuery的切换,使用lambdas。

0

这是令人失望的,你不能只写:

(flag) ? function1() : function2(); 

但是,这不是有效的。

如果function1function2返还相同种类,你可以写:

var trash = (flag) ? function1() : function2(); 

这是否是更具可读性是值得商榷的。

,当然,还有把一切在一行中的选项:

if (flag) function1(); else function2(); 

再次,可读性是值得商榷的。如果这种事情在你的代码中普遍存在,那么可以说这是一种常见的习惯用法。但总的来说,我会在代码审查中劝阻这样的事情。

再次,如果它在你的代码普遍的,你可以写一个方法来为您处理:

bool IfTrueFalseToggle(bool flag, Action trueFunc, Action falseFunc) 
{ 
    if (flag) 
     trueFunc(); 
    else 
     falseFunc(); 
    return !flag; 
} 

然后你会跟调用它:

flag = IfTrueFalseToggle(flag, function1, function2); 

它可能需要一个更好的名字,除非我有很多使用它的代码,否则我不会走这条路。另外,您可能最终不得不编写数十亿种不同的类似方法来处理您想与之通话的所有不同类型的ActionFunc

所有考虑的事情,我会说,一般来说,你有什么是干净的,因为它会得到。

0

这个怎么样

bool flag = true; 
while (true) 
{    
     // xor operator   
     if (flag ^= true) 
     { 
       function1(); 
     } 
     else 
     { 
       function2(); 
     } 

} 
+0

是的,我想那样。我知道这是xor操作符。但我不确定它会提高任何可用性,因为人们可能会轻松阅读它。 – 2011-03-01 20:17:47

1

发现这个刚才:将答案(似乎不是编辑在引入新的信息,因为OP将被通知更好)。

public IEnumerable<bool> AlternatingBools() { 
    bool cur = false; 
    while (true) { 
    yield return cur; 
    cur = !cur; 
    } 
}