我有这两段代码,哪一个更具可读性?

  1. foreach

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

    return risks.Sum(risk => risk.TechnicalPremium);
    
有帮助吗?

解决方案

如果处理代码的团队知道 Linq 版本的功能并了解其内部工作原理,那么它就更具可读性。

其他提示

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

return risks.SumTechnicalPremium();

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

我想说的是,你可以根据自己所处的环境来选择。

对于能够阅读 LINQ 的人来说,就是 LINQ。

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

使用 linq。如果您认为需要解释,一行注释即可解决。随着人们越来越习惯 linq,对注释的需求将会消失。

LINQ 代码非常具有可读性并且具有自记录性。

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

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

我会说第一个,因为我不知道 linq。冒着过度记录的风险,我会使用该记录并简要描述正在发生的事情。或者只是说这是针对那些可能不知道的人的 linq。

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

如果您不了解 Linq,请选择第一个。任何开发人员都可以阅读并理解第一个。

这里不存在可读性问题。单击“求和”并按 F1。

Linq 为胜利而战。

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

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

或者

十进制技术溢价 = 0;

foreach(风险中的风险)technicalPremium = TechnicalPremium + Risk.TechnicalPremium;

返回技术费;

我看到人们说他们喜欢第一个“如果你不知道 Linq”。是的,如果您不懂 C#,第一个是无法阅读的。这不是“哪个更具可读性”的问题,而是“我们更喜欢使用哪些语言特性?”

首先与您的团队讨论每个人都讨厌的语言/框架/工具集的部分,并宣布它们是禁止的。其他所有内容都被视为标准词汇的一部分,并且每个人都应该说得流利。该列表应位于您的编码标准文档中,紧邻“永远不要创建可变值类型“ 和 ”不要为非公共成员的琐碎属性而烦恼".

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

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

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

我同意那些人的说法,随着 Linq 得到更广泛的采用,第二个将很容易理解。这当然更简洁。

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

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

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

我认为随着 lambda 在 .NET 编程中变得越来越流行,这将不再是一个问题。就目前情况而言,我认为了解如何在 .NET 中使用 lambda 表达式的基础知识的学习曲线非常小。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top