当前位置: 首页 > 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
  • 枚举优先变量

相关文章:

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

如果要把这本书最关键、最核心、被反复提及和强调的重点提炼出来,那就是: 可读性高于一切: 你的代码是给人读的,让它像一篇清晰的文章一样易于理解。表达意图是关键。短小、单一: 函数要短小,类要短小&…...

项目代码生成工具

代码生成工具 文章目录 代码生成工具提取公共类domainbodtoentityvoBean基类 代码生成工厂连接配置模版1、基础类基类Entity添加DTO类分页查询DTO基础查询DTO修改DTO视图VO 2、controller2、service接口3、service实现类4、Mapper接口5、Mapper的xml文件 提取公共类 比方说每个…...

【机器学习驱动的智能化电池管理技术与应用】

在人工智能与电池管理技术融合的背景下,电池科技的研究和应用正迅速发展,创新解决方案层出不穷。从电池性能的精确评估到复杂电池系统的智能监控,从数据驱动的故障诊断到电池寿命的预测优化,人工智能技术正以其强大的数据处理能力…...

【MySQL 】MySQL 安装自记录全程-详细 (mysql-installer-community-8.0.42.0.msi)

看了一些别人的文章,其实还有些困惑,根据不少都有一些跟我遇到的不太一样,记录一下自己的安装过程 MySQL 安装(Windows) 下载 MySQL 安装包 MySQL数据库官网链接 MySQL (MySQL的https://www.mysql.com/ …...

构建事件驱动的云原生后端系统 —— 从设计到实践

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为什么需要事件驱动架构? 在现代互联网应用中,系统规模越来越大,功能模块越来越复杂,用户行为越来越不可预测。 传统的同步调用、强耦合的后端架构,面对大规模并发、高频变化、复杂交…...

时间复杂度和空间复杂度 [数据结构 初阶]

目录 算法效率 1. 时间复杂度 1.1 时间复杂度概念 1.2 大O 的渐进表示法 1.2.1 计算 func1 的基本操作执行了多少次 1.3 推导 大O 阶方法 2. 空间复杂度 算法效率 // 算法效率分析分为两种: 1) 时间效率: 时间复杂度, 用来衡量一个算法的运行速度; 2) 空间效率: 空间复…...

SpringMVC 通过ajax 前后端数据交互

在前端的开发过程中,经常在html页面通过ajax进行前后端数据的交互,SpringMVC的controller进行数据的接收,但是有的时候后端会出现数据无法接收到的情况,这个是因为我们的参数和前端ajax的contentType参数 类型不对应的情景&#x…...

Qt从零开始(1)了解

文章目录 1. Qt技术介绍2. 开发GUI的选择3. 框架的介绍4.Qt发展历程(简单介绍)5. Qt支持的系统6. Qt开发方式7.Qt优点总结 简介:这篇文章简单介绍下Qt的相关知识与应用场景,随便看看,了解了解即可。如果介绍有误或者描…...

当元数据遇见 AI 运维:智能诊断企业数据资产健康度

在数字化浪潮席卷全球的当下,企业数据资产规模呈指数级增长,然而传统数据监控方式却逐渐暴露出诸多弊端。想象一下,在某头部电商的晨会上,数据工程师小王正经历职业生涯最尴尬的时刻:“昨天促销活动的 UV 数据为什么比…...

关于OCP认证:有Oracle和MySQL两种

认证针对的数据库系统 MySQL OCP:是 Oracle 公司针对 MySQL 数据库管理员和开发者设计的认证,主要验证持证者在 MySQL 数据库管理、优化及安全等方面的技术能力。MySQL 是开源的关系数据库管理系统,以其简单、高性能和灵活性在中小型企业及开…...

Macos m系列芯片环境下python3安装mysqlclient系列问题

最近学习python3,在安装mysqlclient的时候遇到了一些问题,直接使用哦pip install mysqlclient 直接报错了,记录一下解决方案。 环境信息 设备:Macbook Pro m1 系统:macos Sequoia 15.3.2 最终成功的python版本&#xf…...

《代码整洁之道》第7章 错误处理 - 笔记

得墨忒耳定律 不要链式调用, 如 a.getB().getC().doSomething()。 直接获取对象调用方法 数据传输对象(DTOs) DTO (Data Transfer Object): 数据传输对象。这是一种典型的数据结构。 里面没有任何业务逻辑代码。它的唯一作用就…...

java-mybatis01

对象/关系映射ORM ORM完成面向对象的编程语言DAO关系数据库的映射后,开发人员可以利用面向对象设计语言的建议易用性,也可利用关系数据库的技术优势。 ORM把关系数据库包装成面向对象的模型,采用ORM框架后,应用程序不再直接访问底…...

单片机之间的双向通信

具体功能实现 甲单片机通过按键可以控制乙单片机的LED灯,而乙单片机通过可以让连接甲单片机的数码管数字自增加一。 定时器资源 3个定时器 中断系统 执行现程序的过程中,出现某些急需处理的异常情况或特殊请求,cpu暂时中止现行程序&…...

量子纠缠式架构:当微服务同时存在于所有节点时,CAP定理是否依然成立?

一、CAP定理的经典困境 1. 传统分布式系统的三维束缚 经典权衡案例: 系统类型选择代价银行核心系统CP故障时拒绝服务社交网络AP短暂数据不一致物联网平台CA网络中断即崩溃 二、量子纠缠的降维打击 1. 量子微服务的超距同步 # 量子纠缠服务示例(Qiski…...

使用rsync和inotidy-tools来进行实时备份文件夹数据

在工作中遇到这个这么个需求,就是我们有一个samba的文件共享服务器,里面存了很多文件,然后我想实时备份这个samba共享文件的。 1、概述 只需要在源服务器上操作,并在源服务器上安装好rsync和inotidy-tools,目标服务器…...

Spring AI 实现智能对话

1. 实现效果 2. Spring Boot 3 后端 2.1 pom.xml <!-- 管理包依赖。通过 Spring AI 的 BOM 文件统一管理所有 Spring AI 相关依赖的版本&#xff0c;确保版本一致性&#xff0c;减少冲突 --><dependencyManagement><dependencies><!-- Spring AI -->…...

2025 网络安全技术深水区探索:从 “攻防对抗” 到 “数字韧性” 的范式跃迁

引言&#xff1a;当攻击成本趋近于零&#xff0c;防御逻辑必须重构 2025 年&#xff0c;网络安全领域正经历三重根本性变革&#xff1a; 攻击者门槛坍缩&#xff1a;生成式 AI 将网络钓鱼开发效率提升 300%&#xff0c;勒索软件即服务&#xff08;RaaS&#xff09;订阅用户突破…...

学习笔记—双指针算法—移动零

双指针算法 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进…...

计算机网络全栈精讲:从 TCP/UDP 原理到 Socket 编程与 HTTP 协议实战(含代码实现)

计算机网络作为现代信息技术的基石&#xff0c;支撑着互联网、物联网、云计算等众多领域的发展。无论是前端开发者、后端工程师&#xff0c;还是运维人员&#xff0c;深入理解计算机网络原理都至关重要。本文将从网络分层模型出发&#xff0c;逐步深入讲解 TCP/UDP 协议、Socke…...

IP地址如何切换到国内别的省份?一步步指导

使用换IP工具的主要目的是通过更换设备的公网IP地址来满足特定需求&#xff0c;例如绕过限制、保护隐私或完成特定任务。以下是常见的应用场景和原因&#xff1a; 一、ip应用场景 1. 绕过IP限制 访问地域限制内容&#xff1a;某些网站或服务&#xff08;如游戏、社交平台 &am…...

c++流对象

核心概念回顾&#xff1a; C 的流库 (<iostream>, <fstream>, <sstream>) 提供了一种统一的方式来处理输入和输出&#xff0c;无论数据是来自键盘、文件还是内存中的字符串。它们都基于 std::istream (输入流基类) 和 std::ostream (输出流基类)&#xff0c…...

华为IP(5)

交换机的堆叠与集群 堆叠和集群指的是同一件事 前言: 随着企业的发展&#xff0c;企业网络的规模越来越大&#xff0c;这对企业网络提出了更高的要求&#xff1a;更高的可靠性、更低的故障恢复时间、设备更加易于管理等。 传统的园区网高可靠性技术出现故障时很难做到毫秒级…...

零信任架构下的等保 2.0 与密评密改双合规

随着《网络安全等级保护2.0》和《商用密码应用安全性评估》的深入实施&#xff0c;企业面临双重合规压力&#xff1a;既要满足等保2.0对“主动防御”和“动态防护”的要求&#xff0c;又要通过密评密改强化密码技术的合规性。传统安全架构依赖边界防护和静态密码策略&#xff0…...

华为 MRAG:多模态检索增强生成技术论文阅读

GitHub项目链接&#xff1a;https://github.com/PanguIR/MRAGSurvey 总览 多模态检索增强生成&#xff08;MRAG&#xff09;通过将文本、图像、视频等多模态数据整合到检索与生成过程中&#xff0c;显著提升了多模态大语言模型&#xff08;MLLM&#xff09;的性能。传统检索增…...

文字光影扫过动效

列子1 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>光影扫过文字动效</title><styl…...

SpringBoot配置RestTemplate并理解单例模式详解

在日常开发中&#xff0c;RestTemplate 是一个非常常用的工具&#xff0c;用来发起HTTP请求。今天我们通过一个小例子&#xff0c;不仅学习如何在SpringBoot中配置RestTemplate&#xff0c;还会深入理解单例模式在Spring中的实际应用。 1. 示例代码 我们首先来看一个基础的配置…...

计算机网络应用层(5)-- P2P文件分发视频流和内容分发网

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f493;本博客内容为《计算机网络&#xff1a;自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…...

C++ TCP通信原理与实现

C 中 TCP 通信的原理基于 TCP/IP 协议栈的实现&#xff0c;以下是核心原理和关键步骤的详细说明&#xff1a; 一、TCP 通信核心原理 面向连接 通信双方需通过 三次握手 建立可靠连接&#xff0c;确保通信通道稳定。通过 四次挥手 断开连接&#xff0c;保证数据完整性。 可靠传…...

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

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

学习spark-streaming收获

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

蓝桥杯 14. 奇怪的数列

奇怪的数列 原题目链接 题目描述 从 X 星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a; 13 1113 3113 132113 1113122113 ⋯⋯YY 博士经彻夜研究&#xff0c;发现了规律&#xff1a; 第一行的数字随便是什么&#xff0c;以后每一行都是对上一行 “读出…...

前端高频面试题day2

如何在vue3中使用defineAsyncComponent实现异步组件加载 在 Vue 3 中&#xff0c;使用 defineAsyncComponent 实现异步组件加载的步骤如下&#xff1a; 引入方法&#xff1a;从 Vue 中导入 defineAsyncComponent。定义异步组件&#xff1a;通过 defineAsyncComponent 包装一个…...

Linux系统之设置开机启动运行桌面环境

Linux 开机运行级别介绍与 Ubuntu 桌面环境配置指南 一、Linux 开机运行级别(Runlevel) 在传统的 Linux 系统(如 SysV init 初始化系统)中,运行级别定义了系统启动时加载的服务和资源。常见的运行级别如下: 运行级别模式用途0Halt(停机模式)关闭系统1Single User Mode…...

Python PyAutoGUI库【GUI 自动化库】深度解析与实战指南

一、核心工作原理 底层驱动机制&#xff1a; 通过操作系统原生API模拟输入使用ctypes库调用Windows API/Mac Cocoa/Xlib屏幕操作依赖Pillow库进行图像处理 事件模拟流程&#xff1a; #mermaid-svg-1CGDRNzFNEffhvSa {font-family:"trebuchet ms",verdana,arial,sans…...

【MobaXterm】win10下载v25.1安装流程

【下载地址】 官网&#xff1a; https://mobaxterm.mobatek.net/ 下载安装版&#xff0c;解压使用更快一些 【v20.0中文安装包】 夸克网盘&#xff1a;https://pan.quark.cn/s/2ad5b59e6d8e#/list/share 对应的指导教程&#xff1a; MobaXterm中文版安装使用教程-附安装包…...

2025.4.22 JavaScript 常用事件学习笔记

一、事件概述 JavaScript 事件是指在用户与网页交互或网页状态发生变化时所触发的操作。通过使用事件&#xff0c;可以为网页添加丰富的动态功能&#xff0c;实现用户与页面之间的互动&#xff0c;让网页不再只是静态的展示内容。 二、常见鼠标事件 click 事件 简介 &#xf…...

Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现

Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现 文章目录 需求&#xff1a;参考资料架构图了解Camera相关专栏零散知识了解部分相机源码参考&#xff0c;学习API使用&#xff0c;梳理流程&#xff0c;偏应用层Camera2 系统相关 修改文件-修改方案修改文件&#xff1a;修改…...

Linux:基础IO 文件系统

Linux:基础IO && 文件系统 一、系统IO&#xff08;一&#xff09;系统文件操作接口1、open2、write3、read &#xff08;二&#xff09;文件描述符1、概念2、标准输入、标准输出、标准错误 &#xff08;三&#xff09;dup系统调用&#xff08;重定向原理&#xff09; 二…...

近期有哪些断链危机?如何提升供应链风险管理能力?

全球供应链格局正经历深刻变革&#xff0c;其网络架构愈发复杂&#xff0c;涉及多国企业主体且涵盖多个节点与复杂环节&#xff0c;管理难度显著增大。从原材料采购到终端交付&#xff0c;运输、仓储、加工等任一环节均存在潜在风险&#xff0c;单一环节效率滞后易引发系统性连…...

知识科普|褪黑素的发展历程及应用研究进展

睡眠作为维持人体健康的重要生理机制&#xff0c;其节律性受到精密调控。在昼夜节律系统的调控下&#xff0c;人类普遍遵循周期性单次睡眠模式&#xff0c;这一过程涉及复杂的神经-体液调控网络。其中神经元活动、神经递质传导、激素分泌及遗传调控机制共同作用于睡眠觉醒系统&…...

企业如何构建一个全面的Web安全防护体系

企业如何构建一个全面的Web安全防护体系 企业构建全面的Web安全防护体系需融合战略规划、技术防御、持续运营和风险治理四大维度&#xff0c;以下是基于行业最佳实践的系统化方案&#xff1a; 一、顶层设计&#xff1a;治理架构与安全战略 战略规划与合规驱动 制定网络安全愿…...

T8332FN凯钰LED驱动芯片多拓扑车规级AEC-Q100

T8332FN是一款支持多拓扑结构的恒流LED驱动控制芯片&#xff0c;适用于汽车照明及高功率LED应用&#xff0c;具备宽电压输入、高精度调光及多重保护功能。 核心特性 - 输入与拓扑&#xff1a;支持5-60V宽电压输入&#xff0c;适配Boost、Buck、Buck-Boost、SEPIC四种拓扑结构&…...

Redis一些小记录

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

Win10安装 P104-100 驱动

安装完之后总结一下, 之前做了不少功课, 在网上搜了很多教程, 视频的文字的, 但是很多已经比较陈旧了. 最后发现的这个 GitHub 项目 NVIDIA-patcher 是最有用的, 因为这是现在这些魔改驱动的来源. NVIDIA-patcher 仓库地址: https://github.com/dartraiden/NVIDIA-patcher 安…...

Android开机动画资源包制作(测试使用)

开机动画资源包需要采用仅存储的方式进行压缩&#xff0c;不能使用压缩软件直接压缩生成。 如果是系统开发人员&#xff0c;可以在源码目录中&#xff0c;采用bootanim程序提供的制作方式进行&#xff0c;下面可供测试人员自行制作。 制作流程 1&#xff09;基于设备中已有开…...

PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell

测试源码&#xff1a; #include<stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0, str, 0x50);printf(str);read(0, str, 0x50); } int main() {func();return 0; } 编译&#xff0c;开启 canary 保护&#xff0c;关闭 p…...

Kafka HA集群配置搭建与SpringBoot使用示例总结

Kafka HA集群配置搭建与SpringBoot使用示例总结 一、Kafka高可用(HA)集群搭建 1. 环境准备 至少3台服务器&#xff08;推荐奇数台&#xff0c;如3、5、7&#xff09;已安装Java环境&#xff08;JDK 1.8&#xff09;下载Kafka二进制包&#xff08;如kafka_2.13-3.2.1.tgz&…...

MSO-Player:基于vlc的Unity直播流播放器,支持主流RTSP、RTMP、HTTP等常见格式

MSO-Player 基于libVLC的Unity视频播放解决方案 支持2D视频和360度全景视频播放的Unity插件 &#x1f4d1; 目录 &#x1f3a5; MSO-Player &#x1f4cb; 功能概述&#x1f680; 快速入门&#x1f4da; 关键组件&#x1f4dd; 使用案例&#x1f50c; 依赖项&#x1f4cb; 注意…...

97A6-ASEMI无人机专用功率器件97A6

编辑&#xff1a;ll 97A6-ASEMI无人机专用功率器件97A6 型号&#xff1a;97A6 品牌&#xff1a;ASEMI 封装&#xff1a;SOT-23 批号&#xff1a;最新 引脚数量&#xff1a;3 特性&#xff1a;双向可控硅 工作温度&#xff1a;-40℃~150℃ ‌97A6双向可控硅&#xff1a…...