说起代码质量,脑子里会冒出很多词,命名规范、格式规范、日志规范、单元测试覆盖率… 但我觉得,代码质量总结起来就两个:好看和好用。 好看是指代码可读性好,容易理解、容易维护,别人接手了不骂你;好用则指代码健壮,不容易出错,机器跑着不骂你。即使出错,也容易定位,容易止损和恢复。
以下是我认为的几点:
但有一点需要说明,我认为写代码本身是一个创造过程,能让人享受其中,如果有太多的条条框框约束,写代码就失去了创造的乐趣,所以,这里为代码质量建设立一个原则:
有两种途径:
首先得知道什么是好的代码, 这就要有标准,那就是我们常常看到的各种各样的规范,但我觉得要有几个简单的原则,太多了,记不住,有几条原则简单的原则,可以时不时拿来判断,当前做得对不对。
然后就是去实践规范,这里需要一些技巧、一些工具,来帮助我们更好地遵循规范。
接着是度量, 看我们对规范实践的效果,这就是我们常说也常做的Code Review,但Code Review也需要遵循一定的规范,应用一定的技巧。
度量之后是改进, CR结果要及时跟进,这是最重要一环,否则CR就没有实际意义。
总结不可少,复盘是一种很有用的工具,CR也需要复盘,总结CR流程、过程等方面好的和不好的地方,更新规范和checklist。
接下来我们分别聊一聊各个步骤。
从上边高质量代码的诞生途径我们可以看出,设计也是很重要的一环,所以我们的规范包括设计规范和编码规范,结合我们的生产实际,这里加上安全生产的规范,所以规范有3部分:设计、编码、安全生产。
设计推荐多用图表达,图比文字有更直观的传达能力:
首先是业务流程图, 它能快速构建起我们对业务的认知,带着对业务的理解再来看代码,事半功倍。
然后是用例图, 清晰地表达出我们系统的职责、边界、服务对象,结合业务流程图,能快速构建起我们对系统职责的认知。
接着是架构图, 从我们日常的设计需求来看,架构图是需要的。好的架构图能快速给人搭建起理解的框架,再来看系统的细节部分,就很好理解。架构图推荐 C4 规范,它是我目前接触的表达最清晰的架构图规范。
接着再用时序图、状态图、ER图 等把关键和复杂部分的设计表达出来。
但日常我们的需求有大有小,方案也不需要都遵循统一的范本,为了设计而设计,就徒增加工作量了。以按需为第一原则,能把要做啥,怎么做的表达清楚即可。这里按场景推荐各个图的使用场景:
新建应用/对原有应用进行重大修改/复杂项目
一般项目/重大日常
日常
编码最重要的是可读,控制复杂度,做到自解释,能让人像读自然语言一样读自己的代码,这是最高境界,也是神仙境界。然后是可维护性和可变更性,能快速、安全地修改代码是目标。最后是对优雅实现的要求,卓越的代码会让人拍着大腿叫好,这个不稀奇,我们乱糟糟的代码里也偶尔会有闪光的片段。
编码最高原则:
可读性
可维护性
优雅
合理的代码分层,能控制各层的复杂度,以分层的思路去设计,也能提高代码的复用性。对于分层,我认为熟悉的就是好的,能满足工作中的大部分情况就好,这里不谈六边形架构、清晰架构、DODAF等概念,自己驾驭不了,还不能拿出来吹。我推荐DDD最基础的4层分层架构,如下:
用户界面/接口层
⇩
应用层
⇩
领域层
⇩
基础设施层
这里举个我实际项目中用到的例子:
-- bootstrap
-- BeanConfig
-- application
-- pv
-- ChannelPvApplicationService
-- sns
-- domain
-- abtest
-- AbtestService
-- address
-- coupon
-- entity
-- Coupon
-- CouponStatus
-- CategoryCouponTemplate
-- category
-- user
-- UserRepository
-- service
-- OneIdService
-- UserService
-- item
-- ItemRepostory
-- live
-- LiveStatus
-- infrastructure
-- concurrent
-- ThreadPoolExecutorFactory
-- MonitorableCallerRunsPolicy
-- dal
-- IGraphDal
-- TuringDal
-- DefaultUserRepository
-- dao
-- MybatisItemDao
-- util
-- DateUtil
-- MoneyUtil
-- UriUtil
-- monitor
-- Event
-- Timing
-- TimingAspect
-- TimingEvent
-- Monitors
-- view
-- atomicwidget
-- BannerWidget
-- CrazySubsidyWidget
-- FeedItemsWidget
-- NavigateBarWidget
-- LiveWidget
-- page
-- HomeScreenPage
-- CategoryFeedsPage
-- SearchCardPage
-- widget
-- Widget
-- DispatchableWidget
-- Debuggable
-- AbstractWidget
-- AbstractDispatchableWidget
-- WidgetDispatcher
-- WidgetResult
-- WidgetContextIncompatibleException
上述项目结构中,因为是导购项目,view相当于用户界面层,application是应用层,domain是领域层,infrastructure是基础设施层。
再对包的划分说明一下:
代码规范就推荐阿里经济体开发规约,很全面,也是阿里同学的基本要求。代码规范就推荐「阿里经济体开发规约」,很全面,也是阿里同学的基本要求,开源版本:阿里巴巴java开发手册 https://github.com/alibaba/p3c
结合自己的经验,重点说几点:
命名
日志
异常
注释
面向对象
其它规范
安全生产还没有系统总结过,结合自己做稳定性的工作经验提几点,后边跟负责安全生产的同学多学习学习,再来更新:
防资损
易恢复
监控/报警
降级/限流
给一些原则和技巧建议,帮忙落地规范。
这得跟着公司和部门规范来,学习学习再来补充。
Review时机
Review方式
Review内容
Review前提
Checklist
可读性
可维护性(高内聚低耦合、面向对象原则、实现复杂性等)
可变更性(扩展性等)
以上是摘取的各家之言,加上自己的一些思考。学习是个渐进过程,代码质量的学习我还在进行中,如果有收获,会来更新。如果被人diss,我还觉得有理,我也会更新进来。
写的这些也是我自己的学习和实践方向,所以,如果发现我的代码没做到这些,吐槽我,然后给我建议,让我做得更好。
领取专属 10元无门槛券
私享最新 技术干货