清理交替代码

时间:2011-03-01 17:48:05

标签: c#

我有关于以下

的这个功能
bool flag = true;
while(true){
    if(flag){
      function1();
    }else{
      function2();
    }
    flag = !flag;
}

我正在看它,它看起来并不那么干净。我只是想在这两个功能之间交替。有没有办法让这个更清洁,更具可读性,或者你会保持这种方式吗?因为现在我有5行代码似乎有些混乱。

PS: while(true)实际上不是代码的一部分,只是一段时间的演示。

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您可以使用状态模式。虽然这很简单,但可能会过度杀人。

http://en.wikipedia.org/wiki/State_pattern

答案 2 :(得分:1)

刚刚发现:添加答案(似乎比引入新信息时的编辑更好,因为OP会收到通知)。

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

答案 3 :(得分:0)

你可以制作类似C#eqiv的东西。 JQuery的切换,使用lambdas。

答案 4 :(得分: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

考虑到所有事情,我会说,一般来说,你所拥有的是干净利落的。

答案 5 :(得分:0)

这个怎么样

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

}