百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

由 Mybatis 源码畅谈软件设计(一):序

csdh11 2025-01-26 21:48 24 浏览

作者:京东保险 王奕龙

从接触软件开发以来,一直对写出优雅的代码抱有执念,工作半年时,偶然接触到《代码整洁之道》,爱不释手,一口气读完,并在很长的时间内践行其中的观点,但是在这践行期间缺少思考和复盘,更多的是一味地信奉和遵守其中的原则,写了不少当时自认为不错而现在回过头看可读性不好的“坏代码”。

后来在员工培训时,导师介绍 《Head First 设计模式》 是影响他最大的一本书。我花了个把月读完,才渐渐理解设计原则和设计模式,并在项目中实际应用。慢慢地,开始考虑怎么设计更好,怎么解耦,怎么复用,如何满足开闭原则等等,虽然也经历过硬用设计模式的情况,但是我觉得这段时间对写代码的能力提升很多。

再后来对代码整洁有了新的理解是在读《软件设计哲学(第二版)》,其中提到的关于如何“提高可读性,降低复杂性”的观点是我之前没有接触过的,后来在对业务接口重构和代码评审中实践了其中的原则。这给了我一种别样的感觉:写好代码不再是“炫技”,而是时刻考虑“这段代码这么写,它好读吗?”,始终站在读者的角度去思考,将需求引入的复杂度降到最低。

有时候我也在考虑一个问题:在系统迭代的过程中,新功能的引入和开发人员的更替都可能会导致复杂性增加,进而使系统可维护性和可扩展性降低。但我却很少看到有团队花精力关注这件事情,通常是永不停止的需求迭代,等复杂性积累到一定程度,无法再满足业务需求时选择重构,而重构时面对欠维护的代码,需要再投入大量人力梳理、评估和研发设计,并且重构时大规模改动也伴随着产生 Bug 的风险,如果没有详细的测试用例或者没有对业务熟悉的测试工程师,该风险还会变大。此外,在中文互联网社区内也很少看到有我们国人写出的关于如何设计程序或什么是好的程序的内容或书籍,在程序员内比较流行的依然是08年出版的《代码整洁之道》,不得不说其中的观点并没有与时俱进,而适宜当前开发环境的《软件设计哲学(第二版)》是近两年的书籍,限于没有中文版导致传播范围有限。那我能帮大家做一些相关的事情吗?因为我觉得即使是老外写的较好的内容,面向的第一手开发者依然是以英语为母语的,适用于英语语境下的原则可能放在国内开发环境下并不适用。但限于能力和经验,也许我并不能将此写的很好,也希望大家能做勘误和内容补充,即使最后它没有非常棒的内容,那么能为新人开发者提供一些经验,少走一些弯路也是好的吧?

本专栏的内容基于我的开发、重构经验和一些代码整洁相关的书籍,主要参考书籍我会一一放在文末,也推荐大家去读原书。但是限于不能以实际业务开发代码为例,我一直在考虑以什么内容来承载这些,最终决定以 Mybatis 源代码为支撑,首先因为它足够简单,再就是源码采用了极简代码的风格,大家能够在追随源码的过程中,了解何时方法应该被拆分以增加可读性,何时书写长代码也是合适的,此外,还有一点是源码中注释信息很少,希望大家能在源码的阅读过程中了对“代码自解释”有自己的认识。在源码解析过程中,我会提到一些设计模式和原则,但更重要的是 自己真正深入到每一行代码中去研究才能真正理解,好代码永远都是写出来的而不是看出来的。除了了解这些方法以外,最重要的是希望大家能在平时工作中多应用和交流,多多参加代码评审,阅读其他人的代码,因为在读别人的代码时,更容易发现其中可读性差的点。希望大家能写出整洁、易维护和易扩展的代码,并能从中获取到软件设计和软件开发的快乐。

Mybatis 源代码中提供了非常完整的单元测试,文章中流程均采用其中单测进行验证,大家可点击如下链接下载源代码。

  • [下载]Mybatis 源码参考源码

在所有内容开展之前,我想先给大家铺垫一个设计原则,它也是《软件设计哲学》中提到的最让人眼前一亮的观点:坚持“深”模块设计,如下图所示:

它会将每个模块看作一个矩形,矩形的面积代表模块提供的功能,顶部边缘代表模块公开出的接口,边缘长度代表接口的复杂性,越长接口越复杂。设计较好的模块会比较深,因为它在简单的接口后隐藏了许多功能,其内部的复杂性只有一小部分对开发者可见。坚持深模块设计也就意味着提供调用简单但功能强大的接口。

在接下来的内容中,请大家带着这个原则,并在阅读源码过程中时时考虑“这样设计够深吗?”,相信大家能对软件设计有更好的理解和认识。

巨人的肩膀

  • [美]John Ousterhout.(2021).软件设计哲学(第二版)[M].San Francisco:Yaknyam Press
  • [美]Robert C. Martin.(2020).代码整洁之道[M].韩磊,译.北京:人民邮电出版社
  • [美]Elisabeth Freeman,Eric Freeman,Bert Bates,Kathy Sierra,Elisabeth Robson.(2007).Head First 设计模式[M].O'Reilly Taiwan公司,译.北京:中国电力出版社
  • [美]Martin Fowler.(2019).重构(第2版)[M].熊节,林从羽,译.北京:人民邮电出版社
  • [美]David Thomas,Andrew Hunt.(2020).程序员修炼之道(第2版)[M].云风,译.北京:电子工业出版社
  • [美]Robert C. Martin.(2016).代码整洁之道:程序员的职业素养[M].余晟,章显洲,译.北京:人民邮电出版社
  • [日]结城浩.(2017).图解Java多线程设计模式[M].侯振龙,杨文轩,译.北京:人民邮电出版社
  • Mybatis: 中文官方文档
  • Github: How To Read Code
  • Bilibili: MyBatis源码阅读指南

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...