什么使语言可读或不可读?

时间:2009-09-24 18:32:15

标签: syntax language-design whitespace readability

我听说有人说他们可以在一年后理解他们的python代码,但不能理解他们的XYZ代码。为什么?我不知道python语法有什么好处或者对另一个有什么不好。我喜欢C#,但我觉得VB.NET代码更容易阅读。我正在进行语言设计,所以您发现什么使代码/语法/语言可读或不可读?

19 个答案:

答案 0 :(得分:12)

体验。

答案 1 :(得分:6)

IMO,其中一件大事就是重要的白色空间。 Block indention有很长的路要走,像Python和F#这样的语言可以提供一定程度的空白空间,有助于提高可读性。

像Java和C#这样的代码往往是结构化的,可读性成为它开始时编码的焦点,而不是语言本身的编码。

答案 2 :(得分:5)

当代码以明确的“陈述你想做什么”的方式编写时,代码是可读的。 这仅取决于语言中的语言

  • 它允许你表达你想要的东西(功能编程!)
  • 它不强调密码陈述

其余的取决于你用来编写代码的样式(即使Perl也可以理解!),但是某些语言使 hacky 语句变得更容易。

清除:

expr = if not (ConditionA and ConditionB) then  ...  else  ... 

不清楚:

expr = (!(conditionA && conditionB)) ? ... : ...

清除:

foreach line in lines:
    if (line =~ /regex/):
        // code

不清楚:

... if /regex/ foreach(@lines);

清除:

x = length [ x | x <- [1..10], even x ]

不清楚:

int x = 0;
for (int i = 1; i <= 10; ++i)
    if ((i&&1)==0) ++x;

答案 3 :(得分:4)

程序员使代码可读或不可读,而不是语言。否则就是在欺骗自己。这是因为只有有资格判断可读性的人才是那些懂语言的人。对于非程序员来说,所有语言同样都是不可读的。

答案 4 :(得分:4)

可读性是一项需要大量输入的功能。我认为编译可能影响语言可读性的完整列表并不可能。描述它的最常用方法是“最小化认知负荷”。一些主要因素:

  • 意义的微妙之处。如果两个代码片段看起来非常相似,但做了不同的事情,则会损害可读性,因为读者必须停下来并推断出实际发生的事情。
  • 无意义的代码 - 也就是样板文件。这并不一定意味着代码什么都不做,而是代码没有告诉我任何关于我们实际做的事情。没有表达函数或对象的实际意图的每一段代码都会降低可读性。
  • 塞满意义 - 又名高尔夫。这与样板问题相反。到目前为止,压缩代码是可能的,以至于读者被迫停止并逐字逐句地检查它。发生这种情况的确切线条有些主观(这是为什么有些人喜欢Perl而有些人讨厌它的一部分),但这肯定是一个真实的现象。

答案 5 :(得分:4)

通常使Python被认为是可读的是它强制标准化的缩进。这意味着你永远不会被怀疑是否在if块或函数中,它很明显。因此,即使编写得很差的代码也会变得很明显。

我通常认为难以阅读的一种语言是PHP,原因相同(或者更确切地说,相反)。由于程序员可以随意缩进,并将变量存储在任何地方,因此可以非常快速地进行复杂处理。此外,由于PHP历史上没有区分大小写的函数名称(我认为PHP <4.4.7),这意味着核心语言的实现确实没有一致性......(不要让我错了,我喜欢这种语言,但是一个糟糕的程序员真的会弄得一团糟。)

JavaScript对于没有纪律的开发人员也存在很多问题。您会发现自己想知道变量的定义位置以及您所处的范围。代码不会位于一个合并的位置,而是分散在多个文件中,并且经常潜伏在意外的地方。

ActionScript 3更好一点。一般来说,每个人都使用类似的语法,Adobe已经采取行动,以至于定义其标准并使其可访问和通用。看待营利性公司支持的ECMAScript实施优于广义实施,并不需要太多。

答案 6 :(得分:2)

说实话,对于什么使语言可读,它实际上似乎归结为简单和个人偏好的结合。 (当然 - 如果你努力的话,总是可以用任何语言编写不可读的代码)。由于个人偏好无法真正得到控制,因此可以归结为易于表达 - 使用简单功能的语言越复杂,从可读性的角度来看,语言越难以实现。

答案 7 :(得分:2)

  

我听说有人说他们可以在一年后理解他们的python代码,但不能理解他们的XYZ代码。为什么?

首先,我认为人们并不认为仅基于语法。其他因素需要考虑很多,仅举几例:

  1. 事实上,某些语言往往只推广一种正确的方式来做某事(比如Python),而其他语言推动了许多不同的方式(例如Ruby,我听到的内容[免责声明:我不是Ruby程序员])< / LI>
  2. 语言库。设计得更好的设计往往非常容易理解,无需文档,这也有助于记住。因此,具有良好库的语言将使事情变得更容易。
  3. 话虽如此,我个人对Python的看法是很多人称之为“可执行的伪代码”。它支持各种往往出现在伪代码中的东西,作为扩展,是思考事物的标准方法。

    此外,Python的非类C语法,使其如此受到众多人的喜爱,也使Python看起来更像伪代码。

    嗯,这是我对Python可读性的看法。

答案 8 :(得分:1)

恕我直言,计算机语言越像是口语,它就越可读。对于极端的例子,采用J或Whitespace或Brainfuck等语言......对于未经训练的人来说完全不可读。

但是,一种类似英语的语言可以更容易理解。并非这使得它成为最佳语言,正如COBOL可以证明的那样。

答案 9 :(得分:1)

我的一位同事用来说:“你可以用任何语言编写垃圾代码。”我喜欢它,想今天分享。什么使代码可读?这是我的想法

  1. 能够阅读语言的语法。
  2. 格式良好的代码。
  3. 有意义地命名变量和函数
  4. 解释复杂处理的评论。请注意,过多的评论会使代码难以阅读
  5. 简短的功能比长的功能更容易阅读。
  6. 这些都与语言无关,而是关于编码器和工作质量。

答案 10 :(得分:1)

我认为它更多地与编写代码的人而不是实际的语言本身有关。您可以使用任何语言编写非常易读的代码,并使用任何语言编写不可读的代码。即使是复杂的正则表达式也可以进行格式化和注释,以便于阅读。

答案 11 :(得分:1)

当一个角色足够时需要一个词 - Pascal和VB花园里的一块石头。

比较

Block ()
Begin
  // Content
End

VS

Block
{
  // Content
}

它需要额外的大脑处理来阅读单词并在心理上将其与概念相关联,而单个符号会立即被其图像识别。

与自然语言,通常的文本语言与具有象形文字的符号语言(亚洲组)的区别是相同的。第一组的处理速度较慢,因为基本上文本被解析为一组概念,而象形文字则代表概念本身。将它与您已经知道的相比 - XML的序列化/反序列化比二进制格式的自定义搜索更快吗?

答案 12 :(得分:0)

我认为,语言设计(对于普通语言,而不是脑力:)应该不重要。为了使代码可读,您应该遵循标准,代码约定,并且不要忘记重构。

答案 13 :(得分:0)

对于我而言,主要是语言允许您开发更易读的抽象,以防止迷失细节。 这就是OOP在隐藏细节方面非常方便的地方。如果我可以隐藏具有通用概念行为的接口后面的任务的细节(即C ++中的迭代器),我通常不必阅读实现细节。

答案 14 :(得分:0)

这都是干净的代码。

保持小巧,简单,命名和格式化。

class ShoppingCart { 
  def add(item) {
    println "you added some $item"
  }

  def remove(item) {
    println "you just took out the $item"
  }
}

def myCart = new ShoppingCart()

myCart.with {
  add "juice"
  add "milk"
  add "cookies"
  add "eggs"
  remove "cookies"
}

答案 15 :(得分:0)

我会尝试说代码的简单性是可读的。

你必须第一眼看到它的作用和目的是什么。为什么只有少数几行代码需要写一千行代码?

这就是像F#这样的功能语言的精神。

答案 16 :(得分:0)

关于语法,我认为它必须具有相当的描述性。例如,在许多语言中,您有foreach语句,每个语句处理它的方式有点不同。

// PHP
foreach ($array as $variable) ...

// Ruby
array.each{ |variable| ... }

// Python
for variable in array ...

// Java
for (String variable : array)

老实说,我觉得PHP和Python有最清晰的理解方法,但是,这一切都归结为程序员想要的聪明和清晰。例如,一个糟糕的程序员可以编写以下内容:

// PHP
foreach ($user as $_user) ...

我的猜测是你几乎不知道代码在做什么,除非你追踪并试图找出$user是什么以及为什么要迭代它。清晰简洁就是让小块代码变得有意义,而无需追溯程序来找出变量/函数名称。

另外,我必须完全同意空白。标签,换行符和介于两者之间的间距真的会产生巨大的差异!

编辑1:我可能还会插入某些语言的语法和工具,以便更清晰。以Ruby为例:

if [1,2,3].include? variable then ... end

经文,比如Java:

if (variable != 1 || variable != 2 || variable != 3) { ... }

其中一个(恕我直言)肯定比另一个更清晰可读。

答案 17 :(得分:0)

读者的识字水平。

答案 18 :(得分:0)

两个截然不同的方面,真的。首先是语法和空格。 Python强制执行空白标准,删除不必要的{,}和;字符。这使眼睛很容易。其次,最重要的是,表达的清晰度 - 即将代码映射回您的思维方式是多么容易。编程语言中有几个特性(和非特性)有助于后一点:

  1. 禁止跳跃。 C中的 goto 语句是一个典型的例子。不会耗尽结构化块的代码更容易阅读。
  2. 尽量减少副作用。全局变量是邪恶的,还记得吗?
  3. 使用更多定制功能。你的头如何用5个迭代变量跟踪 for 循环? Common Lisp 循环更容易阅读(虽然很难写,但这是一个不同的故事)
  4. 词汇封闭。你可以通过查看变量的值来计算变量的值,而不是在头脑中运行代码,然后找出哪个语句是阴影哪个。
  5. 几个例子:

    (loop
       do for tweet = (master-response-parser (twitter-show-status tweet-id))
       for tweet-id = tweet-id then (gethash in-reply-to tweet)
       while tweet-id
       collecting tweet)
    

    listOfFacs = [x | x <- [1 ..], x == sumOfFacDigits x]
        where sumOfFacDigits x = sum [factorial (x `div` y) | y <- [1 .. 10]]