《代码整洁之道》第5章 格式 - 笔记

你应该选择一套管理代码格式的简单规则。如果是团队,应该选择一套团队一致同意采用的简单格式规则。

最重要的原则:一致性(Consistency)!

  • 没有完美的格式规范,但有统一的规范。 整个团队(或者你自己写项目时)要定下一套格式规则,然后所有人都要严格遵守它。哪怕某个规则你不太喜欢,为了团队整体的代码风格统一,也得遵循。
  • 为什么? 读代码时,大脑就不用去适应不同的排版风格了,可以把精力完全放在理解代码逻辑上。
  • 强烈建议: 使用自动化代码格式化工具(IDE 里通常都有,比如 IntelliJ IDEA 的 Reformat Code,Eclipse 的 Format),并配置好团队统一的格式规范,让工具去强制执行排版规则。

格式的目的

代码格式关乎沟通,而沟通是专业开发者的头等大事。

你今天编写的功能,即有可能在下一版被修改,而代码的可读性会对以后可能发生修改行为产生深远影响。

垂直格式(Vertical Formatting)- 像写文章一样组织代码

想象你的代码文件是一张纸,你怎么在纸上从上往下安排内容?

  1. 报纸头条原则: 文件顶部应该包含最高层次、最概括的概念(比如类名、最重要的功能)。越往下,代码应该越详细,越具体。就像读报纸,先看大标题、导语,再看详细报道。
  2. 概念之间要留白: 用空行把不相关的概念隔开,就像文章段落之间要有空行一样。
    • 比如两个方法之间,应该用空行隔开。
    • 一个方法内部,不同逻辑块之间(比如初始化变量、执行主要计算、处理结果这三个步骤)也应该用空行稍微隔开,增强可读性。
  1. 相关性要紧密: 关系非常紧密的代码(比如属于同一个逻辑步骤的连续几行代码)应该紧挨着,不要用空行隔开,表示它们是一个整体。
  2. 相关代码要靠近: 概念上相关的代码,比如调用者和被调用者、使用某个变量的代码和定义这个变量的代码,在垂直距离上应该尽量靠近。理想情况下,调用者应该在被调用者上面(回想第三章的向下原则)。很显然这条规则不使用于分布在不同文件的概念。除非有很好的理由,否则不要把关系密切的概念放到不同文件中,这也是避免使用 protected 的原因。
  3. 垂直距离:概念相关,概念相关的代码应该放到一起,相关性越强,彼此的距离越短。变量声明,本地变量声明尽可能靠近使用位置,实体变量应该声明在类的顶部位置,这会在大多数方法用到。函数相关,若一个函数调用了另一个函数,应该紧密的把这两个函数垂直放到一起,调用者放到函数上面,这样极大的增加了可读性,程序就有一个自然顺序。
  4. 文件总长度: 文件不应该无限长。如果一个文件太长(比如超过几百行),可能意味着这个类或模块承担了太多的责任,可以考虑拆分成多个文件/类。太长的文件翻起来也很费劲。

垂直顺序

一般而言,我们想自上向下展示函数调用依赖顺序。也就是说,被调用的函数应该放在执行调用的函数下面 ¹。这样就建立了一种自顶向下贯穿源代码模块的良好信息流。

像报纸文章一般,我们指望最重要的概念先出来,指望以包括最少细节的方式表述它们。我们指望底层细节最后出来。这样,我们就能扫过源代码文件,自最前面的几个函数获知要旨,而不至于沉溺到细节中。

横向格式

想象怎么把一行行的代码写得更舒服?

空格的使用:

  • 在操作符两边加空格: 让代码看起来不拥挤,更容易分辨不同的元素。例如 a = b + c; 而不是 a=b+c;
  • 逗号后面加空格: 比如 method(arg1, arg2);
  • 方法名和括号之间不要有空格:methodName(); 而不是 methodName ();
  • 关键字后面加空格:if (...), for (...), while (...)

缩进(Indentation):这是水平格式中最重要的! 缩进表示了代码的层级结构。每一个代码块(比如 if 体、for 循环体、方法体、类体)都应该相对于其外层块进行缩进。严格且一致的缩进是代码可读性的基石。

不要对齐变量声明或赋值: 有些人喜欢让多行变量声明的赋值符号 = 对齐。虽然看起来整齐,但当你修改其中一行时,可能导致很多其他行的等号位置也需要调整,这在代码版本管理(Git Diff)时会产生很多不相关的修改,干扰 Code Review。

空范围

如果循环语句块为空,不要在结尾加分号,容易看不见,你可以就用空括号,确保缩进,或者换行加 ;,这样也有点丑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载

在 C 中,类的默认成员函数是编译器自动生成的重要机制,合理利用这些函数可以简化代码编写,同时避免资源管理错误。本文将从构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心内容展开,结合具体案例深入解析。 一、默认成员…

【KWDB创作者计划】_企业级多模数据库实战:用KWDB实现时序+关系数据毫秒级融合(附代码、性能优化与架构图)

一、技术背景与行业痛点 1.1 多模数据融合挑战 场景痛点: 工业物联网设备每秒产生百万级传感器数据(时序数据)。需关联设备档案(关系数据)生成设备健康报告,传统方案需多数据库跳转,延迟>5…

w~嵌入式C语言~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/13870376 一、STM32怎么选型 什么是 STM32 STM32,从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指S…

Multisim使用教程详尽版--(2025最新版)

一、Multisim14前言 1.1、主流电路仿真软件 1. Multisim:NI开发的SPICE标准仿真工具,支持模拟/数字电路混合仿真,内置丰富的元件库和虚拟仪器(示波器、频谱仪等),适合教学和竞赛设计。官网:艾…

分布式理论和事务

微服务和分布式 微服务 是一种软件架构风格,它将应用程序拆分成一系列小型、独立的服务,每个服务专注于单一功能,彼此通过轻量级通信机制(如 API)进行交互。微服务通常是松耦合的,可以独立开发、部署和扩展…

JAVA:红黑树应用的技术指南

🌳 1、简述 红黑树是一种自平衡二叉查找树(Self-Balancing Binary Search Tree),被广泛应用于操作系统调度、Java集合、数据库索引等核心模块中。本文将从 基本原理 入手,结合 实际应用场景与代码实例,带你…

【Pandas】pandas DataFrame rfloordiv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…

【数据可视化-26】基于人口统计与社会经济数据的多维度可视化分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

WinForm真入门(18)——DateTimePicker‌控件解析

一、基本概念‌ ‌DateTimePicker‌ 是 Windows 窗体中用于选择日期和时间的控件,支持以下交互方式: 通过下拉日历选择日期通过上下按钮调整时间直接输入日期或时间 适用于需要规范日期格式、限制日期范围或快速输入的场景(如预约系统、数据…

AVFormatContext 再分析

说明 :将 avfromatContext 的变量依次打印分析,根据ffmpeg 给的说明,猜测,结合网上的文章字节写测试代码分析。 从常用到不常用依次分析 1. unsigned int nb_streams; 代表 avfromatContext 中 AVStream **streams 的个数 /** …

计算机网络-运输层(1)

计算机网络-运输层(1) 文章目录 计算机网络-运输层(1)5.1 运输层概述5.2 运输层端口号、复用与分用端口号基本概念端口号特性端口号分类重要说明 5.3 UDP与TCP协议对比关键区别说明 5.1 运输层概述 计算机网络体系结构中的物理层、数据链路层以及网络层共同解决了主机通过异构…

2025 FIC wp

这次比赛计算机和手机大部分题目都比较常规 第一和第四部分有点让人摸不着头脑 比赛的时候第一部分有四个题没出 第四部分基本都没怎么出 现在复盘一下 把我当时做题的心得和获取的新知识记录一下 互联网取证的部分就先学习一下别的师傅 检材 链接:https://pan.bai…

【大数据技术-联邦集群RBF】DFSRouter日志一直打印修改Membership为EXPIRED状态的日志分析

生产环境遇到下面报错 2025-04-23 17:44:15,780 INFO store.CachedRecordStore (CachedRecordStore.java:overrideExpiredRecords(192)) - Override State Store record MembershipState: router1:8888->hh-fed-sub25:nn2:nn2:8020-EXPIRED 2025-04-23 17:44:15,781 INFO …

【HarmonyOS 5】鸿蒙检测系统完整性

【HarmonyOS 5】鸿蒙检测系统完整性 一、前言 从现实安全威胁来看,设备系统完整性风险已影响至移动应用的各个场景。不少用户因使用越狱设备(Jailbreak)或非真实设备(Emulator),导致应用安全防护机制失效…

学习spark-streaming收获

1.流处理的核心概念 •实时 vs微批处理:理解了 Spark Streaming 的微批处理(Micro-Batch)模型,将流数据切分为小批次(如1秒间隔)进行处理,与真正的流处理(如Flink)的区…

Redis一些小记录

Redis一些小记录 SpringData Redis:RedisTemplate配置与数据操作 操作String类型数据 String是Redis中最基本的数据类型,可以存储字符串、整数或浮点数。RedisTemplate提供了ValueOperations接口来操作String类型的数据,支持设置值、获取值、…

5G融合消息PaaS项目深度解析 - Java架构师面试实战

5G融合消息PaaS项目深度解析 - Java架构师面试实战 场景:互联网大厂Java求职者面试,面试官针对5G融合消息PaaS项目进行提问。 第一轮提问 面试官:马架构,请简要介绍5G融合消息PaaS平台的核心功能和应用场景。 马架构&#xff…

【C语言极简自学笔记】C 语言数组详解:一维数组与二维数组

在 C 语言中,数组是一种非常重要的数据结构,它可以将多个相同类型的元素组织在一起,以便于我们进行批量处理和操作。本文将详细介绍 C 语言中的一维数组和二维数组,包括它们的定义、初始化、元素访问以及内存存储等方面的内容。 …

04.通过OpenAPI-Swagger规范让Dify玩转Agent

dify安装 cd dify cd docker cp .env.example .env docker compose up -d准备自定义工具 我自建的PowerDNS,它的swagger如下: https://github.com/PowerDNS/pdns/blob/master/docs/http-api/swagger/authoritative-api-swagger.yaml 但需要加上&#x…

汽车产业链主表及类别表设计

(提前设计,备用) 一、汽车产业链类别表(industry_chain_category) 设计要点 1、核心字段:定义产业链分类(如零部件、整车制造、销售服务等) 2、主键约束:自增ID作为唯一标…