代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

使用“伪运算符”区分循环的简单重复和常规重复

  •  2
  • polygenelubricants  · 技术社区  · 15 年前

    我想知道其他人对以下写作风格的看法 for 循环:

    for (int rep = numberOfReps; rep --> 0 ;) {
       // do something that you simply want to repeat numberOfReps times
    }
    

    我发明这种风格的原因是为了区别于 对于 循环。 我只在需要简单重复的时候使用这个 numberOfReps 时间和循环体不使用 rep numberofReps 以任何方式 .

    就我所知,例如标准Java没有简单的方式说“只是重复这n次”,这就是为什么我想出了这个。我甚至会说,回路的主体不能 continue break ,除非在 对于 循环,因为正如我所说,整个目的是通过提出一种独特的风格来表示简单的重复,从而使代码更容易理解。

    如果你所做的是 简单(依赖于一个递增/递减指数的值, 打破 S 持续 s等),然后使用标准 对于 循环。如果你在做什么 另一方面,简单的重复,那么这种独特的风格传达了“事实”(当然,一旦你知道了风格的目的)。

    我说“事实”是因为这种风格当然会被滥用。我假设你有一个称职的程序员,他们的目标是编写代码。 更容易的 理解,而不是 更努力 .


    有人评论说,这暗示了 对于 应该只用于简单的迭代,并且 while 否则应使用(例如,如果在主体中修改了循环变量)。

    如果是这样的话,那么我只是在扩展这个原则,说如果它比你的简单更简单 对于 循环(例如,你甚至不关心迭代索引,或者它是增加还是减少,等等,你只想重复做N次),然后使用闪烁箭头 对于 而是循环构造。


    太巧了,乔希·布洛克 tweeted 下列内容:

      Goes-to Considered Harmful:
    
      public static void main(String[] a) {
        int i = 10;
        while (i --> 0) /* i goes-to 0 */ {
          System.out.println(i);
        }
      }
    

    不幸的是,没有给出解释,但似乎至少这个伪运算符有一个名称。之前也讨论过,所以: What is the name of this operator: “-->”?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Laurence Gonsalves    15 年前

    你有语言不可知论标签,但这个问题不是真正的语言不可知论。如果在你的语言中还没有一个很好的成语可以用来做N次的事情,那么这种模式就很好了。

    你继续提到Java,WHICHA已经有了一个熟知的习惯用法:

    for (int i = 0; i < numberOfReps; i++) {
       // do something that you simply want to repeat numberOfReps times
    }
    

    虽然您的模式也可以正常工作,但其他人会感到困惑。当我第一次看到它的时候,我的想法是:

    1. 那支奇怪的箭是什么?
    2. 那句台词为什么对我眨眼?

    除非您开发了一种模式,它比标准的习惯用法具有显著的优势,否则最好坚持使用标准,这样您的同事就不会因此而抓耳挠腮了。

        2
  •  2
  •   Brian    15 年前

    现在几乎每种语言都有lambda,因此可以编写类似

    nTimes(n, body)
    

    这需要一个int和一个lambda,并且更直接地传达意图。例如,在f中

    let nTimes(n,f) =
        for i in 1..n do f()
    
    nTimes(3, fun() -> printfn "Hello")    
    

    或者如果您喜欢扩展方法

    type System.Int32 with
        member this.Times(f) =        
            for i in 1..this do f()
    
    (3).Times(fun() -> printfn "Hello")