使用空格与{}来表示范围的语言的优缺点是什么?[关闭]


17

在使用空白还是使用括号之类的标记来表示范围方面似乎存在冲突。我已经看到许多人赞扬python对不一致的缩进问题的解决方案,但是许多人不同意:

任何将空格作为标记的语言都必​​须消失。

稍后在相同答案上发布:

直到我真正尝试过为止,我还是有点像反空格一样。我的个人空白布局几乎与python-land中的每个人所使用的布局相匹配可能会有所帮助。也许是因为我有点简约,但是如果您要缩进,为什么还要打扰{}?

我可以从两边看到一些明确的论点:

使用空格:

  • 帮助减少代码中不一致的缩进
  • 通过将可见标记替换为空白以达到相同目的来清除屏幕

使用令牌:

  • 将代码剪切和粘贴到不同级别更加容易(您不必修复缩进)
  • 更一致。一些文本编辑器以不同的方式显示空白。
  • 目前比较流行。

我有什么遗漏的地方吗?你喜欢哪个?与彼此长期合作后,有什么智慧的话吗?


PS。当语言不为每个控件结构使用相同的标记时,我会讨厌它。VB的End Ifand End While语句确实很烦人,大多数其他语言仅对所有内容使用{}。但这也许是另一个问题的话题...


2
我不会说这“更容易剪切和粘贴”。这只是简单一点。
库格尔2010年

1
只要使代码块小而有条理,令牌就真的不重要...顺便说一句,喜欢“圣战”标签,大声笑
Scott

“某些文本编辑器以不同的方式显示空白。”:“当前更受欢迎。”:受欢迎程度通常与构想的质量无关。
乔治

我喜欢空格语法,也喜欢使用CoffeeScript和Haskell进行编码(是的,我知道这很难)。我已经用JavaScript和C编写了很多代码,但我回到了}。但是,当用box div替换Lisp s表达式时,最好是
:)

我认为,如果您必须仅依靠空白,那么很难发现错误。例如:stackoverflow.com/questions/21205836/…OP 的代码和答案之间的唯一区别是多余的空间。使用}来分隔哪些代码位于for循环内,哪些没有,这非常清楚。
AncientElevator9

Answers:


15

我认为我们很多程序员(包括我自己)都有将每个决策“逻辑化”的趋势。很好,但并非每个问题都有一个逻辑答案。例如,我怀疑厨师是否会在Chefoverflow上发布问题(如果存在此类问题),以询问苹果派和樱桃派的优缺点。这是您更喜欢的一个问题。

考虑到这一点,我认为最简单的答案是说“有些人喜欢大括号,有些人喜欢空格”,然后再说。



同样,某些东西的优点可能是另一些优点。
拉里·科尔曼

优点。我个人认为他们一起工作,而且只要方法明确,我就不会抱怨(很多)。
Michael K

8
我不同意你的比喻。有相当客观的理由认为依赖空格的语法会影响程序员的工作效率,即使在喜欢它的程序员中也是如此。这有点像说人们不喜欢氰化物的味道,当每个人都说氰化物有毒时,他们只是在“逻辑化”。不,你有多爱它并不重要,它仍然会杀死你。
Timwi

4
PS:您实际上要寻找的词是合理化的。此外,每个人都有合理化的趋势,而不仅仅是程序员。
Timwi

11

冒着听起来像个疯子的风险,我认为每个声称空白“有助于减少代码中不一致的缩进”的人从未使用过Visual Studio。使用单个命令(我认为默认快捷键是Ctrl + K,D),所有缩进都立即保持一致¹。此外,在粘贴代码时,无需执行任何操作即可立即纠正缩进,并且在编写新代码或将内容包装在一个if或另一个其他块中时,也是如此(重新}键入时会发生格式化)。此外,在完成一条语句后按Enter键始终会将光标置于下一条语句的正确缩进级别,即使前一条语句由于if或类似内容,这使得很难意外地认为某条陈述if不在某条陈述之下。

我要说的不是 Visual Studio很棒。我要说明的是,IDE可以自动执行缩进修复(以及其他格式问题),但是前提是程序的含义不取决于其格式。这为程序员提供了更多机会专注于实际的编程任务。像Python这样的语法会适得其反:不可能编写可以“修复” Python代码缩进的IDE,因为缩进本身指定了某些语义。


¹ (我知道VS拒绝重新格式化的一种特殊情况,即跨越多行的数组文字,但这并不重要。)


8
Python缩进不需要修复,因为它不会损坏(没有人注意!)。也不可能为C#编写Purify(有助于检测内存泄漏的程序),这并不意味着C ++内存管理是高级的。
dbkk 2010年

2
@Dean:为什么这么多人认为他们需要Resharper做所有事情?您描述的内容已经在没有Resharper的Visual Studio中。
Timwi

2
@dbkk:if在任何地方添加一行后,您的缩进就会中断。然后,您必须继续手动修复缩进。
Timwi

2
您可能没有在缩进是惰性,不一致等问题的团队中工作,因此不建议对其进行修复,因为这样会使代码差异变得不可能。
凯文

2
@Kevin:是的,我没有,老实说,我不想。我坚持一口气修复所有问题,这只会导致一个不可读的差异,只会影响无关紧要的空白并修复所有将来的差异。其他任何事情都会适得其反,对项目有害。
Timwi

3

我个人觉得我需要在自己的行上放一个标记来引入空行,以使我意识到代码在另一个范围内。

我讨厌在python中使用它的人:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

而在象征性的土地上,我讨厌人们复制粘贴而不清理压痕

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

请勿在令牌上使用单独的一行

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

我可以阅读所有这三种语言,但是它们不是我期望的那样,我必须花更多的精力来解析它们,并且正如Joel所说的,当事情无法按预期运行时,会让您感到沮丧。


3

Pro:据我所知,在Python世界中没有缩进/弯矩放置的圣战。代表开发人员做出此决定可能节省了一些麻烦。

缺点:匿名功能仅限于一行。听起来还不错,但我经常发现自己lambda在Scheme中写了多行s(多数情况下是馈入mapapply恰好在一个地方,因此单独声明没有任何意义)。


值得一读:每个人都
始终

Python支持多行表达式-只需在行末添加\。
dbkk 2010年

8
公平地说,缺少多行lambda是Python的局限性,而不是一般的空白。用我的空格分隔的语言,如果引入一个lambda并紧缩一个块,则该块将用作lambda主体。
请注意-想起

@注意-好的,是的。Python只是我有经验的唯一用空格分隔的语言。@dbkk,所以您是说lambda n: a = n \\na.sort() \\na[0:3] 不会返回语法错误?使用\技巧可以将单行lambda分布在多行中,但实际行数却不会超过一个。
Inaimathi 2010年

Haskell,CoffeeScript使用空格,但没有单行lambda限制。
aoeu256 '19

3

{}添加冗余。过多的冗余是不好的,很少的冗余是不好的。而且手动输入它是不好的,尤其是。如果很难使用它。

因此,在IDE不好/没有IDE的时候,空白样式可能会稍微好一些。但是使用功能强大的IDE,花括号会更好。


1
我认为您对冗余提出了很好的观点。我一直在思考编译器的解析器恢复(在Clang非常有趣的尝试为代码发布Fix-Its之后),而真正有用的是冗余。因此,我认为没有多余的东西,尽管在完美的世界中是伟大的,但实际上对现实世界的编程是有害的。当通常多余的信息来源不同意时,则可能是打字错误/错误。没有冗余,就不会发现该潜在错误!话虽这么说,我更喜欢没有括号;)
Matthieu M.

Erik Meijer在Haskell视频中使用了“噪音”一词。
user16764 2012年

如果您删除了一个块却忘记了删除}或在相反的情况下错误地删除了{,该怎么办?冗余不利于DRY IMO。
aoeu256 '19

2

我发现空白语言的问题在于多页条件表达式。在第二页的中间添加一行,并在所有混乱的中间间隔一个空格,这可能会大大改变代码的逻辑。而且即使某人的代码“正确”,尝试阅读它也会造成可怕的猜谜游戏。这个“其他”用于哪个“ if”?与计算不可见的空白字符相比,计算括号要容易得多。并且该站点上的发布机制将它们粉碎成一个单独的空间。

IMHO "{{{{{" is more reliable than "     ".

9
如果使用多页条件表达式,则会遇到其他问题。只是不要这样做。实际上,即使使用花括号,代码也变得不可读。这实际上是空格缩进的另一个好处:它可以防止您编写如此糟糕的代码。
康拉德·鲁道夫

1
严重的是,条件多长吗?
温斯顿·埃韦特

2

我认为这不是真正的对抗
Pythoneer经常批评括号程序员,好像他们很容易违反缩进一样,因为这样做可以。
实际上,即使在了解Python及其缩进作用域之前,我始终使用100%一致的缩进。

事实是,大括号语言还可以在编译器中施加正确的缩进,因此我们将两全其美。看到?没有可言。

Pythoneers会争辩说,当缩进是语法的一部分时,花括号是没有用的,但不是,花括号可以提高可读性。我尝试对Python进行编程,这对我来说是一种非常有趣的语言,但是您是否尝试过使用if-elif缩进级别超过2或3的链?他们看起来不再那么整洁了。

PS:我写了花括号,但更一般的说,我的意思是定界符标记。左括号可以看作是多余的,但是一种语言可以像这样(事实上,我敢肯定有些语言就是这样,但我不太了解它们):

if condition:
    statement
    other_statement()
end

PS2:2019年,此答案后的4年。我学习了Python,并完全习惯了它的语义缩进,并且一点也不觉得很难阅读。尤其是在现代IDE的帮助下,这些IDE绘制垂直条以帮助识别缩进块。


我喜欢这种语法,因为这是一个很好的折衷方案,并且避免使用花括号。但这对于单行语句来说是昂贵的,例如,在C中,我们可以完全省去括号:(
Jo So

而不是嵌套的if ... elif,您可以尝试使用字典和/或继续执行,返回,嵌套函数...
aoeu256

@ aoeu256完全不是问题的重点,也不是我的答案。
Petruza
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.