【问题标题】:Anonymous Methods / Lambda's (Coding Standards)匿名方法 / Lambda 的(编码标准)
【发布时间】:2010-04-13 15:41:01
【问题描述】:

在 Jeffrey Richter 的“CLR via C#”(.net 2.0 版页面,353)中,他说作为自律,他从不让匿名函数的长度超过 3 行代码。他主要引用可读性/可理解性作为他的理由。这很适合我,因为我已经养成了使用不超过 5 行匿名方法的自律性。

但是,“编码标准”建议如何与 lambda 相提并论?从表面上看,我会对它们一视同仁——保持 lambda 一样短。但其他人对此有何看法?特别是,当 lambda 被用于(可以说)它们最闪耀的地方时 - 在 LINQ 语句中使用时 - 是否有真正的理由放弃该自律/编码标准?

【问题讨论】:

    标签: linq lambda standards


    【解决方案1】:

    请记住,自 2.0 以来,情况发生了很大变化。例如,考虑 .NET 4 的并行扩展,它大量使用委托。你可能有:

    Parallel.For(0, 100, i => 
    {
        // Potentially significant amounts of code
    });
    

    对我来说,这是一个 lambda 表达式还是一个匿名方法并不重要 - 它的使用方式与 .NET 2.0 中通常使用的委托不同。

    在普通的 LINQ 中,我通常不会发现自己使用大型 lambda 表达式 - 当然不是根据 语句的数量。有时,一个特定的单个表达式在 lines 方面会很长,因为它投射了许多属性;另一种选择是有大线!

    事实上,LINQ 倾向于支持单表达式 lambda 表达式(甚至没有大括号)。看到 LINQ 的 good 使用,它有一个包含 5 个语句的 lambda 表达式,我会感到相当惊讶。

    【讨论】:

    • 所以我认为您是在说 99% 的情况下,在 LINQ 的“良好”使用方面,您会期望 lambdas 很短(例如,通常为 3 行或更少)。相反,您所说的“有时很长”是什么意思?你的意思是在 1% 的情况下,你会找到一个合法的 20 多行代码行的 lambda?
    • 哦,等等,我明白了。您将“计数分号”作为语句,并将类似于流畅的 API 用法的东西称为“行”。明白了。 :)
    • 对于“Parallel.For”,“大量代码”是什么意思? 120 条语句? 10个陈述?在该 lambda 中具有“潜在大量代码”的价值是什么?为什么不遵循 Steven 在本主题中发布的建议?
    • @Mysagogue:这是个人品味的问题。 10 条语句通常可以在 IMO 中使用,但无论如何都应该重构 120 条语句......请注意,lambdas 也可以在上下文中捕获局部变量,这在其他地方可能会很尴尬。
    【解决方案2】:

    我不知道为短 lambda 和委托制定指南是否真的有用。但是,有一个具有简短功能的指南。我写的方法平均有 6 或 7 行长。函数几乎不应该是 20 行长。您应该创建最易读的代码,如果您遵循 Robert Martin'sSteve McConnell's 的建议,它们会告诉您保持函数简短,并尽可能缩短循环的内部部分,最好只调用一个方法。

    所以你不应该这样写一个for循环:

    for (int i = 0; i < 100; i++)
    {
        // Potentially significant amounts of code
    }
    

    但只需在循环内调用一个方法:

    for (int i = 0; i < 100; i++)
    {
        WellDescribedOperationOnElementI(i);
    }
    

    考虑到这一点,虽然我总体上同意 Jon Skeet 的回答,但我看不出有任何理由不希望他的示例写成:

    Parallel.For(0, 100, i =>
    {
        WellDescribedPartOfHeavyCalculation(i);
    });
    

    Parallel.For(0, 100, i => WellDescribedPartOfHeavyCalculation(i));
    

    甚至:

    Parallel.For(0, 100, WellDescribedPartOfHeavyCalculation);
    

    总是选择最易读的代码,很多时候这意味着:简短的匿名方法和简短的 lambda,但最重要的是简短但描述良好的方法。

    【讨论】:

    • 你的回答对我来说很讽刺。如果我只是猜到了,我可能会想象响应者最多会说“lambdas 应该与函数长度相同或更短”而不是“lambdas 短,函数甚至更短”。是什么让函数比 lambda 更难阅读?
    • 因为 lambda 通常是方法的一部分,所以几乎不可能使方法比 lambda 更短。方法并不比 lambda 更难阅读。不,我认为过度使用 lambda 会降低代码的可读性。强大的力量,yada yada。
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2012-02-23
    • 2013-02-16
    • 2011-06-23
    • 2011-02-08
    • 2011-10-13
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多