设计模式 + 代码规范落地之路
共 3443字,需浏览 7分钟
·
2021-09-26 02:36
你知道的越多,不知道的就越多,业余的像一棵小草!
你来,我们一起精进!你不来,我和你的竞争对手一起精进!
编辑:业余草
juejin.cn/post/6986447169913880584
推荐:https://www.xttblog.com/?p=5277
前言
刚刚与同事开了一个分享会,笔者分享了一些了代码「设计模式」相关的内容。
以及复盘了一下项目中有些复杂的业务场景,为什么没有很好的应用到「设计模式」。
业务虽然肯定保密的,但是抛开「项目」,「业务」层面,纵观回顾了一下笔者以往的项目,关于「设计模式」和「代码规范」问题还是有一些内容还是值得落笔和大家分享的。
正文
设计模式究竟是什么?
主流的说法,大致如此:
设计模式是解决可在许多不同情况下使用的问题的描述或模板,一般在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精神」的团队,或者要设计长时间维护的产品,还是建议做好代码规范和设计模式的落地。
那么就不妨从笔者总结的痛点上,结合自己当下场景逐条分析,取得一个“「平衡」”点。
笔者也大致总结了几点,以应对上面的措施,但每个人都有每个人的情况,和「设计模式」本身一样,不能“生抄硬套”。
深入理解业务,「做好****业务预判」,这样就为了底层设计打出良好基础。
在保障人力成本的情况下,自驱性的成员在当今也不在少数,要给予信心一起「做好基础建设」。
复杂的业务点频繁迭代某个「早期时刻」,技术负责人需要切入,衡量工时分析业务,以便断定是否需要重构,或者出代码设计方案。
人员频繁流动下,工作要尽量形成文档,不能以“走形式”为主,不仅要良好交接代码,还要良好交接业务。
传统项目,对日项目要充分利用自动化工具,尽量多多代替人工的文档维护。
当然了,本文提到的痛点,在中小公司最不难发现,更不是三言两语就能解决,所以尽力做到平衡就非常好了。
如果不存在这些痛点,人员自驱性强,基础建设良好等。大概率是足够优秀的企业了,如果你是这样企业的员工,还坚持看到这里,那就当了解一下中小企业的小问题。
结尾
刚入行时,笔者也曾看着历史代码发出笑声,“这么乱的代码,怕是喝了散装假酒”。
时过境迁,随着工作年限的增长,看问题的角度也在不断发生变化,现在不仅不会发出嘲笑了,还总结了乱代码出现的原因。
关于「设计模式」和「代码规范」方面的思考也有了新的理解,也如上文所说,碰巧与同事开会提到了,所以整理成文。
文章的标签设置为阅读下的“代码规范”,因为本文没有技术干货,算是经验分享,希望对你有所帮助。、