《Clean Code《代码整洁之道》解读

news/2024/9/17 15:10:20/ 标签: 代码整洁之道

《Clean Code》(《代码整洁之道》)是软件开发领域的经典著作,由知名软件工程师Robert C. Martin(又称"Uncle Bob")编写。本书详细探讨了如何编写整洁、易于维护、可读性强的代码。对于任何软件项目的长期维护和扩展都至关重要。

核心思想

代码质量:代码质量与其整洁度成正比。干净的代码不仅质量可靠,也为后期维护、升级奠定了良好的基础。
可读性:代码是写给人看的,其次才是机器执行。良好的命名规范、合理的缩进和空行、注释的恰当使用都是使代码易于理解的关键。

  1. 整洁代码的定义
    整洁的代码应该是优雅的,易于理解的,并且能够快速修复错误。它不只是工作正常,更应该能被轻松理解和维护。Martin认为,“整洁代码的每一行都透露出对细节的关注。”
  2. 命名
    有意义的命名:变量、函数、类的名称应该准确描述其作用。命名应该清晰、简洁,但不应牺牲描述性。
    避免误导:不要使用与实际含义不符的名称。例如,不要用list表示非列表的数据结构。
    长短适中:名称应该长到足以表达意图,但不应过长。
  3. 函数
    函数应该短小:每个函数都应该尽量短小,通常最好保持在20行以内。
    单一职责原则:函数应只做一件事,并且做得好。尽量避免函数承担多个职责,这样会使其难以理解和维护。
    避免副作用:函数不应在看似无关的地方修改全局状态或其他对象的状态。
    函数参数:参数越少越好,最好是零参数或单一参数。尽量避免超过三个参数的函数,因为这会增加复杂性。
  4. 注释
    注释的用处:注释应解释“为什么”做某事,而不是“什么”或“如何”做某事。注释不能替代整洁的代码。
    减少注释的依赖:通过写出更具自解释性的代码,减少对注释的依赖。好的代码本身就是最好的文档。
    避免冗余注释:如果代码已经表达清楚,注释就没有必要。
  5. 格式
    一致的代码风格:整个代码库应保持一致的风格,包括缩进、空行、括号位置等。这有助于提高代码的可读性和可维护性。
    组织代码:将相关的代码片段组织在一起,比如把变量定义放在一起,把相关的函数放在一起。
  6. 对象与数据结构
    隐藏实现细节:对象应隐藏实现细节,暴露尽量少的接口。这样可以更好地控制代码复杂性。
    使用对象而不是数据结构:当使用对象时,尽量避免暴露内部数据结构,因为这可能导致代码耦合性增加。
  7. 错误处理
    使用异常而不是返回错误代码:异常提供了一种更清晰、结构化的错误处理方式。
    保持错误处理简洁:错误处理代码应该尽可能地简单和集中,不应使代码逻辑变得复杂。
    明确意图的异常:自定义异常类应表达明确的意图,而不是简单地抛出通用异常。
    异常处理:避免使用错误码,而是采用异常处理机制。这可以使错误处理更加直观和易于管理。
    预防优于检查:通过合理的数据验证和边界条件检查,预防错误的发生。这有助于减少运行时错误,并提高系统的稳定性。
  8. 边界
    使用第三方库时的边界处理:理解和控制使用第三方库时的边界,避免因库的升级或变动而影响代码。
    测试边界条件:确保对边界条件进行充分的测试,以避免意外错误。
  9. 单元测试
    测试的价值:单元测试能够确保代码的正确性,并为重构提供安全保障。
    保持测试的整洁:测试代码同样需要整洁、易读。良好的测试代码不仅仅是“工作”,还应该易于理解和维护。
    遵循FIRST原则:测试应该是快速(Fast)、独立(Independent)、可重复(Repeatable)、自验证(Self-Validating)且及时编写的(Timely)。
    测试驱动开发(TDD):先写测试,再写实现。这有助于确保代码功能的正确性,并提高代码的可测试性。
    自动化测试:编写可重复执行的单元测试,以提高代码质量。自动化测试可以减少人为错误,并提高测试效率。

  10. 单一职责原则(SRP):类应该只负责一个领域的功能或职责,过多的职责会导致类的复杂性增加。
    开闭原则(OCP):类应该对扩展开放,对修改关闭。通过继承和多态来实现这一点。
    遵循Liskov替换原则:子类应能够替代基类而不导致程序行为的改变。
    依赖倒置原则:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于具体实现。
  11. 系统设计
    逐步改进系统设计:系统设计应该是渐进的,通过不断地重构来保持代码的整洁和灵活。
    避免过度设计:不要为了扩展性或未来可能的需求而过度设计,保持设计的简单和直接。
  12. 重构
    持续重构:重构是使代码保持整洁和灵活的关键。通过小步的持续重构,避免代码质量的下降。
    自动化测试的支持:重构时,自动化测试能够帮助确保代码行为的正确性。
    消除坏味道:识别并修复代码中的“坏味道”,如过长的方法、重复代码等。这有助于保持代码的整洁和高效。

总结

编写整洁代码是一个过程:它需要不断地审视、修改和改进代码。通过坚持这些原则和实践,开发者可以编写出高质量、易于维护的代码。关注代码的细节:整洁代码的本质是对代码细节的关注。它不仅仅是为了让代码“工作”,更是为了让代码“好用”。
整洁的代码文化:整洁的代码不仅是个人的追求,更需要团队文化的支持。团队成员应共同努力,维护代码库的整洁。《Clean Code》不仅提供了编写整洁代码的指南,更是一种职业素养的体现。通过实践这些原则,开发者可以不断提高代码质量,提升软件开发的整体效率。
《Clean Code(中文完整版)》通过一系列行之有效的整洁代码操作实践,为开发者提供了编写高质量代码的指导。这些实践不仅有助于提升代码的可读性和可维护性,还有助于降低系统的复杂性和提高开发效率。对于任何希望写出优雅、易读代码的开发者来说,这本书都是一本不可多得的经典之作。
通过遵循书中的原则和技巧,我们可以编写出更高质量的代码,从而提高软件的稳定性和可靠性,为团队和项目带来长期的利益。同时,这些原则和技巧也为我们提供了持续改进和优化代码的方法论支持。


http://www.ppmy.cn/news/1516425.html

相关文章

el-form只对rules中个别字段进行校验

正常属性校验方式 const moveToErr () > {const errorDom document.getElementsByClassName(el-form-item__error);console.log(errorDom)if (errorDom.length) {errorDom[0].scrollIntoView({block: center,behavior: smooth})} };const saveItem async (formEl?: For…

机器学习——决策树,朴素贝叶斯

一.决策树 决策树中的基尼系数(Gini Index)是用于衡量数据集中不纯度(或混杂度)的指标。基尼系数的取值范围在0到0.5之间,其中0表示数据完全纯(同一类别),0.5表示数据完全混杂。 基…

linux下部署数据库总结

数据库 数据库主要分为两大类:关系型数据库与 NoSQL 数据库 关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。 NoSQ…

大数据挖掘的步骤是怎样的呢?

大数据挖掘是一个复杂而系统的过程,它利用计算机科学的方法和技术,对大量、多样化、高速增长的数据进行深入挖掘,以发现有价值的信息和知识。以下是大数据挖掘的主要步骤和方法: 一、大数据挖掘的步骤 数据收集: 从各…

[Meachines] [Easy] BoardLight Dolibarr17.0.0-RCE+Enlightenment v0.25.3权限提升

信息收集 IP AddressOpening Ports10.10.11.11TCP:22,80 $ nmap -p- 10.10.11.11 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 06:2…

【Java】IDEA从零到一使用statemachine状态机模拟订单 (图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 认识依赖4.2 使用状态机4.2.1 目录结构4.2.2 状态机解析4.2.2.1 概念4.2.2.…

【Python游戏】Joystick游戏手柄编程介绍

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、正式开始2.1 认识游戏手柄结构2.2 了解pygame.joystick模块简单使用步骤2.3 了解pygame.joystic…

USB详解,配置及难点

一、USB发展历史 二、USB简介 USB有USB1.0/1.1/2.0/3.0多个版本,标准USB由4根线组成,VCC,GND,D,D-,其中D和D-是数据线,采用差分传输。在USB主机上,D-和D都是接了15K的电阻到地,所以在没有设备接入的时候,D、…

网络安全场景化解决方案编写教程(大纲)

目录 1.概述 1.1.项目背景 1.2.项目现状 1.3.项目目标 2.需求分析 3.方案设计 3.1设计依据 3.2设计原则 3.3架构设计 3.3产品设计 3.5服务设计 4.方案收益 5.项目预算 附录A(案例) 附录B(公司资质人员资质等) 1.概…

UnrealEngine学习(02):虚幻引擎编辑器界面详解

学习一款软件,我个人建议是先学习怎么用,然后是学习怎么用的好,再研究源码。 上一篇文章详细描述了我们该如何安装虚幻5引擎: UnrealEngine学习(01):安装虚幻引擎https://blog.csdn.net/zuodingquan666/article/deta…

无人机+消防车:高楼灭火系统技术详解

“无人机消防车”高楼灭火系统技术是一种创新的消防解决方案,旨在解决高层建筑灭火难题。以下是对该技术的详细解析: 一、技术背景与需求 高层建筑数量多,火灾隐患多发。根据国家消防救援局发布的数据,高层建筑火灾频发&#xf…

Robot Operating System——兴趣区域信息

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::RegionOfInterest 是 ROS (Robot Operating System) 中的一个消息类型,用于表示图像中的感兴趣区域 (Region of Interest, ROI)。它通常与图像处理和计算机视觉任务相关联,帮助系统聚焦于图像中的特定…

Java并发编程的核心概念--线程与进程

‌原子性‌:‌操作或多个操作要么全部执行且不被打断,‌要么都不执行。‌这保证了线程在执行操作时不会被其他线程干扰。‌‌可见性‌:‌当多个线程访问同一个变量时,‌一个线程修改了这个变量的值,‌其他线程能够立即…

【MySQL】MySQL表的增删改查(初阶)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 表内容操作 插入内容 按顺序插入 指定某些列插入 一次插入多行记录 插入时间 查询表内容 全列查询 指定列查询 指定表达式查询 用as取别名 ​编辑 去重查询 排序查询…

计算机毕业设计选题推荐-高校学术交流平台-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

基于微信小程序的行李寄存管理系统的设计与实现(论文+源码)_kaic

基于微信小程序的行李寄存管理系统的设计与实现(论文源码)_kaic 摘 要 人们外出旅行的时候,经常会需要到行李寄存的服务。行李寄存处在全国各地都很常见。现存的行李寄存方式很传统,适合小规模的行李寄存,当行李数量较多时,就…

JVM常见面试题总结

文章目录 1 JVM 组成1.1 JVM架构组成🔥1.2 JVM 内存结构/内存模型🔥1.3 堆和栈区别🔥1.4 详细的介绍 Java 堆🔥1.5 JVM 为什么使用元空间替换了永久代?🔥1.6 内存溢出与内存泄漏的区别🔥1.7 OOM…

根据数据库设计开发一套通用的电子商务平台

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(9 分) 【问题 3】(7 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于数据库设计的叙述,在答题纸上回答问题 1 至问题 3。 【题目】 某制造企业为拓展网上销售业…

河南萌新联赛2024第(六)场:郑州大学(补题ABCDFGIL)

文章目录 河南萌新联赛2024第(六)场:郑州大学A 装备二选一(一)简单介绍:思路:代码: B 百变吗喽简单介绍:思路:代码: C 16进制世界简单介绍&#x…

es相关概念、索引操作(相当于mysql中的数据库操作)

文章目录 1、概念2、索引操作(index)2.1、查询索引(数据库)2.2、创建索引(数据库)2.3、查看单个索引(数据库)2.4、删除索引(数据库) 1、概念 RDBMSesMongoDB…