设计语言是否可以强制执行“干净代码”?[关闭]


19

因此,我正在用C ++编写我的第一个项目,似乎需要更多的精力来使代码“干净”,而不仅仅是工作。也就是说,似乎C ++允许编写丑陋但有效的代码。

这让我开始思考,

编程语言可以通过设计强制执行干净的代码吗?已经有这样的语言了吗?

另外,如何将其作为设计原则纳入编程语言开发/理论中?使用什么样的措施?


14
许多语言都尝试过。在我看来,没有人能成功。
Gort Robot

5
不幸的是,因为没有“干净代码”的客观定义,所以这完全基于观点。您可以在我们的聊天室中随意讨论它,我相信在那里的每个人都会有一些意见要分享。
Ixrec

9
不,您可以使用任何语言编写FORTRAN。
whatsisname 2016年

4
您在询问是否有可能对一种语言进行白痴校对。正如他们所说,白痴是有才华的
Gort Robot

2
对于此问题,“干净代码”具有什么特征?您需要定义它,否则任何有任何理由的答案都是有效的。
Theodoros Chatzigiannakis '16

Answers:


20

语言设计对“纯净代码”的主要影响是在语法层面上。具有许多速记和晦涩运算符(Perl / APL)的语言很容易出现“脏”代码,而元素较少的语言(例如Python)会使它们更干净。

但是,语义学是完全不同的动物。无法强制以一种干净的方式使用某种语言的语义,特别是因为作为编译器,您无法知道该语言的用户想要完成的工作。一个强大的工具就是-一个强大的工具,无论好坏。

归根结底,语义比语法更重要。这也是作为维护开发人员最难理解的部分(例如“此代码实际上是什么意思?我知道它的作用是什么……”)。

因此,我想说没有强制执行简洁代码的设计,但是您可以编写具有简洁语义的简单语法,从而使编写起来更加容易。无论好坏,干净的代码主要是开发人员的知识,动力,纪律和技能的问题。


2
我会说类型系统在强制执行正确的语义方面可以走很长的路要走。例如,强类型语言可确保为变量分配适用类型的值。一种使类型便宜又容易的语言鼓励在类型中编码更多的语义。强类型语言使程序员表达了有关类型转换的意图。用样板语言掩盖语义的语言也使推理语义变得更加困难。现在,什么是“干净的”语义尚不清楚。但是我想它与正确的语义有很大的重叠。
恢复莫妮卡

7

语言可以强迫或鼓励程序员解决某些类的错误,这是干净代码定义的一部分。例如,多种语言在解决以下问题方面做得相对不错:

  • 空指针异常。
  • 共享状态错误。
  • 并发问题。
  • 未经检查的异常。

但是,这只会使您陷入困境,因为干净的代码主要是关于人与人之间的交流。编程语言实际上只有一个杠杆可以帮助实现这一点,这就是它们的表达能力。这确实是一个很难定义的术语,但是从根本上来说,好的程序员可以使用更具表现力的语言编写更简洁的代码。他们拥有更多可用的工具,可以轻松表达与其他人进行良好交流的算法。别误会,您可以(几乎)使用任何编程语言编写简洁的代码。只是有些语言使它变得更容易,并且具有更好的相对结果。

但是,您不能仅仅提高表现力,人们会神奇地开始编写更好的代码。对于大多数程序员来说,您给他们更多的旋钮来切换他们的语言,他们不知道如何正确使用它们,因此他们的代码实际上最终会变得更糟。需要纪律和良好的指导才能提高您的代码质量。没有银弹。


6

在某种程度上。根据语言设计者的理想,故意设计了许多语言来鼓励使用某些形式的简洁代码。当然,用任何一种语言编写丑陋且难以理解的代码都是可能的,但是某些语言的确竭力阻止这种行为。

例如,Python强迫您根据语言的语义结构缩进块,而许多其他语言允许您完全随机缩进或根本不缩进。这是一种语言积极倡导某种清洁理想的示例。


3

如果可以量化它,则可以创建一种可以对其进行优化的语言。

虽然我不知道实际上执行“干净代码”策略的任何特定语言,但是在构建中运行的样式警察很常见。

这是独立于语言而又是单独步骤的主要原因在很大程度上取决于优先级。为了使编程人员具有最大的灵活性,以得到最广泛的采用,这是编程语言的最大利益。有太多不同的编程语言和DSL,它们会通过挑剔和对允许输入的内容进行人为限制,从而人为地限制了用户群,这可能会妨碍更广泛的采用。

例如,强迫人们写代码与C#的最大利益无关。

if (condition)
{

代替

if (condition) {

但是可以将样式检查器视为挑剔的,因为这是他们设计的目的。

所以,要回答这个问题

编程语言可以通过设计强制执行干净的代码吗?

重点矿

绝对可以,只要您为“干净代码”的含义提供了明确的定义。

例如,我可以定义“干净的代码”来表示:

  • 行长不超过80个字符
  • 功能由不超过100行组成
  • 缩进必须是两个空格
  • 行花括号必须在行的末尾跟在正好一个空格之前
  • 每行不超过两个运算符

并且您可能不同意其中的一些或全部约定,但最终这些约定是可以量化的,可以通过编程方式强制执行。


1

不,不是您所描述的意思。无法自动检测“丑陋”!

但是,语言设计者可以做一些事情来鼓励编写好的代码(我不想说“干净”,因为有时好的,安全的代码也很长而且很“丑陋”)。例如,Rust语言的设计人员研究了受过训练的C ++程序员倾向于做的事情(例如为堆分配的值赋予一个“所有者”),并使其中某些事情变得更容易。这包括提供类型检查器,您可以使用该类型检查器检查您是否没有犯某些常见错误。

我会说好的语言设计通常是被动的:设计人员会研究好的程序员所做的事情,并尝试使其变得更容易和“更漂亮”。

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.