洋葱架构
3.4 注释与文档注释与文档往往在开发过程中会被忽视,作为知识传递的载体,其实是很重要的存在,他们能够帮助我们更快速的理解实现逻辑。
注释能够帮助理解逻辑,注释是开发过程中思维逻辑最直接的体现,因为其和代码绑定在一起,相对于文档阅读更方便,查看和理解代码时有助于理解。
文档能够帮助理解架构设计,在团队的合作或者交接过程中,很难用几句话就能够讲清楚,此时需要通过文档帮助合作方来更好的理解每一处细节以及整体的架构设计方案的全貌。
3.5 重构如果日常开发过程中已经很注意了,但是多年之后发现其实之前的实现并不是最优,此时,就可以通过系统重构来解决。
当你维护一个多年生长成的系统时,一定会发现系统中一些不合理的地方,这是软件复杂度问题长期积聚的结果,此时就需要我们在日常的开发过程中对系统内部的实现逻辑进行适当的重构以使得系统对未来具备更好的扩展性和可维护性。
重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。使用一系列重构手法,在不改变软件可观察行为的前提下,调整结构。傻瓜都能写出计算机可以理解的代码。唯有能写出人类容易理解的代码的,才是优秀的程序员。
-- Martin Fowler 《重构 改善既有代码的设计》
看一个简化版本的例子,下面的代码部分是一个查询报告详情数据的接口,会发现中间有一大段的信息是在转换aliId,但实际上这个行为并不是当前方法的重点,所以这里的单纯针对这一段我觉得应该单独抽取一个公用的方法出来。
public ReportDetailDto getDetail(ReportQueryParam queryParam) {
if (null == queryParam) {
log.error("queryParam is null");
throw new BizException(PARAM_ERROR);
}
Long aliId = queryParam.getAliId();
if (null == aliId) {
if (StringUtils.isBlank(queryParam.getToken())) {
log.error("aliId and token are both null. queryParam: {}",
JSON.toJSONString(queryParam));
throw new BizException(PARAM_ERROR);
}
aliId = recommendAssistantServiceAdaptor.getAliIdByToken(queryParam.getToken());
if (null == aliId) {
log.error("cannot get aliId by token. queryParam: {}", JSON.toJSONString(queryParam));
throw new BizException("ALIID_NULL", "aliId is null");
}
}
// 获取同步数据
// 数据结构转换
return convertModel(itemEList);
}
四、总结
本文主要阐述了个人对软件复杂度的思考,分析了导致软件复杂度的原因、软件复杂度的度量方式以及阐述了自我理解的如何避免软件复杂度的问题。
只要每个人在每一个需求的开发中秉持匠心,持续提升自身架构设计的能力,先战略设计后战术实现,并针对开发过程中遇到的问题代码能够积极的进行重构,相信软件复杂度的问题也会不断的被我们击溃,胜利的旗帜永远属于伟大的程序员。
参考阅读[01] 系统困境与软件复杂度,为什么我们的系统会如此复杂
https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247507488&idx=1&sn=fb365890920245ad627df364cafc3550
[02] 《A Philosophy of Software Design》
[03] 《Clean Architecture》