4

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

4

19 回答 19

12

经验。

于 2009-09-24T18:35:57.627 回答
6

IMO,一件大事是重要的空白。块缩进有很长的路要走,像 Python 和 F# 这样提供一定程度的重要空白的语言可以帮助提高可读性。

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

于 2009-09-24T18:36:19.530 回答
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;
于 2009-09-24T18:47:20.710 回答
4

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

于 2009-09-24T18:58:44.760 回答
4

通常,使 Python 具有可读性的原因在于它强制进行标准化缩进。这意味着您永远不会被迫怀疑您是在 if 块还是函数中,这一点很清楚。因此,即使是写得不好的代码也变得很明显。

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

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

ActionScript 3 好一点。一般来说,已经采取了让每个人都使用类似语法的举措,而 Adob​​e 甚至已经定义了它的标准并使它们易于访问和通用。由营利性公司支持的 ECMAScript 实现如何优于通用的实现并不需要太多。

于 2009-09-24T18:39:43.503 回答
4

可读性是一个需要大量输入的函数。我不认为真的有可能编译出可能影响语言可读性的完整列表。最通用的描述方式是“最小化认知负荷”。几个主要因素:

  • 微妙的意义。如果两个代码片段乍一看非常相似,但做的事情却不同,这会损害可读性,因为读者必须停下来推断实际发生的事情。
  • 无意义的代码——也就是样板。这并不一定意味着什么都不做的代码,而是没有告诉我任何关于我们实际在做什么的代码。没有表达函数或对象实际意图的每一段代码都会大大降低可读性。
  • 填鸭式的意思——又名高尔夫。这与样板问题相反。到目前为止,可能会压缩代码,以至于读者被迫停下来并逐个字符地检查它。发生这种情况的确切位置有点主观(这也是为什么有些人喜欢 Perl 而有些人讨厌它的部分原因),但这绝对是一个真实的现象。
于 2009-09-24T18:52:00.373 回答
2

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

首先,我不认为人们仅仅根据语法这么说。还有很多其他因素需要考虑,仅举几例:

  1. 事实上,有些语言倾向于只提倡一种正确的方式来做某事(如 Python),而另一些语言则提倡许多不同的方式(例如 Ruby,据我所知 [免责声明:我不是 Ruby 程序员])
  2. 该语言拥有的库。更好的设计往往非常容易理解,不需要文档,这也有助于记忆。因此,具有良好库的语言将使事情变得更容易。

话虽如此,我个人对 Python 的看法是,许多人称它为“可执行伪代码”。它支持各种倾向于出现在伪代码中的事物,并且作为扩展,是思考事物的标准方式。

此外,Python 的非 C 类语法,这是许多人不喜欢它的特性之一,也使 Python 看起来更像伪代码。

好吧,这就是我对 Python 可读性的看法。

于 2009-09-24T18:42:00.363 回答
2

老实说,当谈到使语言可读的原因时,它似乎真的归结为简单性和个人偏好的结合。(当然——如果你足够努力的话,总是有可能用任何语言编写不可读的代码)。由于无法真正控制个人偏好,因此它归结为易于表达 - 在语言中使用简单功能越复杂,从可读性的角度来看,该语言可能越难。

于 2009-09-24T18:45:06.657 回答
1

当一个字符就足够时需要一个词——帕斯卡和VB花园里的一块石头。

相比:

Block ()
Begin
  // Content
End

对比

Block
{
  // Content
}

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

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

于 2009-09-24T18:34:43.433 回答
1

恕我直言,计算机语言越像口语,它的可读性就越高。举个极端的例子,比如 J 或 Whitespace 或 Brainfuck 之类的语言……对于未经训练的眼睛来说完全无法阅读。

但是类似于英语的语言更容易被理解。并不是说这使它成为最好的语言,正如 COBOL 可以证明的那样。

于 2009-09-24T18:43:16.223 回答
1

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

于 2009-09-24T18:43:48.283 回答
1

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

  1. 阅读语言语法的能力。
  2. 格式良好的代码。
  3. 有意义命名的变量和函数
  4. 注释解释复杂的处理。注意,过多的注释会使代码难以阅读
  5. 短函数比长函数更容易阅读。

这些都与语言无关,这完全与编码人员和他们的工作质量有关。

于 2009-09-24T18:44:38.283 回答
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) { ... }

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

于 2009-09-24T18:58:57.473 回答
0

读者的识字水平。

于 2009-09-24T19:01:21.710 回答
0

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

  1. 禁止跳跃。C 语言中的goto语句就是一个典型的例子。不会不断用完结构化块的代码更容易阅读。
  2. 尽量减少副作用。全局变量是邪恶的,记得吗?
  3. 使用更量身定制的功能。您的头部如何跟踪具有 5 个迭代变量的for循环?Common Lisp循环更容易阅读(虽然很难写,但那是另一回事)
  4. 词法闭包。您可以通过查看变量来确定变量的值,而不是在脑海中运行代码,然后找出哪个语句在影响哪个语句。

几个例子:

(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]]
于 2009-09-24T19:11:26.593 回答
0

我会尝试说代码因其简单性而可读。

你必须第一眼看到它的作用和目的是什么。当只有少数人完成所需的工作时,为什么还要编写一千行代码?

例如,这就是像 F# 这样的函数式语言的精神。

于 2009-09-24T18:37:15.520 回答
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"
}
于 2009-09-24T18:37:24.447 回答
0

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

于 2009-09-24T18:39:36.013 回答
0

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

于 2009-09-24T18:40:22.830 回答