范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

关于组件化链路设计的分享

  简介: 提高代码代码可读性、复用性、可扩展性,从而提高开发体验和效率是基础素养。本文分享介绍一种组件化链路设计思想的分享,用于大量产品间具有相似业务处理逻辑的场景,可提高代码的复用性。
  提高代码代码可读性、复用性、可扩展性,从而提高开发体验和效率是基础素养。减少重复代码,对重复代码进行抽象、下沉,遵守设计原则,应用设计模式,都有一个共同的目的:发现变化,封装变化,提高代码的可复用性,减少需求变化影响的范围,从而使软件、系统、云服务、网站等能够可控的修改与升级,具有更长的生命周期。
  一、最常见的三层架构
  以我们平常接触较多的三层架构开始:biz-core-common。
  在开发的过程中,从三层架构的角度考虑,最简单的认识便是对于业务逻辑,在biz层去编排处理。而对于一些与业务逻辑无关,可复用的逻辑,从业务逻辑中抽离出来,在core层进行处理。底层的模型、DAO方法、外部服务的门面等,放在common层处理。这样对于新增的业务,可以复用core层的通用方法。
  这是最简单的理解与要求,在这之上,很多应用都根据自身的特点,从不同的角度用不同的方法提高代码的可复用性。本文以条码的处理逻辑为例,介绍一种组件化链路设计思想。
  二、为什么要用组件化链路
  可以想象这样一种场景,有一种产品,处理的逻辑很复杂,代码很长。随着业务的发展,这个产品衍生出很多其它具有类似性质,但处理链路各有差异的产品。此时,怎样去设计代码的结构,才能更好地提高代码的复用性呢?
  比如我们常见的18位付款码,对于一次解码链路,就要涉及复杂的逻辑,要经历十余种业务处理阶段,还要考虑一些不影响主链路的弱依赖逻辑。而除了18位otp离线码之外,还有19位离线码、18位在线码、19位在线码、24位db在线码等等。同时又涉及发码、解码、支付token置换等逻辑,对于一个专门处理码的平台,需要定制的逻辑就有百余种。每一种码的每一个流程之间都有差异性,但也有共性,若不做特殊处理,每一种码都在biz层编排业务逻辑,复用core层的方法,其开发的复杂性也是很大的,并且随着产品的持续增多,代码中的分支会越来越多,影响理解、维护与新增。
  那么如何最大化的把通用逻辑抽离出来,提高其复用性、可维护性以及可拓展性呢?组件化链路的设计是其中的一种方式。
  三、组件化链路设计3.1 组件化链路思想
  对于涉及多个业务处理阶段的逻辑,若每个阶段之间有所联系,但又彼此独立,便可以把每个流程抽象成一个个节点,对于一个特定业务流程而言,每一个子流程都可作为一个节点,依次执行流程节点,传递节点参数即可。如下
  当我们把所有业务处理的子流程都抽象成节点以后,每一个业务流程的处理便可以通过节点间的排列组合去完成。如                                                                                                                                                                                                                                               
  NodeWrapper便是每个子流程抽像出来的节点,对于18离线条码的业务处理流程barCodeOfflineOtp18ParseProcess,只需要去依次处理每个节点的业务逻辑就好了。通过这样的方式,便可以通过一个统一的流程处理方法,执行所有组件化的业务流程,如下所示。  public ProcessContext execute(ProcessContext context, ProcessModel process) {         LoggerUtil.info(LOGGER, "开始执行流程, processName=", process.getName(), ".");         /**          * node处理          */         context = nodeProcess(context, process);         /**          * extension处理          */         extensionProcess(context, process);         return context;     }
  通过业务上下文context保存每个节点执行的结果并向下传递,首先执行nodeProcess主链路强依赖的节点,节点的执行结果影响链路推进,而后extensionProcess执行弱依赖的节点,执行失败并不影响主流程。这样我们对于业务逻辑的处理就变为了根据传参识别业务身份->执行对应流程->返回业务执行流程上下文context。而对于业务流程的处理,都只用在xml配置一下node,便可复用现有的逻辑。
  更进一步地,对于ProcessModel以及NodeWrapper,我们应该怎么设计才能承载上述的功能实现?
  3.2 流程节点的具体设计3.2.1 节点设计
  ProcessModel与NodeWrapper之间的关系如下
  processModel内部其实就是一堆节点,是一种一对多的关系,将强依赖的主链路节点与弱依赖节点分开,如下  public class ProcessModel extends ToString {          /**      * 流程名称      */     private String name;     /**      * 普通节点列表      */     private List nodes;     /**      * 扩展节点列表      */     private List extensions;
  自然,节点执行的能力要交予节点自己,一个节点的内部参数如下  public class NodeWrapper {     /**      * 业务节点名称      */     private String nodeName;     /**      * 业务节点      */     private ProcessNode node;     /**      * 参数转化      */     private NodeParametersMaping nodeParametersMaping = null; }
  一个节点会有节点名称nodeName、真正的执行节点node、以及参数转换的nodeParametersMaping。每个参数的设计都有其特殊的考虑,首先是业务节点名称,这个参数有什么意义呢?其实是在业务执行的过程中,可能会有分支链路的出现,根据不同的结果,可能会跳过一些节点。此时便可以指定下一个执行节点的nodeName,实现节点跳转的功能。
  对于ProcessNode来说,它才是严格意义上的执行节点。  public interface ProcessNode {     /**      * 入参. 每个节点发布的时候,必须定义出入参数表.      *      * @param params      * @return      */     ProcessNodeResult process(Map params);
  processNode是一个接口,每个节点给予其具体实现。此处的入参是Map params,上文已经说到,节点处理是通过context传递的,但对于每个节点而言,并不需要所有context的所有参数。所以对于下一节点执行的时候,只需通过context取出需要的部分执行即可。这引发了下一个问题,如何设计一种通用的方法,去转换参数呢,这就是NodeParametersMaping所要做的。  public class NodeParametersMaping {     /**      * context to node 的转化配置      */     private Map contextToNode = null;     /**      * node to context 的转化配置      * Map<结果码,Map<结果属性,上下文目标设置属性>>      */     private Map nodeToContextMapping = null;     /**      * 配置死的静态入参 key = params的key      */     private Map staticParamsToNode = null; }
  这里contextToNode便是用于从context中取出某些参数,转换成节点入参的配置。nodeToContextMapping便是节点执行结果放进context的配置。那这里为什么是一个Map类型的数据呢,主要是因为节点执行可能成功可能失败,失败的结果也有很多,此处主要是根据不同的执行结果,取出相应的NodeToContextMaping,往context里填充数据。NodeToContextMaping如下  public class NodeToContextMaping {     /**      * Node中的result.resultCode转化成流程里的code      */     private int processCode = -1;     /**      * 后续如何处理      */     private NodeProcessMethod processMethod = NodeProcessMethod.nextNode();     /**      * Node中的result结果转化到contextdata中      */     private Map nodeToContext = null;     /**      * 操作类的      */     private Map contextToContext = null;     /**      * 静态参数设置到context中      */     private Map staticParamsToContext = null; }
  这里的processMethod便是用于指定下一个执行节点的,是执行下一个执行节点,还是跳转节点。nodeToContext便是将节点执行结果放进context的配置文件,不同的执行结果会有不同的配置。该配置也是事先在xml中配置实现的                                                                                                                                                       
  以上述为例,当key=1时,说明发生错误,该节点processMethod是ERROR_NODE不需要向下执行。当key=1时,将执行结果中的terminalResult放入context中的terminalResult,并且processMethod是默认值,执行下一节点。
  至此,关于节点的设计思路便结束了。通过这样的设计,节点执行的顺序、不同的分支逻辑都可以覆盖到了,并且对于新增业务逻辑,在xml中配置即可,不需要重新编排复杂的业务逻辑。此时又有一个问题,context和node间具体传递参数的逻辑是怎样实现的呢?
  点击查看原文,获取更多福利!
  https://developer.aliyun.com/article/1124726?utm_content=g_1000366865
  版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

清明节前后,这3种豆记得给老年人吃,磷脂含量高,真好吃啊梨花风起正清明,又是一年春好时,时间如白驹过隙,转眼间我们就要迎来二十四节气之一的清明节。清明节处在仲春和暮春之交,既是人们上坟扫墓祭奠先人的日子,也是感受户外大好春光的日子。尽管53岁女子每天吃一片叶酸,清除斑块防脑梗,后来咋样了?叶酸属于一种维生素,对于备孕以及怀孕的女性来说都非常的熟悉,尤其是在备孕期间或者是怀孕前期都会要求补充叶酸,能够促进胎儿发育。叶酸能够参与DNARNA的合成,孕妇注意补充叶酸,可以季节转换时期老年人要注意哪些健康问题?专家说有这三点!市健促中心介绍,春天将至,又是运动的好时节,外出运动有益身心健康,但是老年人在这冬春交替时节还要多加注意。具体应该关注哪些健康问题呢?让我们一起来听专家解答。详见每年季节转换的时候如何防止白发出现?人体缺什么维生素会长白头发呢?看完就明白了民间有这么一种说法白发不可随便拔,拔一根便会长三根。现在很多年轻人在生活中都有白发人,如何防止白发出现?人体缺什么维生素会长白头发呢?专家介绍,由于人体新陈代谢变得低下,身体各项功李咏因病去世后留下2亿财产,一分没给妻子哈文,全部给了她李咏,作为曾经的央视主持人,在春晚的舞台上,给大家留下了很多的欢乐和阳光。然而,他宣布将暂时退出电视,与家人一起定居国外。直到2018年5月29日,李咏妻子在微博上写道,李咏在国外十二年前的雷剧,原来有这么多美人鞋儿破,帽儿破,身上的袈裟破话说,这首歌应该是儿时的我们对济公这一形象的最初印象,而塑造最成功的的演员,莫过于游本昌老爷爷。每次看到他,都会觉得他就是真济公。当然,后来经过翻拍,又潘长江正式回应移民问题中国是他的根,他哪里都不会去最近有很多营销号都在传潘长江已经带着一家人移民到美国的消息,而且还把他描述的非常惨,都说他在美国过得不是很好,家人们都不理他,他只能一个人喝闷酒。这些营销号写的非常真实,配图也很真悼念!杰克奥特曼扮演者回光之国了2023年3月22日,经典杰克奥特曼的扮演者团时朗先生因肺癌去世,享年74岁。听到这个消息,小编心里五味杂陈。小编儿时买的第一套奥特曼光盘就是杰克奥特曼。乡秀树的形象深深地印在心里超烂剧的高颜值CP!杨洋ampampamp刘亦菲三生三世,王鹤棣ampampamp沈月真甜近期杨洋刘亦菲都受邀出席时尚品牌活动,在后台两人不仅打了招呼,还互相拥抱,这一幕让好多人都梦回电影版三生三世十里桃花。杨洋和刘亦菲都是古装高颜值男神女神,当初两人的合作很受期待,但Jackeylove谈最近表现挨喷很正常,却被房管C了,网友绝对防御头条创作挑战赛前段时间的TES战队真的是处于网友舆论的中心,一波五连败遭到了众多网友的非议,又加上自己的骚操作赛季末竟然让主教练白色月牙暂离,再一个中途Jackeylove直播时的千年手游怪物掉落材料大全上一篇讲到我们这个千年手游的怪物掉落装备,这一篇呢我给各位送上千年手游的怪物掉落材料,好的我们也是不废话,直接进入主题。千年手游里面有3种货币,元宝金元银币,元宝是需要充值的,金元
真实的美国生活到底是怎样的?谢邀。一千个人心中有一千个哈姆雷特,每个在美国生活过的人感受也不一样。我曾在美国的一所大学访问半年,算是近距离的观察了一下美国,借此来回忆一下美国生活。关于租房我和一个朋友在离斯坦成都最大的公园是什么?这么说吧,成都的公园没有最大,只有更大。以前我觉得塔子山公园就是最大的了,后来的浣花溪公园成了第一。而现在成都新建的公园个个巨无霸,比以前的公园不知大了多少倍。因此我只能把我心目中异地存款受存款保险保护吗?实际上目前对储户是没有异地存款的限制的。目前的限制是对银行的异地揽储的限制,这个是宾语的不同,也就是说银行不允许异地揽储,但是储户异地存款是可以的,比如说你从东北去深圳做生意,深圳长春城市中心会向哪个方向发展?首先,长春城市中心不会向任何方向发展,还是在人民广场一带,那里是长春市重要的政治中心,也是承载了长春这座城市的浑厚历史文化。其次,虽然长春市这几年扩张速度很快,西部以西客站为核心发有一邻居,每天晚上都要来家聊天,一聊就两三小时,该如何是好?找他借钱呲牙这事确实有点烦人,硬性拒绝不妥,只要开动脑筋,也不难解决!可事前与你某一友密约好,等邻居一到家,你就发短信给友,让他过三五分钟后打电话过来,以有急事要你出来把你调开。连农村出现了不少大学生光棍,是什么原因啊?两个堂哥,研究生,好工作,一个36,一个38,至今没成家。二哥阅女无数,大哥见女孩就脸红。急得60多岁的大伯大妈天天在家抹眼泪。大伯家的两个堂哥,真的是学霸一样的存在。在学习上,从彩民中奖一千万,领奖时工作人员要求捐款,如果不捐会怎样?虽然我没有中过彩票大奖,最大的奖项只不过是5块钱,但这并不影响我对领奖流程的兴趣。目前中彩票大奖之后,大家基本都要到当地的彩票中心进行兑奖,在兑奖的过程中,彩票中心会扣除20的个税月薪过5000都是什么工作?工资高低与所处行业有关,又与所在地单位性质有关,更与所在地有关。在一二线城市工资5000可能大部分人都能达到,但是在我们这种小地方,能够达到5000元以上就很少了。工资高的一般是金为什么高考时间是6月7号8号?个人认为高考时间定在6月7号8号有一下2点原因第一个原因6月环境温度适宜6月份的气温适宜。2003年之前,我国高考的时间一直都是7月78号。但是由于我国大部分地区7月份气温很高,自都说的是印度的缺点,有没有人科普一下印度的优点及优势?印度和中国有很多相似之处。比如,都是四大文明古国之一,都有悠久的历史,地大物博,人口众多,是世界上仅有的两个十亿级人口的国家。虽然印度的问题很多,但印度最近经济也在快速发展之中,目没有电梯的6层小区房,买第几楼最好,第几楼最差?这要根据你的年龄和身体状况,退休的老人买一层最适合了,中年人买二三四最理想了,三层最好。如果六层有阁楼,那五层是最差的楼层。如果六层没阁楼是平层,那么六层是最差的楼层,冬冷夏热,年