为什么我要垂直对齐代码(你也要如此!)

简介:

image
image

英文原文:Why I vertically align my code (and you should too!)

上周在 HackerNews,关于 Linux Kernel 代码风格展开了有趣的讨论。

在讨论中,我就应不应该垂直对齐代码发起了一场小小的圣战。我完全支持!让我细说端详。

什么是垂直对齐?

举个小例子:

int robert_age = 32;
int annalouise_age = 25;
int bob_age = 250;
int dorothy_age = 56;

下面的代码更易于阅读:

int robert_age     = 32;
int annalouise_age = 25;
int bob_age        = 250;
int dorothy_age    = 56;

我扫一眼就能看到”bob_age”有点儿不正常。我不用多费事,就轻松地看出来它们都是整数。

这条意见还没被广为分享,因此我打算解释一下,为什么很多人认为这是一种有用的风格指南。

理解

90% 的编程工作是为了解决问题,剩下的 10% 的工作需要再用 90% 的时间用来理解问题是怎样被解决的。注1

阅读代码和阅读散文,有着极大的不同。我们期望作者能够清晰地解释他们的语句,而不是用他们选中的语言过于冗长地说些不相干的东东,我们都期待普通的语法风格。

的确,Kernel 代码风格着重强调了这一点。你选择变量命名的方式,和代码的用途一样重要。

考虑下面的代码:

var thinG=doIt (thestuff,MORE_sTuff); /* LOL! */

即便你对代码库有深入理解,它也不是特别易读的代码行。

var totalBill = apply_tax (initialBill, taxRate);

对于清晰的应用程序,要借助命名习惯、间隔和大写,从而让代码更易于阅读。这意味着,接手我们代码的可怜家伙,将用更少的时间来解密代码,把更多时间放在理解上面。

为什么使用等宽字体?

在所有著名的、老生常谈的舌战中,有两个实力基本相当的阵营,即等宽字体 注2VS 比例字体注3 的争论。

某些异教徒会对你说,比例字体是最棒的——无视这些异教徒吧。另一些异教徒则在他们争论比例字体所具有的上等纯洁度时,给你的心灵留下了不和谐——这些可怜的、受谴责的灵魂呀。

最终,还要归结到可读性。你觉得,什么东西能够最容易地帮助你理解代码?为什么 IDE 有着色方案——因此你能一眼看出“foo”是函数、常量、变量还是注释。只要能让你更快地理解这段代码的用途,它就是好的东西!

这也是电子表格如此受欢迎的原因之一。列提高了可读性。你可以快速地顺着一列扫视,并能注意到某行和其它行是否存在明显不同。

我们没有工具

有趣的是,在 HackerNews 上的讨论中,我面临的最大批评与垂直对齐是否有用无关,而是我们的工具有多么糟糕。

「这破坏了 diff 的可读性和可用性。比如你修改了某个常量,需要快速追踪因此引起的严重 bug。对于水平排列的代码,diff 或许包含了所有修改过的行,从而掩盖了关键修改。有一些忽视空格的变通方案,以及基于单词的 diff,不过依本人愚见,不值得这么麻烦。

——Andreas van Cranenburgh

……还有……

假如你有 50 行赋值语句,你把所有值都和最大的那个对齐了,那么增加一个赋值语句,将迫使你更新 50 行代码。我已经遇到过这些情形了,每当那时候,我就明白了,不要那样对齐值是多么地重要。

——scrollaway

这些论点在某些语境中是合理的,但是说明了需要更好的工具。

我想起了 Elastic Tabstops ——自动排列代码块的方法。

image

By Nick Gravgaard

工具能够轻松容纳这种工作方式。计算机就是为我们做单调、重复工作的,CPU 周期「浪费」在让代码更可读方面的代价,已经足够便宜了。

在 Linux Kernel 中,还有大量的例子,垂直排列让代码更便于人类分析。

垂直排列不适用于每个场景,但是对于快速评估代码,其可读性是无与伦比的。

代码是具有创造性的平台,我们通过这个平台来表达想法。如果工具增加了理解这些想法的难度,那么,需要改变的就是工具、而非我们。

注释

  1. 90-90 法则(ninety-ninety rule,九九定律,99 定律)是计算机编程和软件工程领域的一个有名的法则,出自于一句幽默的格言:(开发软件时)前 90% 的代码要花费 90% 的开发时间,剩余的 10% 的代码要再花费 90% 的开发时间。https://zh.wikipedia.org/wiki/90-90%E6%B3%95%E5%88%99
  2. 等宽字体(Monospaced Font)是指字符宽度相同的电脑字体。与此相对,字符宽度不尽相同的电脑字体称为比例字体。在等宽字体中,字母i,j显得两侧余白较多,而字母w,m等 的笔画显得相当拥挤。但是随着图形用户界面主流的更新和电脑技术的提高,处理比例字体的局限性得到了突破,因此现在排版上显得比较自然的比例字体的使用已 经相当普及。另外,代码也经常使用等宽字体。https://zh.wikipedia.org/wiki/%E7%AD%89%E5%AE%BD%E5%AD%97%E4%BD%93
  3. 比例字体(Proportional Font)是指字符宽度不尽相同的电脑字体。与此相对,字符宽度相同的电脑字体称为等宽字体。https://zh.wikipedia.org/wiki/%E6%AF%94%E4%BE%8B%E5%AD%97%E4%BD%93

文章转载自 开源中国社区[https://www.oschina.net]

相关文章
|
数据中心
SFP+ DAC高速线缆与10G光模块,谁才是10G网络的最佳选择?
数据中心网络从最初的100M,1G,10G,到40G和100G,高速以太网的发展从未停止。10G以太网(IEEE802.3ae)的标准于2002年批准,在10G网络中,工程师在布线中需要考虑选择光纤还是铜缆,大家都希望选择一个性价比高的方案。
3021 0
|
JavaScript 前端开发 Java
编程语言中的常见Bug及解决方案
本文总结了主流编程语言中的常见Bug及其解决方案,涵盖JavaScript、Python、C/C++、Java和Go。例如,JavaScript中小数相加精度不准确,可通过`toFixed()`解决;Python 2中整数除法向下取整,改用浮点数除法;C/C++内存管理与缓冲区溢出,使用安全函数如`snprintf`;Java空指针异常,使用非空判断或`Optional`类;Go并发编程中的竞态条件,采用互斥锁或原子操作。了解这些Bug及解决方案有助于提高编程质量。
373 9
|
机器学习/深度学习 API 计算机视觉
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
344 2
|
安全 网络安全 数据安全/隐私保护
智能家居系统的安全性分析与改进策略
随着科技的飞速发展,智能家居系统已成为现代生活的一部分。然而,随之而来的安全问题亦日益凸显。本文将深入探讨智能家居系统面临的主要安全挑战,包括数据保护、设备安全性和网络攻击等方面,并提出相应的改进措施。通过增强加密技术、采用多因素认证和定期更新软件等方法,旨在提高智能家居系统的整体安全性,确保用户隐私和数据的安全。
466 26
基于模糊PID的直流电机控制系统simulink建模与仿真
- **课题概述**: 实现了PID与模糊PID控制器的Simulink建模,对比二者的控制响应曲线。 - **系统仿真结果**: 模糊PID控制器展现出更快的收敛速度与更小的超调。 - **系统原理简介**: - **PID控制器**: 一种广泛应用的线性控制器,通过比例、积分、微分作用控制偏差。 - **模糊PID控制器**: 结合模糊逻辑与PID控制,动态调整PID参数以优化控制性能。 - **模糊化模块**: 将误差和误差变化率转换为模糊量。 - **模糊推理模块**: 根据模糊规则得出控制输出。 - **解模糊模块**: 将模糊控制输出转换为实际控制信号。
|
机器学习/深度学习 编解码 并行计算
【传知代码】用二维图像渲染3D场景视频-论文复现
mip-NeRF是针对NeRF(Neural Radiance Fields)的改进模型,旨在解决NeRF在不同分辨率下渲染图像时的模糊和伪影问题。mip-NeRF通过引入多尺度表示和圆锥体采样,减少了图像伪影,提升了细节表现力,同时比NeRF快7%,模型大小减半。相比NeRF,mip-NeRF在标准数据集上的错误率降低17%,多尺度数据集上降低60%。此外,它的渲染速度比超采样NeRF快22倍。该模型适用于3D场景渲染和相关应用,具有广阔的发展前景。
469 2
|
人工智能 自然语言处理 安全
产品更新|宜搭AI助理、精品应用产品力、专属宜搭多项功能升级!
本期功能更新已全量发布,可直接在宜搭内体验。
941 0
产品更新|宜搭AI助理、精品应用产品力、专属宜搭多项功能升级!
|
消息中间件 测试技术 领域建模
DDD - 一文读懂DDD领域驱动设计
DDD - 一文读懂DDD领域驱动设计
50461 6
|
存储 JSON 安全
在项目中到底应不应该用jwt?
JSON Web Tokens(JWT)是一种开放标准,用于在网络上传输安全信息。它常用于身份验证场景,用户登录后,服务器生成JWT并返回给客户端。客户端在后续请求中携带此令牌,服务器验证其有效性来确认用户身份。JWT具有无状态、可扩展和安全的特点,支持跨域认证,但也有令牌大小、续期复杂等缺点。是否使用JWT取决于项目需求,多数公司在采用,除非有特殊理由避免。以下是Go语言中使用JWT的一个示例。
498 0