【问题标题】:What is more readable? [closed]什么更具可读性? [关闭]
【发布时间】:2008-10-14 12:35:40
【问题描述】:

我有这两段代码,哪一个更易读?

  1. foreach

    decimal technicalPremium = 0;
    foreach (Risk risk in risks)
    {
         technicalPremium = technicalPremium + risk.TechnicalPremium;
    }
    return technicalPremium;
    
  2. linq

    return risks.Sum(risk => risk.TechnicalPremium);
    

【问题讨论】:

  • 为什么在 ForEach 中不使用 += 而不是重复变量?

标签: c# linq lambda readability


【解决方案1】:

如果编写代码的团队知道 Linq 版本做了什么并且知道它的内部工作原理,那么它就更具可读性。

【讨论】:

    【解决方案2】:

    使用您喜欢的任何一个,但将其隐藏在方法中:

    return risks.SumTechnicalPremium();
    

    【讨论】:

      【解决方案3】:

      两者都不是。第一个比较冗长,可能每个人都能理解。第二个更简洁,即使对 linq 有一点了解的人也容易理解。

      我想说你可以根据你所处的环境做出选择。

      【讨论】:

        【解决方案4】:

        对于可以阅读 LINQ 的人来说,LINQ 一。

        对于必须逐步解释代码的人(通过使用较短的智能感知/文档。

        【讨论】:

          【解决方案5】:

          使用 linq。如果你认为它需要解释,一行注释会解决这个问题。随着人们越来越习惯于 linq,对 cme​​ts 的需求将会消失。

          【讨论】:

            【解决方案6】:

            LINQ 代码可读性强,并且可以自我记录。

            【讨论】:

              【解决方案7】:

              第一个选项对更广泛的人来说更具可读性。第二个选项有一个“进入障碍”,因为读者可能知道并理解 LINQ。它更简洁,因此如果您的受众超过了该入门障碍,可能会更好。

              【讨论】:

                【解决方案8】:

                我认为第二种选择更好,因为它应该更有效。然而,正在发生的事情不太明显(至少对我而言)。

                【讨论】:

                • 实际上,LINQ 通常会增加 开销 - 但是,它会非常微不足道(尤其是在这种情况下),几乎不重要。在这种情况下,它为每个项目添加一个委托调用和一些堆栈跃点。我不会失眠-对我来说是#2;-p
                【解决方案9】:

                我会说第一个,因为我不知道 linq。冒着过度记录的风险,我会使用那个对正在发生的事情进行简短描述的文件。或者只是说它是给可能不知道的人的 linq。

                【讨论】:

                  【解决方案10】:

                  如果您提供解释其用途的评论,那么我会选择 Linq 选项。

                  【讨论】:

                    【解决方案11】:

                    第一个如果你不了解 Linq。任何开发者都可以阅读和理解第一个。

                    【讨论】:

                      【解决方案12】:

                      这里没有可读性问题。点击 Sum 并按 F1。

                      Linq 赢得胜利。

                      【讨论】:

                      • 无需按 F1。将鼠标悬停在 Sum 上,您将获得描述该函数的工具提示;)
                      • 谁使用鼠标?哦,我说点击...我猜你找到我了,哈哈。
                      【解决方案13】:

                      每种语言都有编写此类代码的最佳方式的约定,因此对于经常使用该语言的人来说最易读的内容并不是通用的。对于 Java 或普通 C# 程序员来说,第一个选项更具可读性。对于习惯于 LINQ 或函数式编程的人来说,第二个更具可读性。

                      【讨论】:

                      • 如果你的“普通 C# 程序员”不懂 Linq,他就有问题了。
                      • 嗯,“理解” LINQ 并了解某人刚刚添加到列表类中而您甚至不知道的那些扩展方法可能是不同的。虽然 .NET 2.0 开发人员可以理解 .Sum 之一,但(s)他可能想知道 Sum 方法的来源......
                      【解决方案14】:

                      我不知道 c#,但第二个替代方案对我来说看起来更干净,我可以理解它的作用(好的,与第一个版本进行一些猜测和交叉检查)。可能是因为一些功能背景。但首先,您必须在 4(!) 个地方寻找技术溢价。如果您只是阅读代码,则第二个更短且更容易理解。

                      【讨论】:

                        【解决方案15】:

                        十进制技术溢价 = 0;

                        foreach (Risk risk in risk) TechnicalPremium = TechnicalPremium + risk.TechnicalPremium;

                        返回技术溢价;

                        【讨论】:

                          【解决方案16】:

                          我看到人们说他们喜欢第一个“如果你不知道 Linq”。是的,如果你不懂 C#,第一个是不可读的。这不是“哪种更易读”的问题,而是“我们使用哪种语言功能更舒服?”

                          首先与您的团队就每个人讨厌的语言/框架/工具集的部分进行对话,并宣布它们为禁区。其他一切都被认为是标准词汇的一部分,每个人都应该流利。此列表应包含在您的编码标准文档中,就在“never make mutable value types”和“don't bother with trivial properties for non-public members”旁边。

                          只要 Linq 不在您的“排除”列表中,第二个示例就比第一个示例更具可读性。为什么?因为它声明了代码的意图,而不是仅仅呈现给读者破译的机制。

                          【讨论】:

                            【解决方案17】:

                            如果您的目标是让可能出现在您之后的“任何人”更容易阅读,请使用 foreach。我将“更具可读性”解释为任何具有语言基础经验的人都应该能够掌握。对于不熟悉 linq 并且仍在使用 VS2005 或更早版本的人来说,linq 语法会令人困惑。

                            【讨论】:

                              【解决方案18】:

                              我会说第一段代码肯定更具可读性,如果您至少重命名变量 risk 使其具有与类不同的名称,它会更具可读性。如果您将数组风险重命名,可能也会更好。

                              【讨论】:

                                【解决方案19】:

                                我同意那些说随着 Linq 被更广泛采用第二个将很容易理解的人的观点。它当然更简洁。

                                但是,我对调试的难易程度有些担心。单步执行 foreach 中的代码似乎要容易得多,以准确查看它在每次传递中所做的事情。

                                【讨论】:

                                  【解决方案20】:

                                  我认为这取决于您所说的“可读”是什么意思。第一个例子清楚地表明了程序逻辑,任何有编程背景的人都应该可以理解。

                                  对我来说,第二个示例基于上下文更直观(即,您正在获取一个数组(或其他一些集合类型)并在该数组的每个元素上执行一个名为 Sum 的方法)。第二个示例可能变得不太清楚的唯一地方是实际的 lambda 表达式本身,特别是对于没有使用 lambda 的经验或已经有函数式编程背景的人。

                                  我认为随着 lambda 在 .NET 编程中变得越来越普遍,这将不再是一个问题。就目前而言,我认为了解如何在 .NET 中使用 lambda 表达式的基础知识需要很短的学习曲线。

                                  【讨论】:

                                    【解决方案21】:

                                    第二个,当然。有这么大的代码块来做像求和这样简单的事情是没有必要的。我也不知道 LINQ 是什么,但它对我来说是完全可读的。

                                    【讨论】:

                                      猜你喜欢
                                      • 2018-11-15
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2013-03-31
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2022-01-22
                                      • 1970-01-01
                                      • 2021-08-23
                                      相关资源
                                      最近更新 更多