单行声明和良好实践


11

我最近养成了一个习惯,我知道你们中的许多人可能会不习惯这种习惯,但是最终,这有助于我关注全局代码结构,而不是单个(有时)重复方法的结构:将数字分组单行中的语句,如下所示:

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

相对于

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

在重复性任务中,我通常这样做,以保持整体代码“美观”并帮助我轻松地跟踪程序结构,但是我承认这可能不是一个好习惯。我实际上经常使用它,所以我想知道您对此有何想法。另外,您是否认为任何必须维护我的代码的人都对这种方法有疑问?


5
这可能是一个很好的问题codereview.stackexchange.com

1
如果要维护,我会遇到问题。我要做的第一件事是对“;”进行CTRL + F 并换行。但是,这只是我 :-)。仅当我有理由时,我才喜欢一行,例如使用默认值false初始化一些文本框的启用属性:textBox1.Enabled = textBox2.Enabled = false;
阿伦(Arun)

2
如果您要问编码风格的问题,请指定语言。
卡莱布

3
虽然在给定的示例中可能不会出现断点,但是如果将所有断点放在一行上,该如何在第二个或第三个或...语句上放置断点?
Marjan Venema

1
而且,我习惯了自动格式化(Java),无论如何代码都具有统一的外观。
Kwebble

Answers:


22

我真的认为可读性将对您以及其他任何阅读代码的人都造成极大的影响。当您第一次编写它时,这一切都是有意义的,因为它在您的脑海中活跃。当您扫描代码以查看变量和函数在哪里时,情况就不同了……您破坏了自己扫描自己的代码的能力。这是一个很大的禁忌,如果其他任何人不得不阅读您的代码,也很糟糕。

另外,考虑一下如何阅读代码。它总是自上而下,向下滚动。您的方法与此无关,甚至在代码读取中引入了最丑陋的问题之一。水平滚动。永远不要低估阅读代码的难度。您永远不会水平滚动,也永远不会让人们水平滚动,在几乎任何情况下,这都是极其不自然的。

此外,如果您的问题是重复输入代码...请不要忘记Ctrl-C。从示例代码中,手动键入所有内容可能会更有效,但是如果必须多次复制一堆行,那么复制第一行和新行似乎很有效,将其粘贴x次并进行更改,也不太可能打错字。

哦,还有错别字!那样破坏代码的可读性可能会使您梦set以求,您发现错误地设置了50个变量声明中的哪一个。现在大多数编译器都会在行号和列号上给出错误,但是比找到列要容易得多。


2
a)读取/扫描代码-多数人在扫描代码时会读取该行的前几个字符,然后继续前进,除非它“很有趣”,然后他们再阅读几行。编译器错误:大多数时候,我将编译器错误解释为“第<x>行问题”。只有在我无法立即解决(罕见)的情况下,我才真正读取错误。
mattnz

19

每行一条语句也使查看并排差异的变化变得更加容易。


2
这可能是最大的原因,如果有人必须合并该代码,几乎所有合并工具都将使隔离和移动行而不是行的子字符串更加容易。
匿名

@anon关于合并工具的要点;每行一条语句意味着更少的合并冲突需要清除。
雨果

10

尽管示例未显示此内容,但将多个语句分组在一行上还有另一个问题。如果一行上的五个语句之一引发异常怎么办?

您的堆栈跟踪将显示“ N行的EBlah” ...现在您不知道这五个语句中的哪一个引发了异常。

(如果任何类型的语句过长,也会发生相同的情况。)


2
同样的概念也适用于调试,在这种情况下,粒度再次通常是行号。
David Hammen

2
哦,是的,这可能是个问题。“收藏夹”是指您以某种类似的方式foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(Java / C#语法)松散空指针。使用多余的行(和临时变量……以及原始开发人员使用的2D6线索砖)对这种混乱进行分类总是更好的选择。
Donal Fellows,

7

每行一个语句是一种广泛使用的编码样式。结果,大多数将来查看您的代码的开发人员可能会在每行看到多个语句时退缩。当您习惯以一种方式看到事物时,以另一种方式看到事物可能会迷失方向。

因此,除极少数情况下,我建议不要这样做。


4

我上一次这样做是25年前,它是在小时钟下以小时钟运行解释型语言,消除了每个空格或回车符的性能。

我现在就对此感到畏缩(尽管这样做是有充分理由的)。

不幸的是,这样的代码难以阅读,因此难以维护。


1
因此,您可以正确地编写它,然后去除空格和“机器副本”的任何其他准备。就像如今缩小javascript一样。
CaffGeek

1
是的-我也写了一个程序来重新处理这样的源代码-早在1986年。我希望再也不需要做另一件事。
quick_now 2011年

1

从句法上讲,它确实没有错。这实际上取决于您团队的编码风格。

正如我所看到的大多数代码(包括标准c ++头中的代码)都是以这种方式完成的,我将使用第一个方法。

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

0

这确实是不寻常的编码风格。

我建议您改用空行来分隔代码的逻辑部分。


0

向右走太远会产生与多行一样多的问题。

我不得不处理一些带有数十个字段的sql语句。通常,我会在每行上放一个,但在某些情况下,我会将3或4合并为一行。在开发过程中,当您不得不上下滚动几次时,这似乎是个好主意。

很遗憾回到此代码。拥有额外的行似乎并不会造成太大的问题,因此我通常会对其进行清理。


0

另外,您是否认为任何必须维护我的代码的人都对这种方法有疑问?

一分钟后,他将使用其最喜欢的IDE Regex功能自动将所有不可读的代码分成一行。

快速浏览您显示的示例足以了解第二种方法的可读性。

跟随垂直页面流动要容易得多,而无需眼睛一直水平移动。

看一下您的示例:您立即知道代码全部Text与不同textBox对象的属性有关,并且它们包含字符串作为值。非常简单。


0

我不会亲自使用这种样式。总结一下

优点

  • 更少的代码行可以滚动浏览
  • 可以用来在语义上对代码进行分组来表达:“很多分配的东西”。但是如果麻烦太多,您总是可以将这样的块重构为函数。

缺点

  • 很难阅读,通常更容易水平阅读代码(略读,不动眼,...)
  • 差异很容易成为噩梦,包括合并
  • 更难更改(复制和粘贴,注释掉,...)
  • 在许多IDE中,调试可能是一个问题,因为它们在行而不是单个表达式上运行。

有些“缺点”有时可能是有利的。例如,假设一段代码具有形式的八个连续操作if (x > maxX) {x=maxX; peggedAny = true;}。如果每个这样的操作都可以轻松地放在一行上,那么我宁愿有这样的八行,而不是将语句分开的几十行。如果在足够的地方使用了这样的比较,则最好使用以下形式的四个语句peggedAny |= pegValueMinMax(ref x, minX, maxX);,但是阅读该书的人必须阅读pegValueMinMax以了解其作用。
超级猫

此外,如果一行的一小部分发生更改,则“差异”将视为对整个行的更改。如果生产线在功能上应作为一个单元运行,那将是一件好事。否则,如果将语义操作分成多行,则对某些行的更改可能会以不明显的方式影响操作。
超级猫
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.