您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
由 Mybatis 源码畅谈软件设计(一):序
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
由 Mybatis 源码畅谈软件设计(一):序
wy****
2024-12-22
IP归属:北京
29浏览
大家好,我是 **王奕龙**,来自 **京东保险-延保与业财研发部**。从接触软件开发以来,一直对写出优雅的代码抱有执念,工作半年时,偶然接触到《代码整洁之道》,爱不释手,一口气读完,并在很长的时间内践行其中的观点,但是在这践行期间缺少思考和复盘,更多的是一味地信奉和遵守其中的原则,写了不少当时自认为不错而现在回过头看可读性不好的“坏代码”。 后来在员工培训时,导师介绍 《Head First 设计模式》 是影响他最大的一本书。我花了个把月读完,才渐渐理解设计原则和设计模式,并在项目中实际应用。慢慢地,开始考虑怎么设计更好,怎么解耦,怎么复用,如何满足开闭原则等等,虽然也经历过硬用设计模式的情况,但是我觉得这段时间对写代码的能力提升很多。 再后来对代码整洁有了新的理解是在读《软件设计哲学(第二版)》,其中提到的关于如何“提高可读性,降低复杂性”的观点是我之前没有接触过的,后来在对业务接口重构和代码评审中实践了其中的原则。这给了我一种别样的感觉:写好代码不再是“炫技”,而是时刻考虑“这段代码这么写,它好读吗?”,始终站在读者的角度去思考,将需求引入的复杂度降到最低。 有时候我也在考虑一个问题:在系统迭代的过程中,新功能的引入和开发人员的更替都可能会导致复杂性增加,进而使系统可维护性和可扩展性降低。但我却很少看到有团队花精力关注这件事情,通常是永不停止的需求迭代,等复杂性积累到一定程度,无法再满足业务需求时选择重构,而重构时面对欠维护的代码,需要再投入大量人力梳理、评估和研发设计,并且重构时大规模改动也伴随着产生 Bug 的风险,如果没有详细的测试用例或者没有对业务熟悉的测试工程师,该风险还会变大。此外,在中文互联网社区内也很少看到有我们国人写出的关于如何设计程序或什么是好的程序的内容或书籍,在程序员内比较流行的依然是08年出版的《代码整洁之道》,不得不说其中的观点并没有与时俱进,而适宜当前开发环境的《软件设计哲学(第二版)》是近两年的书籍,限于没有中文版导致传播范围有限。那我能帮大家做一些相关的事情吗?因为我觉得即使是老外写的较好的内容,面向的第一手开发者依然是以英语为母语的,适用于英语语境下的原则可能放在国内开发环境下并不适用。但限于能力和经验,也许我并不能将此写的很好,也希望大家能做勘误和内容补充,即使最后它没有非常棒的内容,那么能为新人开发者提供一些经验,少走一些弯路也是好的吧? 本专栏的内容基于我的开发、重构经验和一些代码整洁相关的书籍,主要参考书籍我会一一放在文末,也推荐大家去读原书。但是限于不能以实际业务开发代码为例,我一直在考虑以什么内容来承载这些,最终决定以 Mybatis 源代码为支撑,首先因为它足够简单,再就是源码采用了极简代码的风格,大家能够在追随源码的过程中,了解何时方法应该被拆分以增加可读性,何时书写长代码也是合适的,此外,还有一点是源码中注释信息很少,希望大家能在源码的阅读过程中了对“代码自解释”有自己的认识。在源码解析过程中,我会提到一些设计模式和原则,但更重要的是 **自己真正深入到每一行代码中去研究才能真正理解,好代码永远都是写出来的而不是看出来的**。除了了解这些方法以外,最重要的是希望大家能在平时工作中多应用和交流,多多参加代码评审,阅读其他人的代码,因为在读别人的代码时,更容易发现其中可读性差的点。希望大家能写出整洁、易维护和易扩展的代码,并能从中获取到软件设计和软件开发的快乐。 Mybatis 源代码中提供了非常完整的单元测试,文章中流程均采用其中单测进行验证,大家可点击如下链接下载源代码。 * [\[下载\]Mybatis 源码参考源码](http://pan.jd.com/sharedInfo/7C16E59B9EE1205DC6A1A3AF790F3DD0) 在所有内容开展之前,我想先给大家铺垫一个设计原则,它也是《软件设计哲学》中提到的最让人眼前一亮的观点:**坚持“深”模块设计**,如下图所示: ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-12-17-09-09LPViN9dgILUclZb.png) 它会将每个模块看作一个矩形,矩形的面积代表模块提供的功能,顶部边缘代表模块公开出的接口,边缘长度代表接口的复杂性,越长接口越复杂。设计较好的模块会比较深,因为它在简单的接口后隐藏了许多功能,其内部的复杂性只有一小部分对开发者可见。坚持深模块设计也就意味着提供调用简单但功能强大的接口。 在接下来的内容中,请大家带着这个原则,并在阅读源码过程中时时考虑“这样设计够深吗?”,相信大家能对软件设计有更好的理解和认识。 ### 巨人的肩膀 * [美]John Ousterhout.(2021).[软件设计哲学(第二版)](https://github.com/yingang/aposd2e-zh)[M].San Francisco:Yaknyam Press * [美]Robert C. Martin.(2020).[代码整洁之道](https://book.douban.com/subject/34986245/)[M].韩磊,译.北京:人民邮电出版社 * [美]Elisabeth Freeman,Eric Freeman,Bert Bates,Kathy Sierra,Elisabeth Robson.(2007).[Head First 设计模式](https://book.douban.com/subject/35779421/)[M].O'Reilly Taiwan公司,译.北京:中国电力出版社 * [美]Martin Fowler.(2019).[重构(第2版)](https://book.douban.com/subject/30468597/)[M].熊节,林从羽,译.北京:人民邮电出版社 * [美]David Thomas,Andrew Hunt.(2020).[程序员修炼之道(第2版)](https://book.douban.com/subject/35006892/)[M].云风,译.北京:电子工业出版社 * [美]Robert C. Martin.(2016).[代码整洁之道:程序员的职业素养](https://book.douban.com/subject/26919457/)[M].余晟,章显洲,译.北京:人民邮电出版社 * [日]结城浩.(2017).[图解Java多线程设计模式](https://book.douban.com/subject/27116724/)[M].侯振龙,杨文轩,译.北京:人民邮电出版社 * [Mybatis: 中文官方文档](https://mybatis.org/mybatis-3/zh_CN/index.html) * [Github: How To Read Code](https://github.com/aredridel/how-to-read-code?tab=readme-ov-file) * [Bilibili: MyBatis源码阅读指南](https://www.bilibili.com/read/cv7933087)
上一篇:cursor无敌了
下一篇:由 Mybatis 源码畅谈软件设计(二):MappedStatement 和 SqlSource
wy****
文章数
33
阅读量
2980
作者其他文章
01
高性能MySQL实战(一):表结构
最近因需求改动新增了一些数据库表,但是在定义表结构时,具体列属性的选择有些不知其所以然,索引的添加也有遗漏和不规范的地方,所以我打算为创建一个高性能表的过程以实战的形式写一个专题,以此来学习和巩固这些知识。1. 实战我使用的 MySQL 版本是 5.7,建表 DDL 语句如下所示:根据需求创建 接口调用日志 数据库表,请大家浏览具体字段的属性信息,它们有不少能够优化的点。CREATE TABLE
01
分布式服务高可用实现:复制
1. 为什么需要复制我们可以考虑如下问题:当数据量、读取或写入负载已经超过了当前服务器的处理能力,如何实现负载均衡?希望在单台服务器出现故障时仍能继续工作,这该如何实现?当服务的用户遍布全球,并希望他们访问服务时不会有较大的延迟,怎么才能统一用户的交互体验?这些问题其实都能通过 “复制” 来解决:复制,即在不同的节点上保存相同的副本,提供数据冗余。如果一些节点不可用,剩余的节点仍然可以提供数据服务
01
高性能MySQL实战(三):性能优化
这篇主要介绍对慢 SQL 优化的一些手段,而在讲解具体的优化措施之前,我想先对 EXPLAIN 进行介绍,它是我们在分析查询时必要的操作,理解了它输出结果的内容更有利于我们优化 SQL。为了方便大家的阅读,在下文中规定类似 key1 的表示二级索引,key_part1 表示联合索引的第一部分,unique_key1 则表示唯一二级索引,primary_key 表示主键索引。高性能MySQL实战(一
01
从2PC和容错共识算法讨论zookeeper中的Create请求
最近在读《数据密集型应用系统设计》,其中谈到了zookeeper对容错共识算法的应用。这让我想到之前参考的zookeeper学习资料中,误将容错共识算法写成了2PC(两阶段提交协议),所以准备以此文对共识算法和2PC做梳理和区分,也希望它能帮助像我一样对这两者有误解的同学。1. 2PC(两阶段提交协议)两阶段提交 (two-phase commit) 协议是一种用于实现 跨多个节点的原子事务(分布
wy****
文章数
33
阅读量
2980
作者其他文章
01
高性能MySQL实战(一):表结构
01
分布式服务高可用实现:复制
01
高性能MySQL实战(三):性能优化
01
从2PC和容错共识算法讨论zookeeper中的Create请求
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号