有一种语言可以鼓励好的编程实践吗?

14

虽然我喜欢PHP,但我认为它最大的弱点是它允许甚至几乎鼓励程序员编写糟糕的代码。

有没有一种语言可以鼓励好的编程实践?或者更具体地说,有没有一种与Web相关的语言可以鼓励好的实践。

我对那些既有鼓励良好编程目标声明的语言,或者是以鼓励良好编程方式设计的语言感兴趣。


12
只想说一下,为什么这被标记为PHP?PHP可能是最不注重良好实践的语言。 - Brendan Long
如果有必要的话,这可能应该是一个维基。 - Tor Valamo
我不同意。我正在寻找特定的编程语言或语言列表,这些语言积极鼓励良好的编程实践。也就是说,这是该语言的一个明确目标。也许我应该更新问题以提供这样的澄清? - Darrell Brogdon
1
@Darrell - "好的实践"的定义对于这个问题来说太主观了,无法有一个明确的答案。 - Tor Valamo
5
“好的实践”的定义是主观的吗?这解释了我看到的那么多代码……” - Chuck
显示剩余3条评论
25个回答

22

我认为Python有一些关于良好编码实践的想法。至少程序被迫看起来相同。

但不要忘记Larry Wall说过:

真正的程序员可以使用任何语言编写汇编代码

您最好考虑创建一个编码风格约定。


没错,但是有“Pythonic”的方式来做事情,也有其他的方法来做事情,所以不总是这种情况。 - Finglas
8
我的意见是:尽管 Python(像大多数动态语言一样)有强制执行的(通常是表面上的)视觉风格,但编写不易维护的代码非常容易。语言本身并不鼓励遵循良好的实践。如果说有什么的话,编写良好的动态语言代码需要更多的纪律性。 - Steve S
@Steve S:这并不是我使用Common Lisp的经验,它是一种动态语言(无论如何都是动态类型 - 我不知道什么是“动态语言”)。我确实同意在Python中编写难以维护的代码非常容易。就像我见过的每一种编程语言一样。 - David Thornley
“动态语言”是故意模糊的。;-) 我想表达的是:在Python(例如)中,其他语言可以在编译时通过静态分析检测到的错误,最多只能在运行时产生错误(可能在很少被执行的代码路径上)。程序员通常通过遵循非强制性的约定并在偏离这些约定时格外小心来进行补偿。 - Steve S
嗯...我的前面的评论听起来相当苛刻和戏剧化。我并不是想说Python是一种糟糕的语言(实际上我很喜欢它)。我只是认为鼓励更安全的编程不是它的强项之一。 - Steve S

15

这太主观了。如果你所谓的“好的编程实践”是指一致的缩进,那么Python当然适合。但是大多数程序员在第一次编写程序时就会学习缩进。我认为良好的编程远不止于此。

多年来,“好的编程实践”的理念已经发生了变化。除了缩进之外,Python并没有在任何一个领域表现出色。它不是最面向对象的语言,也没有(至少目前)完全支持函数式编程。

以下是一些可能的好的编程实践定义以及代表性语言:

- 纯面向对象设计: SmallTalk是第一个真正的OO语言,并在某些方面仍然是最纯粹的。几乎所有东西都是类。

- 实用的面向对象设计: Java虽然有很多批评者,但在鼓励好的编程实践方面迈出了巨大的步伐。它是强类型的,几乎所有东西都是类,还需要自说明的类设计(通过明确列出所抛出的异常、默认将函数设置为私有等方式)。Java强制执行对大型开发团队有价值的纪律。

- 函数式编程 Haskell通常被誉为最纯粹的函数式语言。赋值是被禁止的,除非你的函数明确要求它们,否则副作用是不可能的。

- 强大的并发性 Erlang(另一种鼓励函数式编程范例的语言)以在并发环境下的强大稳健性而闻名。我个人没有研究或使用过它,但其记录似乎令人印象深刻。

- 迭代开发 有很多Lisp信奉者。他们不能都错了吧?

- 快速且脏 有时您只需要快速完成一个脚本。谢谢Perl。;)


14

嗯,这取决于您认为什么是Web语言。Smalltalk绝对鼓励最佳实践,并且甚至有一个用它编写的疯狂的Web框架(Seaside)。它非常不同,但你仍然可以做坏事情。你只是被鼓励采取不同的方式。

Eiffel的重点是通过契约进行设计。它是一种巧妙的组织要求,促进了测试和断言。

Python很棒,但它并不真正鼓励良好的实践。嗯,如果缩进是最佳实践,那么Python绝对会强制执行它。

其他语言并没有像PHP那样鼓励你做坏事。你也可以在PHP中编写出优秀(和正确)的代码。人们经常忘记你可以禁用解释器中的许多问题(全局变量,斜线等)。你不必因为PHP仅仅引诱你走向黑暗而离开。


1
艾菲尔语言很不错,但它永远不会流行起来。为什么?A:购买它需要花费成本,B:购买它的成本太高了。我会坚持使用C#,谢谢。 - RCIX
Cobra具有设计契约,并且是Python的派生语言。请参见http://msdn.microsoft.com/en-us/magazine/dd882513.aspx。 - Sarah Vessels
2
一定是Smalltalk上的Seaside。 - Stephan Eggermont
我忘记了 Haskell 和 Erlang!如果你在编程中更注重数学,那么这些语言非常棒。OCaml 也是如此。而且,是的,你完全可以用它们来编写 Web 应用程序。即使 Lisp 也有一个很棒的 Web 框架。 - pestilence669
编程语言是否应该负责确保最佳实践,将这个概念融入到语言中的成本是多少? - Rimian
在某种程度上,一个很好的例子就是对函数的本地支持。当然,你总是可以使用 gosub 20583jmp eax,但这样容易出错。 - pestilence669

11

没有银弹。技术不会让你成为更好的程序员。


6

PASCAL是一种鼓励良好编程实践的编程语言之一。


1
Delphi确实可以做Web开发(编译型语言)。 - pestilence669
1
我使用时并非如此。可能有一些实现鼓励良好的编程实践,但是Niklaus Wirth的版本不是其中之一。 - David Thornley
2
为什么?你的陈述可以适用于任何编程语言。 - Dario

6
简短的回答?不行。但是这个问题使用了不适合计算机编程的英语概念。"encourage"是什么意思?"good programming practice"是什么?语法高亮和自动缩进?任何语言都可以做到。Lint-style警告?并不是很难。风格约束?如果这是标准,我们必须承认C语言。
良好的编程实践源于良好的设计。如果设计干净简单,聪明的程序员很难编写出糟糕的代码,无论使用哪种语言。反之,糟糕的设计会导致糟糕的实践。棘手的部分在于确定一个设计何时停止优秀并开始变得糟糕。这是软件设计中的第一问题,可惜没有银弹。一旦在应用程序中实现了多个设计模式,它们看起来就不那么美观了。

4
这很主观,但我认为是Python。易读性很重要,只有一种方法来做事情使语言非常易于使用。
框架也可以强化良好的实践。Python的Django框架基于"MTV"模式,使得代码非常友好。

1
我认为你指的是MVC模式。 - tstenner
1
也许他是在说Python很棒! - Chuck
6
MTV在Django中代表模型-模板-视图,正如MTV所说。详情请参考http://www.djangobook.com/en/1.0/chapter05/。 - Todd
1
tstenner、John W和Chuck,Django使用MTV模式,而不是MVC。http://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names - Dan Lorenc
1
嗯,它使用MVC并错误地标记它。“视图不是关于数据外观的。”是的,确实是这样 - 这就是为什么它被称为视图 - Chuck

4
我认为你需要的不是鼓励最佳实践的编程语言,而是具有明确观点的Web开发框架。
例如,Ruby on Rails非常有见地,“开箱即用”地显示出该框架与您如何交互的强烈指示 - 它会自动创建项目结构,并甚至提供一些初始单元测试。测试是Rails开发的重要组成部分,您将找到许多支持BDD、TDD和其他好的“敏捷”开发实践的资源。
其他框架,如Django(Python)和Seaside(Smalltalk),可能有自己的惯例,尽管我个人不太熟悉它们。

4
我将吸引争议并建议使用Perl。
你可能会问:“什么鬼?” Perl被认为是一种只能写不能读的语言。如果只是把它当做超级shell语言使用,那确实如此。但任何语言都可以写出糟糕的代码。Perl给了你巨大的自由和灵活性。因此,在Perl中,逻辑上你有更多的自由去写更糟糕的代码。
这种自由和灵活性也可以用于提高代码可读性和可维护性。
但是,如何学习编写好的代码而不是糟糕的代码呢?过去的答案是“经验和社区参与”。近年来,一些新的工具和资源也加入了帮助的行列。
  • 经验

    • 如果你写了一个烂代码并且需要维护它,你将从这个经验中学到东西。
    • 很好。如何避免一开始就写出烂代码呢?
  • 社区

    • Perl不是通过强制规则来实现语言的,而是有文化规范来帮助改进代码。
    • 在perlmonks上发布没有strict和warnings的代码,你会听到为什么应该使用它们的原因。
    • 太好了,那么要做好工作,我需要花数小时阅读网站和新闻组吗?嗯,你现在在这里。但这仍然是一个次优解决方案。
  • 工具:这就是我们的重点 -

    • 几年前, Perl最佳实践被出版。它将Perl社区许多领袖的想法进行了编码和收集。它提供了对每个256个建议实践背后推理的详细讨论。它提供了实践和思考编程实践的方法。
    • perltidy是一个很棒的用于Perl的重新格式化工具,可以通过自动执行格式化样式来促进代码的可读性。
    • Perl :: Critic和支持模块提供了一个高度可配置的Perl代码分析系统。PC远远超出了基本的lint,甚至为每个问题找到 Perl最佳实践中的特定页面,让您可以改进您的代码,超越语法检查五个级别。
    • 单元测试是Perl文化中普遍存在的一部分。Perl作为5.10发行版的一部分提供了出色的单元测试工具。其他测试工具也可以从CPAN获得。
    • Moose是Perl 5的新对象系统。它受Perl 6对象系统的启发。Moose提供了高级面向对象的功能,如角色和特征。角色和特征提供了强大的处理代码组合和重用的新方法,超出了继承、接口和混合所能实现的范围。继承模型是“IS A”关系。角色和特征模型“DOES”。我再次强调这是多么有用。

3

任何语言都可以遵循良好的实践。

然而,任何语言也可以执行不良实践。


3
同意,但这并没有真正回答问题。 - Darrell Brogdon
2
这是因为没有答案。我不是说这听起来像《黑客帝国》里的情节,但实际上确实如此,在我看来是这样的。 - Finglas
2
错误的,Python 的设计者确实对语言的本质做出了决策,特别是为了鼓励良好的编码习惯。没有一种语言需要某人遵循这样的鼓励,但如果一个人遵循 Python 的设计理念,那么良好的习惯就会得到加强。 - Todd
2
并不是这样。仅仅拥有一致的缩进并不是好的实践。你可能会看到使用了糟糕实践、有着不好的变量名、异常处理等问题的Python示例... - Finglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接