Java业务程序员35对业务的理解慢而吃力,还容易忘怎么办?如何培养业务方面能力

动软.Net代码生成器代码生成器代码苼成器 是一款为C#数据库业务程序员35设计的自动代码生成器Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式融入了工厂模式,反射机制等等一些思想主要实现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、Model类构造等基础代码片断,支持不同3种架构代码生成使业务程序员35可以节省大量机械录入的时间和重复劳动,而将精力集Φ于核心业务逻辑的开发 Codematic

回顾软件开发的流程从前期的業务需求分析,到产品设计再到架构设计,通过层层迭代让所有关于业务及系统的思考、意图和策略最终都通过开发人员的代码表述絀来。代码成了这些活动的最终产出物

在实际的开发工作中,大都采用面向对象的编程方式我们把真实世界的业务实体映射成软件中嘚对象,实体间的关系就演变成了对象间的继承、实现和引用关系因此通过对源代码的分析,可以知道软件系统的一系列关系逻辑包括系统的调用入口在哪,以及系统API的实现和继承关系、类方法之间的引用关系等如图2.11所示,如果将图左边的代码关系用图形化的方式呈現出来就可以获得图右边的调用链路关系图。这类关系图对我们快速梳理和理解系统的逻辑非常有帮助在此基础上也可以对微服务的調用质量进行优化。

源码是一个宝库包含了很多的内容。假如有个超人能够记住所有的源码并理解透彻那么很多治理的难题都能迎刃而解。问题一出来超人就能快速地定位问题所在。奈何现实中没有超人全盘读懂源码既是脑力活也是体力活,将成千上万个核心類的调用关系梳理出来并画出关系图没有核心业务程序员35好几周的辛苦努力是搞不定的。

所幸现在已经有一些能够对源码进行解析的笁具和组件,JDT就是其中的典型代表JDT的全称是Java Development Tools,是Eclipse的核心组件主要用于Java程序的组织、编译、调试和运行等。在Java源码解析上JDT提供了一个AST組件(Abstract Syntax Tree,抽象语法树)来做Java程序分析通过AST,编译器会把代码转化成一棵抽象语法树树上的每个节点代表一个代码元素(变量、方法、逻辑块等),同时针对节点的类型和属性解析提供完整的能力

通过JDT-AST可以解析出某个类所有引用的其他类(import)列表、类变量列表、类函数列表、函数内变量列表和函数内逻辑块。有了这些基础信息之后再遍历每个方法中的每一行,通过正则表达式可以获取此代码行所調用的变量及其方法比如,针对下面的代码:

对上面的结果稍加处理可知上述代码分别调用了变量params的put方法和变量remind的getIsAdded方法。基于这个结論再根据类变量列表及函数内变量列表匹配到对应的类上,即可获得某个类方法调用其他类方法的情况微服务本身即以类方法(或接ロ)的形式存在,因此通过这种方式可以获得微服务之间的调用关系,具体解析过程如图2.12所示

有了这些信息,就可以逐个遍历方法掃描方法的每一行代码,通过前面识别出的类变量及方法变量找出这些变量的对外调用,从而构建出某个类方法对其他类方法的调用关系如果把源码库中所有微服务工程的源码都进行扫描,可以获得一个Map<stringlist></string,list对象集合Map的key是某个类方法,Value是其调用的其他类方法的集合(為了程序处理方便可能还需要构建一个类似的被调用关系集合Map)。在此基础上对这个Map进行递归遍历就可以找出所有这些类方法的调用鏈路关系,如图2.13所示图中的F#Func1K#Func1是微服务的调用入口,一般都作为调用契约以接口的形式存在在进行代码扫描时,要注意将其与实现类莋关联(接口和实现类的关联关系可以通过AST获得

图2.14是一个真实静态调用链的示例,以一个类方法为起点找到它调用的所有其他方法,逐层遍历后就能得到图中所显示的调用层级关系。图2.14-①是这种调用关系的文本描述从图中可以清晰地看到方法间调用的先后和层级关系。

要注意的是类的实现和继承关系接口类方法或者抽象类方法是没有具体实现逻辑的,所以在程序扫描时还需维护类直接的继承和實现关系。接口方法往往用具体的实现类方法来代替这样就能顺利地找到它的下一层引用关系。

如果引入诸如mxGraph这类图形化展示组件可鉯将图2.14-①中类方法间的调用关系用一棵从上至下、从左至右的调用树图来展示,如图2.14-②所示调用树上每一个节点就是一个类方法,节点間的箭头连线就是一个调用关系通过JDT能够识别出方法注释,还可以将方法注释在每一个类方法节点的右边列出如果系统注释完整,那麼通过一张图就可以基本读清楚一个微服务入口方法的完整实现细节

如果一个方法类的结构比较复杂,例如它有IF…ELSE关系或者FOR循环等嵌套調用关系也可以用JDT识别,将这种关系在调用线条上列出这样就能清楚地知道这是一种分支调用关系还是一种循环调用关系。

由于扫描嘚是所有相关工程的代码一张图上就包含了所有层级的服务或系统之间的RPC调用关系。通过包名来对不同的业务层级(前台、中台、后台)进行识别并为不同包名的图形单元赋予不同的颜色,通过颜色的区分可以清楚地知道一个方法的调用究竟涉及多少个系统在每个系統中的入口是什么、出口又是什么等。

这里存在一个问题就是如何将源码扫描获取到的类方法(微服务的API)与需求/开发任务管理系统中嘚UserStory和Task关联上?可以强制要求在微服务API入口方法(或者微服务类声明)的注解(例如JavaDoc)上标注UserStory和Task的ID扫描源码时通过对注解的解析即可将方法和需求或任务进行关联。不用担心开发人员不标注或者忘了标注因为我们可以通过比对需求列表和源码的映射关系来监控开发人员是否贯彻了注解标注规范,如果有需求没有找到对应的方法或API入口即可自动通知相应的开发人员及时修改。

有了以上信息通过对最终构建出来的大调用矩阵不同维度的分析,可以获得很多微服务的开发及设计质量方面的度量信息包括请求的调用链深度、服务间的依赖程喥、服务的粒度等。这些度量信息将会作为微服务治理的度量及判定依据

笔者另外准备了一个更完整的JDT-AST源码解析示例,能够详细展示如哬通过对一个Java类文件的解析来获得类的相关调用关系限于篇幅,就不在本书中贴出其详细源码了请读者自行从本书的GitHub源码下载站点中丅载并运行,体验解析过程

我要回帖

更多关于 业务程序员35 的文章

 

随机推荐