虽然我喜欢PHP,但我发现它最大的弱点是它允许甚至几乎鼓励程序员编写错误的代码。
是否有一种鼓励良好编程习惯的语言?或者,更具体地说,是一种鼓励良好实践的网络相关语言。
我对那些既有鼓励优秀编程的既定目标,也是为鼓励优秀编程而设计的语言感兴趣。
答案 0 :(得分:21)
答案 1 :(得分:15)
这太主观了。如果通过“良好的编程实践”,你的意思是一致的缩进,那么肯定,Python适用于此。但缩进是大多数程序员在第一次编写程序时学习的东西。我认为良好的编程远不止于此。
多年来,什么是良好的编程实践的想法已经改变。 Python,除了缩进之外,在任何一个类别中并不是真正优秀。它不是最面向对象的语言,也不是(还)提供对函数式编程的完全支持。
以下是良好编程实践的一些可能定义,以及每种编程实践的代表性语言:
- 纯面向对象设计: SmallTalk是第一个真正的OO语言,在某些方面仍然是最纯粹的。从字面上看,一切都是一个阶级。
- 务实的面向对象设计: 对于所有批评者而言,Java在鼓励良好的编程实践方面向前迈出了一大步。它是强类型的,几乎所有东西都是一个类,它需要自我记录类设计,在一定程度上(通过显式列出抛出的异常,默认情况下使函数私有等).Java强制执行对大型开发团队有价值的规则
- 功能编程 Haskell经常被认为是最纯粹的功能性语言。赋值是禁止的,除非你的函数明确要求它们,否则副作用是不可能的。
- 强大的并发性 Erlang(另一种鼓励函数式编程范式的语言)因其在并发环境中的健壮性而闻名。从来没有学习或使用它,我不能亲自担保,但它的跟踪记录似乎令人印象深刻。
- 迭代开发 那里有很多Lisp evangelists。他们不可能都错了,可以吗?
- 快速'肮脏 有时您只需要快速完成脚本。谢谢,Perl。 ;)
答案 2 :(得分:14)
嗯,这取决于您认为的网络语言。 Smalltalk绝对鼓励最佳实践,甚至还有一个疯狂的Web框架(Seaside)。这是非常不同的,你仍然可以做坏事。你只是鼓励你这样做。
Eiffel最重要的是Design By Contract。这是一个非常好的组织要求,鼓励各地的测试和断言。
Python很棒,但它并没有真正鼓励良好实践。好吧,如果缩进是最佳实践,那么Python肯定会强制执行它。
其他语言并不真的鼓励你做像PHP这样的坏事。您还可以在PHP中编写出色的(适当的)代码。人们经常忘记你可以在解释器(全局,斜杠等)中禁用大部分的肮脏。你不需要跳船只是因为PHP只会让你陷入黑暗的一面。
答案 3 :(得分:11)
No Silver Bullet 。技术不会成为你的更好的程序员。
答案 4 :(得分:6)
简短回答?不。但这个问题使用了不适合计算机编程的英语思想。 “鼓励”是什么意思?什么是“良好的编程习惯”?语法高亮显示和自动缩进?当然,任何语言都可以做到这一点。皮棉式警告?不是很难。风格治安?好吧,如果这是标准,我们不得不承认C.
良好的编程实践源于良好的设计。如果设计干净简单,那么聪明的编码人员很难用任何语言编写错误的代码。相反,糟糕的做法来自糟糕的设计。棘手的部分是设计停止良好并开始变坏的地方。这是软件设计中的第一个问题,遗憾的是没有银弹。一旦你在你的应用程序中实现了其中几个,那些可爱的设计模式开始看起来非常难看。
答案 5 :(得分:6)
PASCAL 是鼓励良好编程实践的编程语言之一
答案 6 :(得分:4)
我会吸引火焰并建议Perl。
“WTF?你可以说。 Perl作为一种只写语言而闻名。当它掌握在仅仅是超级壳语言的人手中时。你可以用任何语言写垃圾。 Perl为您提供了巨大的自由和灵活性。所以,在Perl中,从逻辑上讲,你可以更自由地编写更糟糕的废话。
自由度和灵活性也可用于可读性和可维护性的原因。
但是你如何学会制作好的代码而不是废话呢?在过去,答案是“经验和社区参与”。在过去的几年里,一些新的工具和资源也得到了帮助。
体验
社区
工具:这是我们点击paydirt的地方 -
答案 7 :(得分:4)
我认为你真正想要的不是一种鼓励最佳实践的编程语言,而是一种固执己见的Web开发框架。
例如,Ruby on Rails非常自以为是,“开箱即用”为您提供了框架期望您如何与之交互的强烈指示 - 它自动创建项目结构,甚至提供一些初始单元测试。测试是rails开发中不可或缺的一部分,您将找到大量资源来支持BDD,TDD和其他良好的“敏捷”开发实践。其他框架如Django(python)和Seaside(smalltalk)可能都有自己的约定,但我并不熟悉它们。
答案 8 :(得分:4)
这是非常主观的,但我不得不说Python。可读性很重要,只有一种方法可以使语言非常容易使用。
框架还可以强化良好实践。 Python的Django框架基于“MTV”模式,适合非常友好的代码。
答案 9 :(得分:3)
至于编写“坏”代码......你必须学会不要这样做;)
至于编写“样式良好”的代码 - 获取Visual Studio,ReSharper插件和StyleCop的副本。 Intellisense和autoformatting(Visual Studio)将帮助您很好地解决问题,ReSharper插件会将您的代码重组为“首选”结构,StyleCop将帮助您遵循标准。
答案 10 :(得分:3)
您可以遵循任何语言的良好做法。
然而,你也可以用任何语言进行不良做法。
答案 11 :(得分:3)
如果我正确地阅读了这个问题,你正在寻找的是一种语言,其中“简单”的事情和“最佳实践”的事情是紧密协调的。
如果是这样的话,那么“最佳做法是什么?”必须从那开始:)
作为一个有点奇怪的建议,我可以建议LISP还是Scheme?
答案 12 :(得分:3)
Haskell中。
答案 13 :(得分:2)
我无法相信没有人提到过Objective-C / Cocoa。你总是被鼓励遵循MVC模式,宽松的打字允许一些严重脱离的OO设计。
答案 14 :(得分:2)
您可能需要阅读the seaside book以获取有关如何干燥网络应用的一些想法。 消除模板,随后为html和javascript框架构建DSL(ao jQuery,Scriptaculous,Prototype,RaphaelJs)甚至css(Phantasia,不在基础发行版中),结合OODB for persistence(Gemstone)提供了很多为什么php,java,ruby或c#中的当前最新技术状态更糟糕?
答案 15 :(得分:2)
你为什么问?在我处理了一些讨厌的代码毛球之后,问题似乎出现了很多。我花了好几个小时来分开通过约6个子程序级别的意大利面条逻辑。最后追踪琐碎的错误。我的第一个想法是为什么这不容易?
代码是为计算机编写的 - 而不是人类。它针对机器进行了优化。机器需要准确的说明。在这个细节层面,任何代码库的复杂性都会迅速提升。而这种复杂性通常会推动这个问题。
编程语言无意控制复杂性。编程工具可以帮助您实现这一目标。 如何编写代码比使用以何种语言编写代码更为重要。
看看literate programming。它通过组织控制复杂性。我个人喜欢Leo编辑提供的视觉结构。
答案 16 :(得分:1)
当然,这取决于人们的想法和良好做法"。不同的语言通常会尝试强制/鼓励他们自己对什么是良好的编码习惯和#34;。
的看法。一些语言试图鼓励的良好做法的一些例子是:
在逻辑级别缩进代码:
如果有1个练习,几乎所有程序员都同意这是一个好习惯,那么不同的代码块应该缩进。
例如,请考虑以下Java代码:
static boolean isPrime(final int x) {
if (x % 2 == 0 && x != 2) {
return false;
} else if (x > 1) {
final int MIDWAY = (x-1) / 2;
for (int i = MIDWAY; i > 1; i--) {
if (x % i == 0) {
return false;
}
}
return true;
}
return false;
}
在不同范围内缩进代码(例如函数体,for
块,if
块),这被认为是最佳做法。但是,您不必在大多数语言中以一致的方式(甚至根本不能)缩进代码。没有什么能阻止我在没有缩进的情况下编写整个内容,就像这样:
static boolean isPrime(final int x) {
if (x % 2 == 0 && x != 2) {
return false;
} else if (x > 1) {
final int MIDWAY = (x-1) / 2;
for (int i = MIDWAY; i > 1; i--) {
if (x % i == 0) {
return false;
}
}
return true;
}
return false;
}
如果你愿意的话,你甚至可以把整件事写在一行!代码仍然有效,但它的可读性会低得多。
但是,使用越位规则语法的语言(例如Python,Nim)强迫您以一致的方式缩进代码。例如,以下Python代码:
def is_prime(x):
if x % 2 == 0 and x != 2:
return False
elif x > 1:
MIDWAY = int((x-1) / 2)
for i in range(MIDWAY, 1, -1):
if x % i == 0:
return False
return True
return False
要缩进。如果它不是,它就不会运行。它不可能。我无法在没有缩进的情况下编写此代码,因为块是通过缩进确定的(而不是{}
,这是大多数语言使用的。)
好的,Python确实可以让你在缩进时变得更加灵活。 1-liners可以在同一行上,如下所示:
def is_prime(x):
if x % 2 == 0 and x != 2: return False # This is allowed.
elif x > 1:
MIDWAY = int((x-1) / 2)
for i in range(MIDWAY, 1, -1):
if x % i == 0: return False # So is this
return True
return False
但这只适用于1-liners。包含多个语句的块(例如elif
块)无法在一行上完成。
命名常量LIKE_THIS:
常见的编码约定是命名常量CAPITALISED_WITH_UNDERSCORES。这只是让你(和其他程序员)一眼就能看出常数变量的正常变量。
现在Ruby没有用户定义的常量( sob ),但他们有类似的东西:如果你试图改变一个名为LIKE_THIS的变量,Ruby会给你一个警告。 E.g。
my_var = 5 # creating a normal variable
my_var = 42 # this is ok
puts my_var
ANOTHER_VAR = 21 # creating a pseudo-constant
ANOTHER_VAR = 32 # interpreter will complain about this
puts ANOTHER_VAR # Will still work though
此代码的输出为:
42
test.rb:5: warning: already initialized constant ANOTHER_VAR
test.rb:4: warning: previous definition of ANOTHER_VAR was here
32
通过这种方式,Ruby鼓励(但不强迫)您遵循使用UPPERCASE_WITH_UNDERSCORES命名常量的最佳实践。
在变量上使用常量:
通常情况下,如果您创建一个仅分配给一次的变量(可能只是为了保留一个中间值,或者您只是不需要重新分配它),那么该变量应该是可能是一个常量(例如上面Java代码中的MIDWAY
var;如果我不打算重新赋值给它,为什么不通过使它成为常量而将该意图显式给其他人?)。 / p>
在Rust中,默认情况下变量是不可变的(即常量),除非您另外指定(这与Java和C ++的作用相反)。示例Rust代码:
let x = 42; // declaring an immutable variable
x = 10; // compiler will give an error; can't reassign to x.
let mut y = 42; // declaring a mutable (i.e. "normal") variable
y = 10; // allowed
从这个意义上讲,Rust鼓励你默认使用常量,并真正考虑它们何时应该是变量(而在大多数其他语言中,你默认使用变量,很少考虑它们何时应该是常量)。
注意:技术上不可变的变量与Rust中的常量不同(Rust实际上有常量,用const
关键字声明,但这些常量在编译时评估 - 时间)。但是因为它们在其他语言中就像常量一样,为了这篇文章的目的,我将它们称为常量。
除此之外,大多数语言都不鼓励你积极使用良好做法,因为他们会劝阻(或者直接阻止)你使用"坏"实践。
例如,常识认为使用goto
是不好的做法,因此大多数语言甚至没有goto
(C& C ++除外)!
从这里可以看出,对于哪些功能被认为是如此糟糕(在鼓励"不良实践和#34;)方面的意见往往不同,他们不值得拥有。例如,在循环中过度使用break
和continue
被认为是不好的做法(出于与goto
类似的原因),因此Scala甚至没有break
或者continue
(好吧,至少没有内置于该语言中)! Go的设计者认为异常处理往往被滥用(即诱惑程序员编写复杂的代码并将太多普通错误视为"特殊"),因此Go甚至没有异常处理!许多语言认为代码滥用++
和--
运算符是棘手和模糊的,因此他们只是没有完全拥有这些运算符(Rust,Python,Swift 4等)。请注意,对于什么是好的和坏的做法,没有那么多的共识。
所以,你可以去一些语言(可能会在将来添加它),尝试以某种方式鼓励良好的编码实践(或至少他们认为是良好的编码实践)。
答案 17 :(得分:1)
我会把C#扔到那里。它鼓励良好的技术,可读的代码,并提供工具,以确保您的评论有用和目标。
他们还提供开箱即用的静态分析工具,以确保代码良好。
答案 18 :(得分:1)
我认为一个不经常谈论的语言/框架的一个方面是围绕它的社区。
我认为Rails在鼓励更好的实践方面做得很好,而不仅仅是技术本身 - 这非常注重良好实践,例如。在生成脚手架时创建单元测试,但在社区中鼓励最佳实践等
答案 19 :(得分:1)
汇编程序符合“一种语言,其中不好的事情要么主动劝阻或者只是彻底困难” - 在运行时使程序段错误相当令人沮丧,并且在汇编程序中编写结构糟糕的Web软件将是完全困难的。
答案 20 :(得分:1)
编码实践是语言的外部。你可以用任何语言来破解源代码,这是一种好的做法是主观的。
例如,在函数级别的C#中,您可以使用var声明任何变量,并且编译器将强制执行类型安全,但是许多人不喜欢var并且认为它有助于使代码更难以解密。我个人喜欢var,特别是右边提到的类型:
E.g。
var firstName = new string();
比我更好......
string firstName = new string();
...因为当我知道它是基于右手实例化的字符串时,为什么我需要说字符串firstName?当然,这又是主观的。
标准和使用代码分析工具以及代码审查确实可以产生重大影响。
以下是一份优秀的分析工具清单: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
答案 21 :(得分:1)
是的,Python。它的许多设计目标都是为了鼓励良好的编码实践。阅读Python教程和Python的Zen(在Python提示符下键入“import this”)。
答案 22 :(得分:1)
答案 23 :(得分:1)
要清楚您可以用任何语言编写错误的代码
无论如何,C#非常适合遵循良好的编码习惯
答案 24 :(得分:0)
Boo语言的原因与Python相同。
也许我有点偏颇......?