题
语言快捷方式通常可以用来使代码更简洁。
例如,三元和无效的合并操作员可以减少代码量,但可以说是损害可读性:
在C#:
Person newGuy = new Person();
if (boss == null) {
newGuy.Boss = GetDefaultBoss();
} else {
newGuy.Boss = boss;
}
在功能上等同于:
Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();
但是显然还有更多的详细信息。
在简洁性与可读性方面,您在哪里划清界限?
解决方案
两个都。
您的第一个示例当然是更详细的,可以说是更明确的……但这也需要我扫描五行而不是一行。更糟糕的是,它指出其目的 - 将价值分配给 newGuy.Boss
.
如果我不熟悉无效的合并操作员,您的第二个例子可能会花我一秒钟,但是毫无疑问,如果我通过更大的例行程序进行扫描,以寻找价值来源,它将让我更容易挑选它。
现在,对比了:
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");
后一个示例再次缩短了很多,但是现在它通过制作由同一测试触发的任务而掩盖了其目的似乎是不同的。在这里,我觉得前者的冗长是有道理的。
其他提示
虽然两者都是好的目标,但我将永远支持 可读性 当被迫选择一个。
我认为您的示例可以提高两个可读性 和 简洁。但是,请考虑:
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();
后者是简洁的,但很难阅读。前者是冗长的,但逻辑流很明显。
最终,除了能够在屏幕上更适合的能力之外,简洁没有太大的目的。可读性使调试变得更容易,因此通常应该优选。
我会说,作为一般规则,我永远不会因为简洁而牺牲可读性,但切勿根据另一个程序员缺乏对该主题的知识来判断可读性。
简洁和可读性不是对立的。像这样的答案,有时较短更可读性。
我会说我更喜欢可读性,尽管有时意味着使用简洁的代码。 (即,在较大的条件块内部相对简单的条件。)
基本上,如果不必要地理解,请不要这样做。
可读性首先是与简洁相冲突的地方,因为代码的修改频率比最初编写的更频繁。另一方面:
句法噪声和样板代码通常会掩盖意图,从而损害可读性。有时,更简洁的代码也更可读。例如,请考虑lambda函数或委托/一流函数与实现单方法接口的单方法类。
应根据了解该语言及其独特/高级功能的合理程序员阅读代码的阅读方式,对可读性进行评估,而不是只知道最低的共同点词,而不是一些几乎没有能力的代码猴子。
我尚未提及的一个方面:什么是 您的 目标?
如果您只关心工作安全,请继续对其他一切进行简洁和紧凑。也跳过评论您的代码。
如果您想在进行一个很酷的新项目时轻松地将代码轻松地交给其他人,请继续使用可读性,清晰度和许多可靠的评论。
注意:以上与您个人无关,@damovisa;这是针对两个职位之间选择的任何人。
详细版本具有一件事是一种优势。
它有更多的行,大多数调试者是 面向线呢很难在表达式中间设置一个断点,但是将其设置在块语句中通常很简单。
换句话说,如果您想让调试器开始时,您想在编辑器中看到哪一个 boss == null
?
(就是说我喜欢?? - 运营商)
可读性应该首先出现,长期大多数人花费大部分时间修改或扩展现有代码 - 可读性是可维护性的很大一部分。
就是说,简洁是可以有助于可读性的东西。例如,在您的问题中,第二片片段既可以阅读,又更简洁。