C# .net代码的可读性和可维护性

C# .net代码的可读性和可维护性,c#,.net,C#,.net,目前,关于哪种代码更具可读性,当地存在着争论 我们有一个来自c语言背景的程序员,当这个程序员编写代码时,它看起来像 string foo = "bar"; if (foo[foo.Length - 1] == 'r') { } 我们有另一个程序员不喜欢这种方法,而宁愿使用 if (foo.EndsWith("r")) { } 哪种操作方式更好?我来自C/C++背景,我投票支持Endswith>P>对从未见过C或C++、C等任何编程语言的人来说,EnthSoad更可读。 第二个是多,但我

目前,关于哪种代码更具可读性,当地存在着争论

我们有一个来自c语言背景的程序员,当这个程序员编写代码时,它看起来像

string foo = "bar";

if (foo[foo.Length - 1] == 'r')
{

}
我们有另一个程序员不喜欢这种方法,而宁愿使用

if (foo.EndsWith("r"))
{

}

哪种操作方式更好?

我来自C/C++背景,我投票支持Endswith

>P>对从未见过C或C++、C等任何编程语言的人来说,EnthSoad更可读。

第二个是多,但我不能客观地告诉你,如果它更可读,可读性很主观。我个人觉得第二本书更具可读性,但这只是我的观点

以下是我文章的摘录:

大多数C#开发人员都非常熟悉 编写命令式代码(偶数) 虽然他们可能不知道这一点 姓名)。在本文中,我将 给你介绍另一种风格 一种称为声明式的编程方法 编程。正确的声明性代码 更容易阅读、理解和理解 维持

作为专业人士,我们应该 努力编写更好的代码 白天如果你看不到代码,你就会 三个月前写了一篇评论文章 观察并注意可能发生的事情 更好的话,你就没有进步和进步 不要挑战自己。我 挑战您编写的代码 通过使用更易于阅读和理解 声明性代码


我认为第二种方法更好,因为它更易于阅读,并且因为第一种方法使用方法复制了
EndsWith的逻辑,这是一种不好的做法。

IMO,在第二个示例中,原始作者的意图更为清晰。首先,读者必须通过提取最后一个索引来评估作者试图完成的任务。这并不难,但需要读者付出更多的努力。

EndsWith可能更安全。但是索引器可能更快

Endswith可能会检查输入字符串是否为空。它们可能都会抛出空引用异常。如果长度为0,索引器将失败


至于可读性,他们都对我说了同样的话,但我已经编程一段时间了。
.EndsWith(…)
在不考虑上下文的情况下可能会更快地理解。

它几乎做了同样的事情。但是,如果endswith参数中有多个字符,则会变得更复杂。但是,第一个示例稍微快一点,因为它不使用实际函数,因此不需要堆栈。您可能需要定义一个宏,该宏可以用来简单地使所有内容一致。

这两种方法都是有效的,但在我看来,endswith方法更容易阅读。它还消除了使用更复杂的表单时可能出现的键入错误等问题。

我认为主要标准应该是哪一项最清楚地说明了开发人员想要做什么。每个样本实际上说了什么

1) 访问小于长度的位置1处的字符,并检查其是否等于字符“r”

2) 检查是否以字符串“r”结尾


我认为这清楚地表明了哪一个是更易于维护的答案。

除非并且直到它不影响程序性能,否则您可以使用任何一种方法。但是添加代码注释对于传达正在完成的工作非常重要。

“编写代码是为了让人阅读,顺便让计算机运行”SICP

EndsWith FTW

善良


Dan

从错误处理的角度来看,EndsWith。

我认为正确的答案实际上是正确的<对于空字符串输入,code>EndsWith
正确地返回
false
,而另一个测试将抛出一个异常,试图使用-1进行索引。

我更喜欢第二个(
EndsWith
)版本。连我的经理都能明白

第二个更好的方法是阅读和阅读。 示例:验证最后2个字符

备选方案1)

备选方案2)


最后三个?最后4条?..

可读性规则,尤其是当它暗示意图时

对于第一个例子,我必须发现意图——这是留给解释的。如果它似乎有一个bug,我怎么知道这不是故意的呢


第二个例子是告诉我意图。我们想找到最终角色。有了这些知识,我可以继续评估实现。

不仅更具可读性,而且更“正确”。 通常,如果提供了一个框架方法来完成这项工作。。。使用它


如果foo==string.Empty怎么办

最佳实践是编写易于阅读的代码。如果使用第一种方法,调试代码的开发人员可能会说,“这个开发人员想做什么?”您需要使用易于解释的方法。如果一个方法太复杂而无法理解,那么可以从中收回几个方法

我肯定会说第二点,易读性简单性是关键


另外,如果“if”语句只有一行,不要麻烦使用大括号,使用一个缩进。记住,在经典C语言中,“string”和字符数组之间的唯一区别是终止空字符“\0”,因此我们必须更积极地相应地处理它们,并确保没有从数组的末尾跑出来。因此,第一段代码的思想过程基于字符数组的概念

第二段代码将思考过程建立在如何更抽象地处理字符串的基础上,而较少考虑其在幕后的实现

因此,简而言之,如果您正在谈论将字符处理作为项目背后的主要思想,那么就开始第一部分。如果你说的是为更大的东西准备一根弦,那不一定需要关注力学
if (foo[foo.Length - 1] == 'r' && foo[foo.Length - 2] == 'a')
{

}
if (foo.EndsWith("ar"))
{

}