当前位置: 首页 > news >正文

《代码整洁之道》全书归纳

如果要把这本书最关键、最核心、被反复提及和强调的重点提炼出来,那就是:

  • 可读性高于一切: 你的代码是给人读的,让它像一篇清晰的文章一样易于理解。表达意图是关键。
  • 短小、单一: 函数要短小,类要短小,它们都只做一件事情。这是控制复杂度的主要手段。
  • 命名是基础: 花时间起好名字,这是让代码自文档化的第一步。
  • 测试是生命线: 没有好的单元测试,你无法安全地重构和改进代码。测试是整洁代码不可或缺的一部分。
  • 持续改进: 整洁不是一次性的任务,而是一个持续的过程。每次触碰代码,都 (尽量) 使它比你来之前更整洁(童子军规则)。
  • 专业精神: 视编程为一项需要持续学习和精进的技艺,对自己的代码质量负责。

《代码整洁之道》核心要点

  • 可读性与简洁性:代码应该像讲故事一样易于理解,遵循 KISS 原则(Keep It Simple)。保持代码高内聚、低耦合,并遵循“童子军法则”——每次修改后都让代码更整洁。清晰可读的代码便于维护和扩展。
  • 有意义的命名:变量、函数、类等名称要准确描述其用途和含义,使用可读的单词而非晦涩缩写或魔法数字。命名应让代码自解释,减少对注释的依赖,保持一致的命名风格以提高可读性。
  • 函数简洁且单一职责:函数应短小(通常不超过几行),每个函数只做一件事并保持在同一抽象层级。函数名要清晰表意,参数尽量少(避免超过2-3个),不应依赖全局变量或产生副作用。遵循单一职责原则(Single Responsibility Principle,SRP),可以将复杂逻辑拆分为多个小函数。
  • 避免重复(DRY原则):不要复制粘贴代码。当发现重复时,应通过提取公共函数或重构来消除重复。重复的代码会增加错误风险和维护成本,因此 DRY(Don't Repeat Yourself)原则是整洁代码的重要实践。
  • 合理使用注释:注释应简明有用,仅在必要时提供代码以外的信息或解释意图。避免无意义、过时或冗余的注释。好的代码本身应该能够自解释,当代码难以直接说明意图时再添加注释,并保证注释与代码同步更新。
  • 一致的格式和风格:遵循统一的代码格式规范(如缩进、换行、空格、命名约定),保持代码风格一致。良好的格式有助于阅读流畅、快速定位结构,并促进团队协作。使用格式化工具和代码评审可确保风格统一。
  • 类和模块的单一职责:每个类或模块都应只有一个职责,使其高内聚、易理解。不要在一个类中混合无关功能。通过关注点分离提高设计质量,并可遵循开放-封闭、里氏替换、接口隔离等设计原则,增强代码的灵活性和可扩展性。
  • 对象与数据结构:区分对象数据结构的概念——对象封装行为和状态,数据结构主要承载数据。避免将二者混合使用。为每个概念创建合适的类或常量,将魔法数字/字符串封装起来,提升代码的可维护性。
  • 错误处理:错误处理逻辑要清晰,不应混乱或干扰主要逻辑。优先使用异常机制代替返回错误码,在需要的层面捕获和处理异常。不要吞掉异常,应记录或传播错误信息以便定位问题,从而保证系统的鲁棒性。
  • 自动化测试:编写充分的单元测试,每个测试只验证一个断言,保持测试简洁可读且相互独立。测试驱动开发(TDD)鼓励先写测试再实现代码,从而促使设计更清晰。良好的测试用例可作为代码行为的文档,帮助重构和防止回归。

代码异味识别

识别“代码异味”(Code Smells): 重构通常始于发现代码中的问题迹象,即“代码异味”。这些异味是代码中可能存在更深层次设计问题的表面特征。学会识别这些异味是重构的第一步。常见的异味包括:

  • Duplicated Code (重复代码): 同一段代码在多个地方出现。
  • Long Method (过长函数): 一个函数做了太多事情,包含太多行代码。
  • Large Class (过大类): 一个类承担了太多职责,包含太多字段和方法。
  • Primitive Obsession (基本类型偏执): 过度使用基本类型代替小对象,例如用两个 double 表示一个范围,而不是一个 Range 类。
  • Switch Statements (Switch语句): 过长的或重复的 switch/if-else if 结构,通常意味着可以使用多态来替代。
  • Parallel Inheritance Hierarchies (平行继承体系): 当你继承一个类时,必须同时继承另一个类。
  • Lazy Class (孺子类): 一个类做的事情太少,没有充分的理由独立存在。
  • Feature Envy (依恋情结): 一个方法过度使用另一个对象的字段和方法,而不是使用自身类的字段和方法。
  • Data Clumps (数据泥团): 一组数据(字段或方法参数)总是结伴出现,应该考虑将它们封装成一个对象。
  • Comments (注释): 过多的解释性注释,或者注释只是在解释代码“做了什么”,而不是“为什么这么做”,这通常意味着代码本身不够清晰
  • 前后一致:比如 HttpServletResponse 命名为 response,后面一致用 response
  • 枚举优先变量

相关文章:

  • SpringMVC 通过ajax 前后端数据交互
  • Scala集合操作与WordCount案例实战总结
  • Linux命令-iostat
  • w~嵌入式C语言~合集6
  • Spring中生成Bean的方式总结-笔记
  • 颠覆传统微商!开源AI智能名片链动2+1模式S2B2C商城小程序:重构社交电商的“降维打击”革命
  • 基于Playwright的浏览器自动化MCP服务
  • Go 语言 核心知识点
  • golang goroutine(协程)和 channel(管道) 案例解析
  • go语言八股文(四)
  • Apache Sqoop数据采集问题
  • 【Spring Boot】Maven中引入 springboot 相关依赖的方式
  • 大模型——Suna集成浏览器操作与数据分析的智能代理
  • [Vulfocus解题系列]Apache HugeGraph JWT Token硬编码导致权限绕过(CVE-2024-43441)
  • Apache Tomcat 漏洞(CVE-2025-24813)导致服务器面临 RCE 风险
  • vue项目页面适配
  • 数据结构【堆和链式结构】
  • PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell
  • 耳机,三段式, 四段式,录音,播放
  • C++修炼:list模拟实现
  • 影子调查|23岁男子驾照拟注销背后的“被精神病”疑云
  • 我国首个大型通用光谱望远镜JUST在青海启动建设
  • 万能险新规落地:保险期限不得低于五年,明确万能险销售“负面清单”
  • 官方披露:临汾昔日“明星官员”宿青平已于去年落马
  • 四川省人大常委会原党组成员、副主任宋朝华接受审查调查
  • “80后”李岩已任安徽安庆市领导