是否有正当理由在当今这个年龄段的代码文件中强制使用80个字符的最大宽度?[关闭]


159

说真的 在22英寸的显示器上,它可能只覆盖屏幕的四分之一。我需要一些弹药才能降低此规则。


我并不是说应该没有限制;我只是说80个字符很小。


所有答案几乎都说明了我要添加的内容。举一个真实的例子-我有一个x61s,分辨率是1024x768。当我在路上时,没有我的高档显示器。超出此规则时,在我的IDE中打开代码很麻烦。
直到


即使您有一组3个监视器。这不是从右向左和向后摇头的原因。永远。啊哈哈。实际上,眼睛的移动速度快于头部。您知道报纸上的专栏吗?宽度的原因是眼睛/头部/人的方便。
伊万·布莱克

Answers:


257

我认为将代码保持在80(或79)列的做法最初是为了支持人们在80列哑终端或80列打印输出上编辑代码。这些要求现在大部分已经消失了,但是仍然有合理的理由保留80列规则:

  • 为了避免在将代码复制到电子邮件,网页和书籍中时进行换行。
  • 并排或使用并排的diff查看器来查看多个源窗口。
  • 提高可读性。可以快速读取狭窄的代码,而无需从一侧到另一侧扫描眼睛。

我认为最后一点是最重要的。尽管最近几年显示器的尺寸和分辨率有所增长,但眼睛却没有


7
他们可能已经“很大程度上消失了”,但还不是全部。我倾向于使用两种不同的设置:1)在连接到远程计算机的ssh窗口中。默认为80个字符宽。和2)在Visual Studio中,两个面板并排放置,因此我可以同时看到标头和cpp文件。
恩诺

10
@steffenj:实际上,书籍往往每行拍摄约66个字符(尽管视其他参数而有所不同),因为更长的行确实使阅读更加困难。可以争论最大代码行长度,但是出于历史和实际原因,80行很方便。
史蒂夫·S

68
问题是通过强制人们保持线路长度短,他们倾向于使用更少的meaningfull名..
伊恩林格罗塞

4
我发现有关可读性的评论很有趣,因为我真正讨厌印刷编程文章/书籍/ ...的地方是,用于代码示例的短行非常难以阅读。将某些内容移到新行很有意义,但是分组应该在逻辑上进行,递归地对表达式进行剖析,而不是因为输出设备意外地达到了其极限。IOW,我发现施加如此严格限制的设备不太适合显示代码。
克里斯·勒彻

4
我认为80列强制执行器的问题在于,他们忘记了代码会沿垂直方向增长。您会遇到同样的问题,但是当您必须在两行或多至四行或五行之间中断单个语句时,在现代代码的垂直方向上AND看起来很糟糕。它不是更具可读性。对于现代代码,我的意思是描述性变量名称和限定的继承,名称空间,类等。请停止80列nonsese,改用常识。120更好,但也不应该成为规则。
拉尔斯瓦德,2015年

79

80列文本格式的起源早于80列终端-IBM打孔卡的历史可以追溯到1928年!这使人想起(伪经)的故事,即美国的铁路轨距是由罗马不列颠战车的车轮宽度决定的。

我有时会发现它有些局限,但是有一些标准限制是合理的,所以它是80列。

这是由 Slashdot

这是一个古老的Fortran声明:

FORTRAN punch card


60

这些天来80个字符是一个荒谬的限制。将代码行拆分为有意义的行,而不是根据任意字符限制。


字符数限制不会告诉您必须在哪里拆分一行代码,而是在何时
gztomas

不它不是。如果编写的字符数超过80行,则表达式复杂性或命名策略可能已经存在问题。正如其他人提到的那样,可读性是头等大事,阅读速度开始下降到60-66个字符以上(打字,基于人类生理学)。
sola

@sola您的评论以98个字符出现在这里,它是对我来说是一种密集的自然非母语语言。完全清晰。带有3-4个缩进,语法标记等的代码更加容易。
viyps

我无意中降低了这个答案,不再能提高它的价值。:(
安迪

35

您应该这样做是为了没有22英寸宽屏显示器的每个人。就个人而言,我在17英寸4:3显示器上工作,发现它足够宽。但是,我也有3个这样的显示器,所以我仍然有很多可用的屏幕空间。

不仅如此,如果行太长,人眼实际上在阅读文本时也会遇到问题。迷失在哪条线上太容易了。报纸的宽度为17英寸(或类似的东西),但您看不到它们在页面上始终书写,杂志和其他印刷品也是如此。如果您将列保持狭窄,则实际上更容易阅读。


14
将缩进添加到混合中时不可以。如果每个缩进使用4个空格,并且位于诸如namespace-> class-> method-> if-> for之类的空间中,则占空间的1/5。
TraumaPony

您始终可以将规则设置为缩进80个字符。这样,眼睛就可以轻松跟随它。
文森特·麦克纳布

有时,(但并非总是如此),我希望.Net具有自动命名空间,以便您不必在文件中定义命名空间。这严重弄乱了代码的对齐方式。如果您想要嵌套的名称空间,则会遇到很大的问题。
Kibbee

13
但是,阅读散文与阅读代码并不相同。
Atario

3
报纸+1,很好的例子。@Atario,阅读良好的代码非常类似于阅读散文。
托德·查菲

23

如果您有一系列重复但有一些细微差异的语句,那么将这些相似性和差异分组为几行以使差异垂直对齐,则可以更轻松地看到它们。

我认为以下内容比如果将其分成多行的可读性要强得多:

switch(Type) {
case External_BL:   mpstrd["X"] = ptDig1.x - RadialClrX;    mpstrd["Y"] = ptDig1.y - RadialClrY;    break;
case External_BR:   mpstrd["X"] = ptDig1.x + RadialClrX;    mpstrd["Y"] = ptDig1.y - RadialClrY;    break;
case External_TR:   mpstrd["X"] = ptDig1.x + RadialClrX;    mpstrd["Y"] = ptDig1.y + RadialClrY;    break;
case External_TL:   mpstrd["X"] = ptDig1.x - RadialClrX;    mpstrd["Y"] = ptDig1.y + RadialClrY;    break;
case Internal_BL:   mpstrd["X"] = ptDig1.x + RadialClrX;    mpstrd["Y"] = ptDig1.y + RadialClrY;    break;
case Internal_BR:   mpstrd["X"] = ptDig1.x - RadialClrX;    mpstrd["Y"] = ptDig1.y + RadialClrY;    break;
case Internal_TR:   mpstrd["X"] = ptDig1.x - RadialClrX;    mpstrd["Y"] = ptDig1.y - RadialClrY;    break;
case Internal_TL:   mpstrd["X"] = ptDig1.x + RadialClrX;    mpstrd["Y"] = ptDig1.y - RadialClrY;    break;
}

更新:在评论中,有人建议这将是一种更简洁的方法:

switch(Type) {
  case External_BL: dxDir = - 1; dyDir = - 1; break;
  case External_BR: dxDir = + 1; dyDir = - 1; break;
  case External_TR: dxDir = + 1; dyDir = + 1; break;
  case External_TL: dxDir = - 1; dyDir = + 1; break;
  case Internal_BL: dxDir = + 1; dyDir = + 1; break;
  case Internal_BR: dxDir = - 1; dyDir = + 1; break;
  case Internal_TR: dxDir = - 1; dyDir = - 1; break;
  case Internal_TL: dxDir = + 1; dyDir = - 1; break;
}
mpstrd["X"] = pt1.x + dxDir * RadialClrX;
mpstrd["Y"] = pt1.y + dyDir * RadialClrY; 

尽管它现在可以容纳80列,但我认为我的观点仍然成立,我只是举了一个不好的例子。它仍然表明在一行上放置多个语句可以提高可读性。


8
通过说行与行之间只有很小的差异,您也可以说有很多冗余代码。删除其中一些可能会显着减少列数,并且仍保持垂直对齐。
foraidt

@mxp:同意。如果有更简洁的方法编写以上内容,我将很感兴趣。
山姆·哈斯勒

我同意大体上的想法,但是我的例子是……关于什么:switch(...){case ... BL:dxDir =-1; dyDir =-1; 打破; 案例... BR:dxDir = + 1; dyDir =-1; 打破; ...} ... [“” X“] = pt1.x + dxDir * Rad ... X; ... [“ Y”] = pt1.y + dyDir * Rad ... Y;
Yarik

38
我需要水平滚动两个示例中的第一个示例,这一事实证明了关于较短行更好的方法:-)
Enno

1
我不知道讨厌滚动吗?这是一种普遍的观点,我并不是说这是错误的,只是我不理解。特别是如果你在代码编辑器的时候,你甚至不需要移动你的手离开键盘去的鼠标-只要(ctrl+)arrow超过或打end
科吉

21

在A4纸上,默认尺寸下的等宽字体打印为80列乘66行。


16

我利用大屏幕的优势,使多个代码彼此相邻。

你不会从我这里得到任何弹药。实际上,我不希望看到它发生更改,因为在紧急情况下,我仍然很少看到需要从文本控制台更改代码的情况。


14

超长线很难阅读。仅仅因为您可以在显示器上显示300个字符,并不意味着您应该使行长。除非您别无选择(调用需要一堆参数),否则300个字符的语句也太复杂了。

我通常使用80个字符,但如果执行此命令,我将超越此限制,这意味着将换行符放置在不希望的位置。


有研究表明,人们在放松跟踪之前就可以阅读和跟随x个字符/单词。我在想80在某个地方。不过,我没有任何消息来源对此进行支持。
直到

是的,我真的认为,这与保持行距短而不是使行保持干净/简洁/可读/可理解有关。
KOGI 2013年

如果您有一个(需要大量参数的调用。)无论如何,您都需要进行一些重构。
Zarremgregarrok 2014年

@Zarremgregarrok我已经在Microsoft API中看到一些很长的参数列表。
洛伦·佩希特

@LorenPechtel这样写得好吗?
Zarremgregarrok 2014年

8

我唯一要保留在80个字符以内的是我的评论。

就个人而言...我将所有的脑力(几乎没有)都投入到正确的编码上,当我可能将时间花在下一个功能上时,不得不回过头来将所有内容分解为80个字符的限制是很痛苦的。是的,我想Resharper可以为我做这件事,但是这让我有些惊讶,因为第三方产品正在决定我的代码布局并更改它(“请不要将我的代码分成两行HAL。HAL?” )。

就是说,我确实在一个很小的团队中工作,并且我们所有的监视器都很大,所以就目前而言,担心让我的程序员感到困扰的问题并不是什么大问题。

似乎有些语言会鼓励使用更长的代码行,以便提高成本(如果then语句,则简明扼要)。


7

我有两个20“ 1600x1200显示器,我坚持80列,因为它可以让我并排显示多个文本编辑器窗口。使用'6x13'字体(trad。xterm字体),80列占用480像素以及滚动条和窗口边框。这样一来,一个1600x1200监视器上可以拥有三个此类窗口。在Windows上,Lucida Console字体不能完全做到这一点(最小可用大小为7像素宽),但是1280x1024监视器将显示两列,并且1920 x 1200监视器(如HP LP2465)将显示3。它的侧面还将留出一些空间,可容纳Visual Studio中的各种资源管理器,属性和其他窗口。

另外,很难阅读很长的文本。对于文本,最佳为66个字符。有时,过长的标识符会适得其反,因为它们使连贯地布置代码变得困难。良好的布局和缩进提供了有关代码结构的视觉提示,某些语言(想到了Python)为此明确使用了缩进。

但是,用于Java和.Net的标准类库往往具有很长的标识符,因此不一定能做到这一点。在这种情况下,使用换行符布置代码仍然有助于使结构明确。

请注意,您可以在此处获得Windows版本的“ 6x13”字体。


谢谢你这么说!大型显示器是限制80行的原因,因此您可以并排安装更多窗口。更不用说有时候能够在纸上打印源代码是一件很不错的事情。或将摘要粘贴到其他文档中。
dreeves

7

人们说长行代码往往很复杂。考虑一个简单的Java类:

public class PlaintiffServiceImpl extends RemoteServiceServlet implements PlaintiffService {

这是94个字符的长度,并且类名非常短(根据GWT标准)。很难在两行上阅读,并且在一行上可读性强。出于实用性考虑,因此允许“向后兼容”,我想说100个字符是正确的宽度。


5
我不喜欢水平滚动条
bryc

9
考虑到我的讨论已经晚了几年,我没有人对此表示惊讶,但是我认为在“扩展”和/或“实现”关键字之前换行符(也许是为了清楚起见)仍然会产生很大的变化。可读的代码。
mtraceur

2
我喜欢这样一个事实:它说“一行很容易阅读”,但同时我无法读取整个代码片段,因为它溢出了浏览器的水平空间。点被证明。
oligofren

6

其他答案已经很好地总结了问题,但是当您可能希望将一些代码复制并粘贴到电子邮件中时也值得考虑。

这是具有“最大宽度”有用的时间。


6

您不是唯一要维护您的代码的人。

下一个这样做的人可能有17英寸的屏幕,或者可能需要大字体才能阅读文本。由于以前的屏幕限制,此限制必须在某个地方,并且惯例为80个字符。您能想到任何新的标准(120)和为什么最好使用其他字体,而不是“这就是我的显示器以Xpt字体显示的字体?”

请记住,每条规则总是有例外,因此您有特定的一行或一段代码,有意义的是超过80个字符,然后成为叛逆者。

但是,花点时间先思考一下“这段代码真的很糟糕,以致不能容纳80个字符吗?”


1
当我有2个pcb制表符时,我将住80个字符。更好的是,实际上使用制表符进行缩进,要求是当tabsize = 2时,适合80列,大多数时候使用4个以提高可读性。这样一来,当您真的不得不减少到80根色谱柱时,您可以但要付出一定的代价。
约书亚

5

在Linux编码标准中,它们不仅保留80个字符的限制,而且还使用8个空格的缩进。

部分原因是,如果您达到正确的边距,则应考虑将缩进级别移至单独的函数中。

这将使代码更清晰,因为无论缩进长度如何,都很难读取具有许多嵌套控制结构的代码。


3
如何通过许多函数调用读取代码?当然,这两种方法之间存在折衷……
ZsoltTörök,2009年

5

我已经将代码扩展到100个字符,可以舒适地放入不到Macbook屏幕一半的位置。行开始变得太长和太复杂之前,可能限制为120个字符。您不想太宽泛,否则会鼓励复合语句和深度嵌套的控制结构。

正确的余量是自然界告诉您执行额外的方法重构的方式


5

我想知道这是否会在当今时代引起更多问题。请记住,在C语言(可能还有其他语言)中,有一个函数名称可以使用多长时间的规则。因此,您经常会在C代码中看到非常难以理解的名称。好消息是它们不会占用太多空间。但是,每次我用诸如C#或Java之类的语言查看代码时,方法名称通常都很长,这使得将代码保持80个字符的长度几乎是不可能的。我认为今天不能使用80个字符,除非您需要能够打印代码等。


5

作为我雇主的编码准则的作者,我已将行长度从80增加到132。为什么要使用此值?好吧,就像其他人指出的那样,80是许多旧硬件终端的长度。132也是!端子处于宽屏模式时的线宽。任何打印机还可以使用压缩字体在宽屏模式下进行硬拷贝。

不留在80岁的原因是我宁愿

  • 希望使用较长的名称,并带有标识符的含义
  • 不用为C中的结构和枚举而烦恼typedef(它们是错误的,它们会隐藏有用的信息!如果您不相信,请在“ Deep C Secrets”中询问Peter van der Linden),因此该代码struct FOO func(struct BAR *aWhatever, ...)不仅仅是typedef狂热者的代码。

在这些规则下,仅80个字符/行会导致丑陋的换行次数超出我的眼睛的接受范围(通常是在原型和函数定义中)。



4

我希望将宽度限制为100个字符左右,以允许在宽屏显示器上使用两个SxS编辑器。我认为再也没有任何理由限制80个字符了。


4

使用比例字体。

我是认真的。通常,在不牺牲可读性或可打印性的情况下,我通常可以在一行中获得100-120个字符。实际上,使用好的字体(例如Verdana)和语法着色甚至更容易阅读。几天后看起来有些奇怪,但是您很快就习惯了。


当您想使用“缩进”和等宽字体时,这确实是个坏主意。
Bersaelor 2015年

2
@Bersaelor不,当您始终只使用制表符缩进并正确设置制表符宽度时,它可以很好地工作(等宽的4个宽度像7个比例)。缩进有效,您只是不能做ASCII艺术,但我认为ASCII艺术不属于代码。
maaartinus

就个人而言,编程时我处于另一侧。我发现比例代码确实很难阅读。有时,我甚至将IDE配置为使用等宽字体(是的,包括菜单)。
塞巴斯蒂安·马赫

2

我试图将内容限制在80个字符以内的原因很简单:太多了,这意味着我的代码变得太复杂了。过于冗长的属性/方法名称,类名称等造成的危害与简洁的危害相同。

我主要是Python编码器,因此这产生了两组限制:

  1. 不要写很长的代码
  2. 不要缩进太多

当您开始达到两个或三个缩进级别时,您的逻辑就会变得混乱。如果您无法在同一页面上保留单个块,则您的代码将变得太复杂且难以记住。如果您不能在80个字符内保留一行,那么您的行就会变得过于复杂。

在Python中,以可读性为代价编写相对简洁的代码(请参见codegolf)很容易,但是以可读性为代价编写冗长的代码甚至更容易。辅助方法不是一件坏事,辅助类也不是坏事。过多的抽象可能是一个问题,但这是编程的另一个挑战。

如果对C之类的语言有疑问,请编写辅助函数并将其内联,如果您不希望调用另一个函数并跳回的开销。在大多数情况下,编译器将为您智能地处理事情。


2

对此已经有很多好的答案,但是值得一提的是,在您的IDE中,您可能在左侧有一个文件列表,在右侧有一个功能列表(或任何其他配置)。

您的代码只是环境的一部分。


2

我不强制使用80个字符意味着最终会自动换行。
IMO,为最大宽度的行选择的任何长度并不总是合适的,因此应该使用自动换行。
这并不像听起来那么容易。

它是在jedit中实现的(来源:jedit.org ,它提供自动换行替代文字

但是从那一刻起,它就被人们深深地遗忘了!(实际上是2003年以来),主要是因为文本编辑器的自动换行涉及:

  • 换行信息适用于文本查看器,代码导航和垂直标尺。
  • 如goto行,行编号标尺列,当前行突出显示,保存文件之类的功能需要解包的行信息。

1

对于我自己的代码,我实际上遵循类似的规则,但仅是因为将代码打印到A4页面上-80列大约适合于所需字体大小的宽度。

但这是个人喜好,可能不是您追求的(因为您希望弹药走另一条路)。

您不质疑限制背后的原因-严重的是,如果没有人能提出这样一个充分的理由,那么您有很好的理由将其从编码标准中删除。


我很确定这是从文本模式屏幕为80个字符宽的时代开始的。
TraumaPony

1

我整天并肩而行,没有22英寸的怪异显示器。我不知道会不会 当然,这对于只喜欢使用箭头编码和300个字符的行的只写式程序员来说没什么兴趣。


1

是的,因为即使在这个时代,我们中的一些人仍在终端上进行编码(好的,主要是终端仿真器),在该显示器上只能显示80个字符。因此,至少对于我编写的代码,我非常感谢80 char规则。


0

我仍然认为该限制并不限于视觉部分。当然,监视器和分辨率足以在当今的一行中显示更多字符,但这是否增加了可读性?

如果确实执行了限制,这也是重新考虑代码而不是将所有内容放在一行中的一个很好的理由。缩进是一样的-如果您需要很多层次,则需要重新考虑代码。


0

达到80个字符编码,而不是事后。当然,评论也一样。大多数编辑器可以帮助您查看80个字符的限制。

(这可能有点OT,但是在Eclipse中,有一个选项可以在保存代码时格式化代码(根据您想要的任何规则)。起初有点怪异,但是过了一会儿您开始接受格式化只比生成的代码多。)


0

如果我们有一个这些,我们就不会有这个讨论!;-)

但是,认真地说,人们在回答中提出的问题是完全合理的。但是,最初的张贴者并没有争论极限,只是80列太少了。

通过电子邮件发送代码段的问题有一些好处。但是考虑到大多数电子邮件客户端对预格式化文本所做的邪恶行为,我认为换行只是您的问题之一。

对于打印,我通常发现100个字符行将非常舒适地适合打印页面。


0

我尝试将行数保持在80列以下。最主要的原因是,在命令行工作时,我经常发现自己正在使用grepless浏览代码。我真的不喜欢终端如何中断长的源代码行(毕竟,这些源代码不是用于该工作的)。另一个原因是,我发现如果所有内容都适合该行并且未被编辑器破坏,它看起来会更好。例如,具有长函数调用的参数在彼此之间和相似的​​东西之间很好地对齐。

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.