- 博客(65)
- 收藏
- 关注
原创 代码重构精要:提升代码品质的艺术(汇总篇)
这一系列文章系统性地介绍了代码重构的核心原则、技术方法和实践案例。内容涵盖重构的基本概念、原则、代码"坏味道"识别方法,以及第一组重构技巧(如提炼/内联函数、变量处理等)。文章强调重构是改善代码设计而不改变外在行为的过程,通过小步修改保持代码可工作状态。重点分析了24种常见代码问题(如重复代码、过长函数等)及其重构方案,并提供了测试体系的构建方法。文章采用"名称-速写-动机-做法-范例"的结构化方式呈现重构技术,帮助开发者提升代码质量与可维护性。
2025-09-28 17:51:00
814
原创 (八)掌握继承的艺术:重构之路,化繁为简
继承是面向对象编程中一把双刃剑,它强大而又易于被滥用。在软件开发的旅程中,我们常常会发现继承体系需要不断地调整和优化。本章将深入探讨一系列旨在处理继承关系、提升代码可读性和可维护性的重构手法。无论是函数和字段在继承体系中的上下移动,还是为继承体系添加或删除类,亦或是将继承转换为委托,这些技巧都将帮助你更好地驾驭继承的复杂性,让你的代码更加健壮和灵活。
2025-09-28 17:42:22
1168
原创 (七)API 重构的艺术:打造优雅、可维护的 API
本章探讨API重构艺术,重点介绍"将查询函数和修改函数分离"技巧。良好API设计应遵循命令与查询分离原则,即查询函数只返回值不产生副作用,修改函数只改变状态不返回值。重构步骤包括:复制原始函数、创建纯查询版本、移除查询函数中的副作用、修改调用点、最终清理原始函数使其仅执行修改。通过这种分离,代码更清晰、更易测试和维护。示例展示了如何重构一个同时查找捣乱者和触发警报的函数,将其拆分为纯查询函数和纯修改函数,提高代码的可读性和安全性。
2025-09-26 17:29:43
899
原创 (六)重构的艺术:简化复杂条件逻辑的秘诀
本文介绍了简化复杂条件逻辑的多种重构技巧,主要包括分解条件表达式、合并条件表达式、以卫语句取代嵌套条件表达式、多态取代条件表达式等。通过将复杂条件逻辑分解为多个独立函数,可以显著提升代码可读性。示例展示了如何将一个包含季节判断的价格计算函数重构为多个小函数,每个函数职责单一且命名清晰,使逻辑更易于理解。此外还介绍了处理特殊情况的技巧,如引入特例模式和断言机制,帮助开发者编写更简洁、更易维护的条件逻辑代码。
2025-09-25 15:56:57
853
原创 (五)数据重构的艺术:优化你的代码结构与可读性
本文探讨了优化数据组织的重构策略,以提高代码可读性和健壮性。主要方法包括:1)拆分变量,使每个变量只承担单一职责;2)改进字段命名,提升代码表达力;3)用查询取代派生变量,减少数据不一致风险。这些重构技巧能简化数据结构,降低维护复杂度,使系统更可靠。通过示例代码对比展示了重构前后的效果差异。
2025-09-24 17:37:12
589
原创 (四)优雅重构:洞悉“搬移特性”的艺术与实践
本文总结了重构中的"搬移特性"系列手法,包括搬移函数、搬移字段和搬移语句到函数等核心技巧。作者通过Java代码示例展示了如何将方法或字段移动到更合适的类中,以提高代码的内聚性和封装性。例如,当一个方法频繁使用其他类的数据时,应该将其搬移到数据所在的类;当字段在语义上属于另一个类时,也应进行相应调整。这些重构手法能有效减少代码重复、降低耦合度,使系统结构更加清晰合理。文章强调,良好的数据结构是健壮程序的基础,通过精心设计的重构可以让代码库保持健康状态。
2025-09-24 15:59:18
772
原创 (三)封装与结构优化:让代码更优雅
封装与结构优化提升代码质量 本文探讨了两种关键的重构技术:封装记录和封装集合。通过封装记录,将原始数据结构转换为数据类,隐藏实现细节并集中业务逻辑,提高代码可维护性和类型安全性。封装集合则通过返回集合副本或提供受控访问接口,防止外部意外修改,增强数据控制能力。文章通过Java代码示例展示了重构前后的对比,强调这些技术如何使代码更优雅、健壮。这些重构手法是提升软件质量、降低维护成本的有效实践。
2025-09-23 17:42:33
745
原创 (二)重构的艺术:精进代码的第一组基本功
在软件开发中,我们常常追求优雅、高效且易于维护的代码。但代码的生命周期很长,需求不断变化,最初的“完美”设计也会随着时间流逝而变得臃肿、复杂。这时,“重构”就成了我们手中的瑞士军刀,帮助我们持续改进代码内部结构,而不改变其外部行为。本篇博客将带你深入了解重构的第一组核心手法,它们如同武者的基本功,虽看似简单,却是构建高质量代码的基石。掌握了它们,你就能更好地理解和驾驭代码,让你的程序更健壮、更灵活、更具可读性。
2025-09-22 16:54:41
1054
原创 (一)代码匠心:重构之道,化腐朽为神奇
本文系统介绍了软件重构的核心概念与实践方法。主要内容包括:1) 重构的定义与价值,强调通过小步修改优化代码结构而不改变外在行为;2) 重构原则,包括"两顶帽子"开发模式和识别重构时机;3) 24种常见代码坏味道及其重构建议,如神秘命名、重复代码等;4) 测试体系的重要性与最佳实践;5) 结构化重构方法,包含动机、步骤和示例。文章指出重构是持续改进的过程,能提高代码可维护性、发现潜在缺陷并提升开发效率,建议将重构纳入日常开发流程。
2025-09-18 17:18:55
673
原创 Maven精通指南:从依赖管理到项目构建与私服实践
Maven是一个重要的依赖管理工具,主要用于解决项目中jar包管理复杂的问题。随着项目框架增多,依赖的jar包数量可能达到上百个,例如仅使用SpringBoot和SpringCloud的几个功能就导入了106个jar包。Maven通过统一管理这些依赖关系,简化了项目的构建和维护过程,提高了开发效率。
2025-09-02 15:19:53
861
原创 启动!Spring Boot
Spring Boot是基于Spring框架的轻量级开发工具,旨在简化Spring应用的初始搭建和开发过程。它采用"约定优于配置"原则,提供自动配置、内嵌服务器和starter依赖管理等功能,大大提升了开发效率。核心优势包括开箱即用、无代码生成、准生产环境监控等。 微服务架构是一种将单体应用拆分为独立小型服务的架构风格。每个服务可独立开发部署,通过轻量级通信机制交互。相比单体架构,微服务具有技术异构、独立扩展等优势,但也带来分布式系统复杂性等挑战。
2025-09-01 17:47:27
916
原创 Spring MVC 全解析:从核心原理到 SSM 整合实战 (附完整源码)
这篇Spring MVC学习笔记,从MVC架构基础到Spring MVC核心原理与实战全面覆盖。主要内容包括: MVC架构回顾:从Servlet到Spring MVC的演进过程 Spring MVC核心:DispatcherServlet原理与执行流程 实战开发:配置版与注解版实现、RESTful风格、JSON交互 进阶技术:SSM整合、Ajax异步通信、拦截器应用 实用功能:文件上传下载、乱码处理等常见问题解决方案 文章结合大量代码示例和实战经验(如小黄鸭调试法),配套源码
2025-08-26 15:44:03
474
原创 告别笼统的 200 OK:一份给 API 设计者的 HTTP 状态码终极指南
HTTP状态码使用规范摘要 HTTP状态码是RESTful API设计的重要组成部分,应规范使用以提升API可用性。核心建议: 成功类(2xx): 200:通用成功响应 201:资源创建成功 204:成功但无返回内容 客户端错误(4xx): 400:通用参数错误(推荐) 401:未认证 403:无权限 404:资源不存在 422:参数语义错误(可选) 服务器错误(5xx):500表示通用服务器错误 关键原则:避免所有响应都返回200,应根据实际情况选择最精确的状态码。400适用于大多数参数验证场景
2025-08-21 16:36:43
948
原创 告别 Java 5 时代:一文彻底解决 IntelliJ IDEA 默认 JDK 版本问题
IntelliJ IDEA新建项目时默认使用Java 5语言级别,导致无法使用新语法特性。解决方案分三步:1)临时修改当前项目的SDK和Language Level;2)通过“New Projects Setup”永久设置新项目的默认JDK版本;3)针对Maven/Gradle项目,需额外检查并配置构建脚本中的Java版本(如pom.xml或build.gradle),确保优先级生效。三步操作可彻底解决默认JDK版本过低的问题,提升开发效率。
2025-08-21 10:28:09
1004
原创 循序渐进学 Spring (下):从注解、AOP到底层原理与整合实战
本文是《循序渐进学 Spring》系列的下半部分,在前篇 IoC/DI 的基础上,深入探讨了 Spring 的高级特性与实战整合。文章从 XML 自动装配出发,逐步过渡到现代化的 @Autowired、@Resource 等注解开发模式,并最终介绍了完全摆脱 XML 的 JavaConfig 配置方式。为揭示 Spring AOP 的底层原理,笔记详细讲解了静态代理与 JDK 动态代理,并对比了 Spring AOP 的三种实现方式,突出了 @AspectJ 注解的优越性。
2025-08-18 16:27:02
405
原创 循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
本文是作者在学习Spring框架时整理的笔记,重点介绍了Spring的核心概念和IoC(控制反转)原理。文章从Spring的发展历史、优点和模块组成开始,强调理解Spring底层原理对Java开发者进阶的重要性。通过一个用户服务(UserService)的实例,逐步演示了从传统高耦合开发方式到使用Setter方法实现依赖注入的改进过程,展现了IoC如何降低代码耦合度。作者指出虽然Spring Boot已成为主流,但掌握Spring Framework的IoC和AOP等核心概念仍是必备基础
2025-08-13 17:38:12
845
原创 告别繁琐SQL!MyBatis-Plus超详细实战指南 (附完整源码)
MyBatis-Plus 是一个强大的 MyBatis 增强工具,旨在简化开发、提高效率。本文从环境搭建到核心功能实现,详细介绍了 CRUD、乐观锁、逻辑删除、分页查询等核心特性,还包含代码生成器和多数据源配置等高级主题。通过继承 BaseMapper 接口即可获得强大的单表操作能力,无需编写繁琐的 XML 文件。配套源码已上传 Gitee,适合 MyBatis 开发者系统学习或快速上手 MyBatis-Plus。
2025-08-12 15:40:04
784
原创 【新手极简入门指南】我刚学Git,只会这几招就够用了!
本文是一篇Git新手入门指南,重点介绍了四个核心使用场景:克隆远程仓库、日常提交工作流程、版本回退操作以及强制推送。文章以通俗易懂的语言解析了git clone、git add/commit/pull/push、git reset等常用命令,并强调提交规范和团队协作注意事项。指南包含具体命令示例和场景化解释,帮助初学者快速掌握Git基础操作,同时提醒谨慎使用强制推送等危险操作。通过本文,读者可以系统学习Git的日常开发工作流和版本管理技巧。
2025-08-08 09:42:24
842
原创 MyBatis:让你的Java代码不再“硬扛”数据库
本文介绍了数据持久化技术及其常见实现方式(关系型数据库、ORM、NoSQL、文件系统),并详细阐述了MVC架构中的Dao层(数据访问)、Service层(业务逻辑)和Controller层(交互控制)的分层设计。重点分析了MyBatis框架的优势:简化数据库操作、支持灵活SQL编写、易于集成和性能优化。通过User案例展示了MyBatis的核心组件(SqlSessionFactory/SqlSession)和配置使用方法,包括映射文件编写和Java代码调用示例。
2025-08-07 17:10:34
718
原创 【MyBatis新手避坑】详解 `Could not find resource ...Mapper.xml` 错误
MyBatis新手常遇到的ExceptionInInitializerError错误,根源在于Maven/Gradle构建工具默认不打包src/main/java下的XML资源文件。本文剖析了错误原因,指出Could not find resource的实质是映射文件未被正确编译到target/classes目录。推荐两种解决方案:最佳实践是将Mapper.xml移至src/main/resources并保持相同包结构;备选方案是修改pom.xml强制包含java目录的XML文件。
2025-08-06 16:27:50
828
原创 Maven Archetype 该选哪个?一文读懂 IntelliJ IDEA 中的项目“模板”
本文解析了IntelliJ IDEA中Maven Archetype的选择问题,重点介绍了三种常用模板的区别:maven-archetype-quickstart适用于通用Java项目开发,是大多数情况的首选;maven-archetype-webapp专为传统Java Web项目设计;maven-archetype-j2ee-simple则针对重量级企业应用。文章通过对比表格帮助开发者快速选择适合的模板,例如学习MyBatis时应选择quickstart。正确的Archetype选择能为项目建立规范结构,
2025-08-06 15:26:03
1670
原创 常用 MySQL 命令清单-供快速查询的Handbook
本文提供了一份MySQL常用命令速查手册,涵盖数据库连接、数据库/表操作、数据增删改查以及用户权限管理等核心功能。主要内容包括:1)数据库连接与服务器信息查询;2)数据库创建、选择与删除;3)表的创建、修改与删除;4)数据的增删改查操作(CRUD),包括条件查询、排序、分组和连接查询;5)用户创建、权限授予与撤销等管理操作。手册采用分类编排方式,每个命令均配有简明示例,便于开发者快速查阅和掌握MySQL的基本操作。
2025-08-06 09:30:39
909
原创 “命令行过长“?一键解决 IntelliJ IDEA 中 Java/Spring Boot 启动失败问题
当Spring Boot项目依赖过多时,启动命令的classpath参数会超出操作系统限制,导致命令行过长错误。解决方法是在IDEA的运行配置中,将Shorten command line选项从none改为JAR manifest或@argfile,让IDE通过临时文件传递依赖路径。还可在配置模板中修改此设置,一劳永逸解决问题。
2025-08-05 14:53:45
1616
原创 位运算基本运算符,优先级,运算律,高级操作,以及具体应用
位运算,这一计算机科学中的低层操作,常被认为是高级编程中的秘密武器。例如,5 ^ 3 结果是 6,因为 0101 ^ 0011 等于 0110。这些操作包括位与(&)、位或(|)、位异或(^)和位非(~)。例如,~5 结果是 -6,因为 ~0101 等于 1010(考虑到计算机中的补码表示)。例如,5 & 3 结果是 1,因为 0101 & 0011 等于 0001。):对两个操作数的每一位进行逻辑或运算。例如,5 | 3 结果是 7,因为 0101 | 0011 等于 0111。
2024-09-18 11:37:52
468
原创 MySQL 一行记录是怎么存储的
row_id非必须,若建表指定主键或唯一约束列,则无此字段6 字节trx_id事务 id,表示数据记录对应的生成事务编号必须的6 字节上一版本的指针,与trx_id用于 MVCC 机制必须的7 字节。
2024-07-16 22:35:38
1334
原创 执行一条 select 语句,期间发生了什么
在MySQL数据库中,show processlist 的结果中出现的 Id 是怎么分配的,为什么只有一个连接的时候Id为2,而不是1?这里说的查询缓存是 server 层的,不是 Innodb 存储引擎中的 buffer pool。对于一个表,只要有更新操作,就清空这张表的查询缓存,所以查询缓存比较鸡肋。解析器只是负责检查语法和构建语法树,不负责检查表或字段是否存在。由 ON 设置为 OFF 或者 DEMAND。,后面的逻辑判断都基于此处的权限。(TCP,三次握手)客户端的用户名和密码。
2024-07-14 17:02:55
421
原创 父类与子类的构造函数,静态代码块,实例化初始代码块的执行顺序
Parent实例化初始代码块-1。Parent实例化初始代码块-2。Parent静态代码块-1。Parent静态代码块-2。Son实例化初始代码块-1。Son实例化初始代码块-2。Son静态代码块-1。Son静态代码块-2。Parent无参构造。
2024-06-15 12:35:24
648
原创 SpringMVC
过滤器的设计初衷是为了处理 Servlet 请求和响应,它们并不属于 Spring 容器的管理范围,因此在过滤器中无法直接通过 Spring 上下文来访问 Spring 托管的 Bean。控制器:一个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的 JavaBean,并将处理结果存放到实体模型 JavaBean 中,输出给视图显示。图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
2024-06-11 15:04:27
1751
原创 Spring5
文章目录1. Spring 是什么?2. IoC3. Spring Demo4. IoC 创建对象的方式 / DI 方式注入的默认参数在哪里设定?5. Spring 配置tx:annotation-driven 用于启用基于注解的事务管理6. Bean的作用域7. 在Spring中有三种自动装配的方式1. 在xml中显式的配置2. 在java中显式配置3. 隐式的自动装配bean。【重要!】byName 自动装配byType 自动装配8. 注解9. applicationContext.xml与beans.
2024-06-10 23:02:12
1014
原创 Mybatis
在MyBatis中,Mapper接口中的方法都是定义了对数据库的操作,而这些方法的具体实现是由MyBatis框架在运行时动态生成的。MyBatis 中的缓存是一种用于提高性能的重要机制,它可以在应用程序和数据库之间缓存查询的结果集,从而避免频繁地访问数据库,提高系统的响应速度。在MyBatis中,通过反射机制,可以在运行时解析注解,并根据注解中的信息来动态生成对应的SQL语句或者执行相应的数据库操作。在多对一关联关系中,按照查询嵌套处理意味着在执行查询时,同时查询关联对象的信息,然后将其映射到主对象中。
2024-06-10 13:05:50
1005
原创 JavaWeb
文章目录Web 应用程序分为静态 Web 应用程序和动态 Web 应用程序静态 Web 应用程序:动态 Web 应用程序:1.基本概念1.前言2.web应用程序3.静态web4.动态web2.web服务器1.技术讲解2.web服务器3.Tomcat1. 安装tomcat2.Tomcat启动和配置3.配置高难度面试题 -- 请你谈谈网站是如何进行访问的!4.发布一个web网站4.Http1.什么是HTTP2.两个时代3.Http请求4.Http响应5.Maven1. Maven项目架构管理工具2.下载安装Ma
2024-06-09 23:01:42
1807
原创 xiaolingcoding 图解网络笔记——基础篇
网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。我们不希望传输层协议处理太多的事情,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是。转发的过程中,源IP地址和目标IP地址是不会变的(前提:没有使用 NAT 网络的),源 MAC 地址和目标 MAC 地址是会变化的。这样可以减少中断处理的频率,降低系统的负载。
2024-06-07 18:50:33
2637
原创 IO流,文件操作
目录参考零、io-流简介一、文件(File类)1.1 File概述1.2 构造方法1.3 常用方法1.3.1 获取功能的方法1.3.2 绝对路径和相对路径1.3.3 判断功能的方法1.3.4 创建删除功能的方法1.4 目录的遍历1.5 递归遍历文件夹下所有文件以及子文件二、字节流1. InputStream(字符输入流)FileInputStream类FileInputStream的构造方法2. OutputStream(字符输出流)FileOutputStream类FileOutputStream构造方法
2024-06-05 22:56:03
1273
原创 网络编程基础
计算机网络: 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。网络编程的目的:无线电台…传播交流信息,数据交换,通信。如何让准确的定位网络上的一台主机 192.168.16.124:端口, 定位上这个计算机上的某个资源。找到了这个主机,如何传输数据呢?Javaweb:网页编程 、 B/S架构网络编程:TCP/IP 、 C/S。
2024-06-02 22:58:16
1368
原创 JVM(Java虚拟机)、JMM(Java内存模型)笔记
什么是垃圾不再被程序所引用的对象或数据为什么需要GC简化内存管理防止内存泄漏降低内存碎片化,提高内存利用率应该关心哪些区域的回收垃圾收集器可以针对不同区域进行回收,包括年轻代、老年代、全栈(包括本地方法栈和虚拟机栈)以及方法区(元空间)等。在这些区域中,Java 堆通常是垃圾收集器的主要工作重点。频繁收集 Young 区:年轻代中的对象通常具有较短的生命周期,因此需要经常进行回收。年轻代的垃圾收集通常使用较轻量的垃圾收集算法,如复制算法,以提高回收效率。较少收集 Old 区。
2024-06-01 22:47:02
1133
原创 注解与反射(Java,类加载机制,双亲委派机制)
元注解的作用就是负责注解其他注解,Java定叉了4个标准的meta- annotation类型,他们被用来提供对其他 annotation类型作说明。这些类型和它们所支持的类在 java. lang annotation包中可以找到。@ Target:用于描述注解的使用范围(即被描述的注解可以用在什么地方)。@Target注解用于指定被修饰的注解可以应用的目标元素类型。它包含一个类型的数组作为参数,指定了注解可以应用的元素类型,如类、方法、字段等。例如,如果一个注解被。
2024-05-31 17:08:14
1424
原创 JUC笔记
我的相关文章:JavaSE 学习记录-CSDN博客目录我的相关文章:1、什么是 JUC2、线程和进程3、Synchronized锁4、Lock锁(重点)5、生产者和消费者问题6、8锁现象代码举例1:代码举例2:代码举例3:代码举例4:7、集合类不安全8、Callable (简单)9、常用的辅助类(必会)9.1、CountDownLatch9.2、CyclicBarrier9.3、Semaphore10、读写锁 ReadWriteLock11、阻塞队列BlockingQueueSynchronousQue
2024-05-28 16:29:07
1209
原创 多线程笔记
实现 Callable 接口,并实现 call() 方法(带返回值),将该类的实例传递给 ExecutorService 实例的 submit() 方法,可以获得 Future 对象,通过这个对象可以获得线程执行结果。实现 Runnable 接口,并实现 run() 方法,将该类的实例传递给 Thread 类的构造函数,调用Thread 类的实例的 start() 方法启动线程。它是一个过时的方法,不推荐在实际开发中使用,因为它可能会导致线程不可预料的状态,比如无法释放的锁,数据不一致等问题。
2024-05-27 19:44:57
1489
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅