《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/6844904142960328718 「Vt」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

前言

刚刚与同事开了一个分享会,笔者分享了一些了代码设计模式相关的内容。

以及复盘了一下项目中有些复杂的业务场景,为什么没有很好的应用到设计模式

业务虽然肯定保密的,但是抛开项目业务层面,纵观回顾了一下笔者以往的项目,关于设计模式代码规范问题还是有一些内容还是值得落笔和大家分享的。

正文

设计模式究竟是什么?

主流的说法,大致如此:

设计模式是解决可在许多不同情况下使用的问题的描述或模板,一般在OOP中最作为最佳实践的解决方案。

最佳实践一词笔者在几处介绍设计模式的地方,都有看到。
但是设计模式真的就是OOP中,业务开发的最佳实践吗?

首先声明笔者的观点,我是如何理解设计模式的:

设计模式是一种代码规范,不同于空格缩进这类容易被插件检测的入门规范,是一种中级代码规范,不宜被入门者理解,不易被插件所检测。

所以笔者认为设计模式是属于代码规范级别的,能不能成为最佳实践,也要看使用者。

设计模式在常规业务开发的存在感

常常在网上能看到,很多人晒自己碰到的“祖传代码”,“龟派气功式代码”,“shǐ山代码”等等。

我们不是有设计模式吗?不是有代码规范吗?

图片

幸存者偏差是一部分原因,只有烂代码才会被挂出来让人吐槽。

综合来看这种情况还是很多,那么是如何造成这种局面的,难道是这届程序员水平不行?

代码规范性或使用设计模式的痛点

笔者首先复盘了一些在业务开发中为什么不能很好应用设计模式的因素。

性能

在极端的考虑下,例如Java语言,设计模式面临着更多的类文件以及更多的代码

在类加载和内存使用上的成本,自然是略微高于不使用设计模式。

但是也不能一概而论,有些设计模式(如:单例模式,享元模式等)就是为了提高性能节约资源成本而出现的。

以及大多数情况下,良好的代码维护性优点要远远大于这点微小的性能开销,所以性能用了删除线。

类爆炸

虽然网上已经有各种设计模式的小Demo代码,但是还是可能会出现设计存在缺陷过度设计等情况。

复杂的设计模式,需要依靠业务建模,并不能拿来即用,甚至“生抄硬套”。

设计缺陷和过度设计,两者对开发人员都是一样痛苦的,会出现“不该用设计模式而用”,或者单纯为了”迎合缺陷的设计模式”,写出对应逻辑复杂的代码,这样类爆炸不可避免。

而且,就算正常使用的设计模式在业务复杂情况,类爆炸也不可避免。比如策略模式,如果业务情况就是有很多,你也必须把每个情况实现类写出来。

这就对开发的时间成本有一些细微的影响了。

甚至据笔者所知,有些传统公司,或者对日项目,几乎一个类要有一个Excel文档,详细说明类和其中元素的作用。

你可能和我想的一样,找个javadoc的api,逆向从注释生成Excel不就完了吗?

但实际上这类公司大多数还是靠人力完成这些工作的,类的数量多了起来,对维护文档的人也是巨大挑战。

团队成员编码水平

在传统的软件公司,出于节约成本考虑,很难做到人员全部“高配”并且能够有自驱动的精神。

通常都是1拖N的人员配备,想让薪资寥寥的初级工程师就有“高内聚低耦合,以及开闭原则为代表的设计模式六大原则等”这类的设计思想,也是有点难为情。

此处说句题外话,

而且很多初级工程师其实对框架很“有适应性”的,当然并非真正的适应性

比如:如果代码里没有统一异常处理,那么时间长了你就会发现,到处都是自己的try catch。

再比如,项目里没有引入工具类库,那么时间长了你就会发现,到处都是网上奇怪的util类,甚至每个类中都有重复的工具方法。

这些不能算是初级工程师的问题,要归结于技术负责人,比如观察到了项目中还没有工具库,那么是不是应该先去公司内部的二方库中寻找,如果没有是不是应该引入commons-lang3,hutool,guava这类的第三方优秀库等等。

项目大环境

我们生存在一个高度架构为主的流量时代。高并发,大流量,各种微服务,以及中间件建设等等已经是主流趋势。

那么代码层面的设计模式以及代码规范性的地位,就有些微妙了。

笔者也见过不少项目,架构师只去考虑是不是该“加机器,加中间件,加配置”等上层建设。由于团队成员水平断档,对代码的要求几乎为0,也没有review等规则,能实现即可。

时间成本与敏捷开发

在敏捷开发场景,业务频繁变动,项目快速迭代,这当然也是因素之一。

比如常说的可以优化if else的策略模式,如果初期只有一个分支,你会用设计模式吗?那么需求变动加了一个呢?如果又加了一个呢?

什么时间点选择使用设计模式优化代码,或者用不用优化,以及有没有时间优化都是个问题。

通常有经验的工程师,一般不会说出“这不就一行代码嘛,一分钟改完”这样的话。

毕竟修改代码,要思考全局性(是否其它代码也有相同修改需求),正确性,以及分支影响性(是否影响其他逻辑的执行)。

甚至也有公司对覆盖率测试类有要求,所以用打字速度判定需求落地速度,并不是业内人士的经验之谈。

这样时间成本也成为了一个因素。

人员流动

人员流动在互联网不是一个稀奇的事情。

一方面是公司原因,随着改革春风吹满地,已经到了遍地“老板”的年代,一些公司,要求不合理,甚至条款都是违fa行为导致人才流失。

二是个人原因,水平高为高薪所走,水平低被低薪劝退。

那么不管那种原因,在人员频繁流动下,代码质量要想做好,对管理上也是一种挑战。

毕竟如果你接手一个逻辑复杂的龟派气功代码,业务逻辑还没完全清晰的场景下,大多数人会老老实实的添加if else以完成需求。

分析

代码规范&设计模式重要吗?

上文列举了一些,在项目开发中代码规范,以及使用设计模式上的一些痛点。

之所以称之为痛点而不是缺点,原因就像上文有些场景,代码都不是重要的一环,代码规范更不值一提,何来缺点一说。

所以重不重要,综合上文来看,除了主观因素,团队因素,甚至还有团队管理者的原因。毕竟的确在一些场景,只是对开发人员友好,对KPI来讲毫无用处,导致了不重视。

如何持续做好代码规范

如果我们是有geek精神的团队,或者要设计长时间维护的产品,还是建议做好代码规范和设计模式的落地。

那么就不妨从笔者总结的痛点上,结合自己当下场景逐条分析,取得一个“平衡”点。

笔者也大致总结了几点,以应对上面的措施,但每个人都有每个人的情况,和设计模式本身一样,不能“生抄硬套”。

  • 深入理解业务,做好**业务预判**,这样就为了底层设计打出良好基础。
  • 在保障人力成本的情况下,自驱性的成员在当今也不在少数,要给予信心一起做好基础建设
  • 复杂的业务点频繁迭代某个早期时刻,技术负责人需要切入,衡量工时分析业务,以便断定是否需要重构,或者出代码设计方案。
  • 人员频繁流动下,工作要尽量形成文档,不能以“走形式”为主,不仅要良好交接代码,还要良好交接业务。
  • 传统项目,对日项目要充分利用自动化工具,尽量多多代替人工的文档维护。

当然了,本文提到的痛点,在中小公司最不难发现,更不是三言两语就能解决,所以尽力做到平衡就非常好了。

如果不存在这些痛点,人员自驱性强,基础建设良好等。大概率是足够优秀的企业了,如果你是这样企业的员工,还坚持看到这里,那就当了解一下中小企业的小问题。

结尾

刚入行时,笔者也曾看着历史代码发出笑声,“这么乱的代码,怕是喝了散装假酒”。

时过境迁,随着工作年限的增长,看问题的角度也在不断发生变化,现在不仅不会发出嘲笑了,还总结了乱代码出现的原因。

关于设计模式代码规范方面的思考也有了新的理解,也如上文所说,碰巧与同事开会提到了,所以整理成文。

文章的标签设置为阅读下的“代码规范”,因为本文没有技术干货,算是经验分享,希望对你有所帮助。

文章目录
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 设计模式究竟是什么?
    2. 2.2. 设计模式在常规业务开发的存在感
    3. 2.3. 代码规范性或使用设计模式的痛点
      1. 2.3.1. 性能
      2. 2.3.2. 类爆炸
      3. 2.3.3. 团队成员编码水平
      4. 2.3.4. 项目大环境
      5. 2.3.5. 时间成本与敏捷开发
      6. 2.3.6. 人员流动
    4. 2.4. 分析
    5. 2.5. 代码规范&设计模式重要吗?
    6. 2.6. 如何持续做好代码规范
  3. 3. 结尾