您喜欢代码中的简洁性还是可读性?[关闭]


21

语言快捷方式通常可用于使代码更简洁。

例如,三元和空合并运算符可以减少代码量,但是可以说会损害可读性:

在C#中:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

在功能上等效于:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

但显然要冗长得多。

简洁性与可读性之间的界限是什么?


3
这是一个主观的问题,实施某事的人会说他的方式有意义,阅读该书的人会说这没有意义,而阅读该书的人会说我明白,但我更喜欢另一种方式。这仅仅是偏好。
克里斯(Chris

20
我认为第二个版本更具可读性。
Vaibhav 2010年

2
您将简洁与简洁混为一谈。简洁可提高可读性。简洁有损于此。
Ferruccio

1
@ThorbjørnRavnAndersen:C#代码的受众通常是“具有C#背景的开发人员”。从我所看到的情况来看,此处对programmers.se的共识似乎是您不应该仅仅因为有人可能不熟悉有用的语言功能而避免使用它们。(另请参阅:programmers.stackexchange.com/q/101513/33843。
Heinzi 2011年

1
重复吗?:programmers.stackexchange.com/q/58630/15464 ..哦,这是旧的。:)
史蒂芬·杰里斯

Answers:


63

都。

您的第一个示例肯定更冗长,并且可以说更明确...但是它还需要我扫描五行而不是一行。更糟糕的是,它没有强调其目的-为分配一个值newGuy.Boss

如果您不熟悉null合并运算符,那么您的第二个示例可能会使我花费一秒钟的时间,但是毫无疑问,它的目的是什么,如果我正在扫描一个更大的例程以寻找值的来源,它将对我来说更容易选择这个。

现在,对比一下:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...具有:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

后一个示例再短一些,但是现在它使通过同一测试触发的任务显得不同,从而掩盖了其目的。在这里,我认为前者的冗长是合理的。


3
很好的答案!-与目的无关,与冗长无关。
Damovisa 2010年

2
@Damovisa:确切地说,代码的目标是交流,没有普遍的理由为什么不应该尽可能简洁地做到这一点(但不能再做更多了)。
Shog9

1
学习null合并运算符将花费一秒钟以上的时间-但是,如果您不知道它,则应该学习它!
Casebash 2010年

2
啊“ ??” 用Java会很好。

即使最后一个示例在代码方面较短,但实际上它的评估是boss3次,而不是冗长的示例中的3次。这就是为什么仅仅为了更短而编写短代码是一个坏主意的另一个原因。我认为简洁性应该是首要目标,无论是可读性/可维护性(对于复杂代码)还是性能(对于内部循环的关键部分等)。换句话说,永远不要纯粹为了简洁而优化-除非您打算通过
1bps

16

虽然这两个都是好目标,但当我不得不选择一个时,我总是站在可读性的一边。

我认为您的示例可以提高可读性简洁性。但是请考虑:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

相对于

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

后者简明扼要,但很难通读。前者很冗长,但逻辑流程很清楚。

归根结底,简洁除了能够在屏幕上显示更多内容之外,并没有什么用。可读性使调试更加容易,因此通常应首选。


11
正确的格式化可以轻松提高第二个示例的可读性。这是不公平的比较。当此格式,我不能肯定它是坏的。
Steven Jeuris 2011年

代码示例不相等:第一个示例丢失了?? whatever.something
约翰·兰贝

11

我要说的是,总的来说,永远不要因为简洁而牺牲可读性,但是永远不要基于其他程序员对此主题缺乏知识来判断可读性。

简洁和可读性并非相反。像这样的答案,有时更短更易读。


4
+1表示不假设其他程序员缺乏知识。在给定的示例中,仅当您不熟悉null合并运算符时,第二个选项的可读性才会降低。我永远不会基于我的同事不知道语言语法的假设来编写代码。即使他们不知道这??是什么意思,但如果我使用它,然后他们学习它,我们都会受益。而且,在msdn.com上键入“ ??运算符”并不困难
Tim Goodman 2010年

4

我会说我更喜欢可读性,尽管有时意味着要使用简洁的代码。(即三元表示较大条件块中相对简单的条件。)

基本上,如果不必要地难以理解,请不要这样做。


3

在与简洁性冲突的地方,可读性是第一位的,因为代码修改的频率比最初编写的要多。另一方面:

  1. 语法噪音和样板代码通常会掩盖意图,从而损害可读性。有时,更简洁的代码也更具可读性。例如,将lambda函数或委托/一流函数与实现单方法接口的单方法类进行比较。

  2. 可读性应该基于一个相当有经验的程序员的易读性来评估,该程序员对语言及其独特/高级功能非常了解,而不是一些只懂最低公分母的能力不足的代码猴子。


2

我还没有提到的一个方面:您的目标是什么?

如果您只关心工作安全,那么除了其他方面,还要保持简洁和紧凑。也跳过注释代码。

如果您希望能够在进行新项目时轻松地将代码交给其他人,请提高可读性,清晰度和大量可靠的注释。

注意:以上与您个人无关,@ Damovisa;适用于在两个职位之间进行选择的任何人。


这听起来像工作保障,但如果您想成为一名程序员,那是在错误的公司工作的保障...;)
Alois Mahdal

2

详细版本有一个优点。

它有更多的行,并且大多数调试器都是面向行的!在表达式中间设置断点是非常困难的,但是将其设置在block语句中通常很简单。

换句话说,如果您希望调试器何时启动,您想在编辑器中看到哪一个boss == null

(那说我喜欢??运算符)


0

可读性应该放在首位,长期以来,大多数人花费大量时间修改或扩展现有代码-可读性是可维护性的重要组成部分。

简而言之,简洁可以提高可读性。例如,在您的问题中,第二个片段更具可读性和简洁性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.