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

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

  简介: 提高代码代码可读性、复用性、可扩展性,从而提高开发体验和效率是基础素养。本文分享介绍一种组件化链路设计思想的分享,用于大量产品间具有相似业务处理逻辑的场景,可提高代码的复用性。
  提高代码代码可读性、复用性、可扩展性,从而提高开发体验和效率是基础素养。减少重复代码,对重复代码进行抽象、下沉,遵守设计原则,应用设计模式,都有一个共同的目的:发现变化,封装变化,提高代码的可复用性,减少需求变化影响的范围,从而使软件、系统、云服务、网站等能够可控的修改与升级,具有更长的生命周期。
  一、最常见的三层架构
  以我们平常接触较多的三层架构开始: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
  版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

iPhone14Pro系列烧屏,粉丝称正常现象,小米11用户不服相信这些天大家看到过许多相关报道,iPhone14Pro系列灵动岛出现严重烧屏,不少网友抱怨影响正常使用。此时一些果粉坐不住了,跳出来指出烧屏是OLED屏幕的正常现象,安卓手机用时江西上饶1号公路串起沿线农民的增收致富路编者按从2021年起,上饶市用5年时间打造500公里高品质的1号公路。2022年,上饶将在全市范围内大力推进1号公路建设,使1号公路成为服务人民群众便捷出行的交通安全线连接山水林田异域风情游我们推荐河口!1月8日河口南溪河口岸恢复通关迎宾客这个推荐河口的机会一定不能放过如果你来河口旅游这些美景一定不要错过!中国河口口岸来到河口必不可少的打卡点就是中国河口口岸景点介绍中国河口口岸位于万安滩我国重要领土,中越在此多次对峙,它究竟为何重要?说起南海群礁,想必大家第一时间都会想到美济岛永暑岛等著名的人工岛屿。可大家知道吗?在我国南海地区,有一个比永暑岛还要重要的海滩,被越南非法入侵多次,和我国进行过多次对峙。这个海滩叫时隔6年,贾跃亭的FF91实车正式亮相CES展会,若资金到位4月开售贾跃亭的FF91终于要来了,日前,在拉斯维加举办的2023CES电子消费展上,法拉第未来首款车FF91Futurist实车亮相,新车定位为中大型纯电SUV,从2017年FF91Fu苹果手机700块换电池?小米11连换主板都是免费的,怎么不学学!非常离谱,最近听说iPhone13Pro手机的成本只要3600元,结果卖给我们的价格却高达8799元,这个利润简直可以用丧心病狂来形容。卖手机割我们韭菜就算了,苹果手机的维修成本还小米11还能不能买?20年的旗舰,被新出台的政策救活了最近有些小伙伴问我,究竟20年发布的小米11还能不能购买,我一听这个小伙伴的问题,就知道他肯定是一个非常会过日子的男人。他说,他非常喜欢屏幕好的手机,平时喜欢用手机来看看电影,看看谷歌首款折叠屏PixelFold生产计划曝光或在今年第四季度上市作为谷歌的亲儿子,Pixel系列凭借着总能第一时间适配最新版本的安卓系统,像是之前Pixel7系列便成为首款运行Android13的旗舰手机,在市场上一直都拥有较高的关注度。而随着联想2023款小新Pro全能本散热升级IT之家1月9日消息,联想已经开始为即将发布的2023款小新Pro全能本预热。据官方今日发布的海报,小新Pro笔记本的散热规格升级,将拥有更强的性能释放。据官方介绍,小新Pro超能马云,放弃了其网络帝国皇冠上的明珠中国top富翁企业家马云曾被中国捧为成功的典范,但是,由于众所周知的原因,近年来,他已基本从公众视野中消失。这无疑证明,没有马云的时代,只有时代的马云,是国家发展的风云际会才造就了电脑连接手机互传文件,不用数据线,比微信和QQ还快在日常使用手机的过程中,我们经常需要将一些文件在手机与电脑之间互相传输。在大多数情况下,许多人都会第一时间想到通过微信或者QQ来传输文件。虽然使用微信和QQ传输文件也很方便,但是这
2022年IT168年度技术卓越奖获奖名单整机DIY类2022年是非常值得所有DIY整机用户狂欢的一年,在这一年,Intel发布了全新的第13代酷睿系列桌面处理器,再度问鼎至强游戏处理器的宝座,还有首批高性能ARCA770A750独立德尔塔奥密克戎共循环?北京自来水阳了?解答来了!据中央网信办消息,一段时间以来,各类涉疫网络谣言不断出现持续发酵,歪曲国家防疫政策,消解群众抗疫信心,严重危害社会稳定,人民群众对此深恶痛绝。对此,中央网信办深入推进清朗打击网络谣王菲谢霆锋一个前脚刚回北京,一个后脚抱猫回港引争议王菲谢霆锋这一对,这几年频传分手,王菲一副两耳不闻窗外事的洒脱感,谢霆锋倒是辟谣了好几次。近日,港媒再次报道王菲谢霆锋已分手,原因是跨年夜前夕,王菲刚回北京,谢霆锋就急着要回到香港京辽防守大战,辽宁队有望报一败之仇大胜北京队,郭艾伦统治比赛辽宁队坐镇主场迎战北京队,两队的战绩是各有胜负,第一战辽宁队以8381战胜北京队,辽宁队开赛不久就体验到北京队的强硬防守,第二战,北京队以8178战胜辽宁队,整场比赛下来,辽宁队第迪奥二零二三春夏新品,北京SKP新项目DT51是日美好事物记者陈奇锐罗以文编辑楼婍沁迪奥二零二三春夏新品及张园ERL限定系列精品店迪奥近日在上海张园揭幕二零二三春季男装ERL限定系列限时精品店。上海张园ERL限定系列限时精品店以蓝色与粉色盘点护肤篇Hello!Deareveryone!新年快乐呀打工人进入春节小长假倒计时弘叔今年赶在节前精心盘点出了2022年度的爱用好物!贴心提供摸鱼种草读物刚刚过去的2022年美妆界不如往年牙齿对颜值的影响究竟有多大?看完这几组对比图,你就知道了颜值是稳赚不赔的投资,付出精力用对方式,一定会回馈你前所未有的美丽与气质。在不知不觉中变美,不少人都选择了投资牙齿。明眸皓齿檀口樱唇是人们对于古典美人的想象,到了现代,关于牙齿唇红超模亚历桑德拉安布罗休度假穿印花连体泳衣身材佳?超模亚历桑德拉安布罗休度假穿印花连体泳衣身材佳。亚历桑德拉。安布罗休出生于英国的一个中产阶级家庭,她是一位模特演员和舞蹈家,同时也从事过服装制作工作。在一次旅行中她发现了一种奇特的恭喜吴尊成为比音勒芬全新代言人!魅力穿搭,全方位分享中年男人如何去油随着年龄增长,很多男性被拉入了油腻男的队伍当中。中年男性如何去油腻,成为这两年来不少人关注的话题。这不,沈腾就因成功减肥摆脱油腻感而备受关注。近日,沈腾接受中国电影报道采访,网友们女人会穿与不会穿,看她穿的鞋子就知道,差别可真不小在具体的穿搭中,很多姐妹们都忽视了鞋子的搭配。但其实鞋子在整体造型中发挥着非常重要的作用,女人会穿和不会穿,都体现在鞋子的搭配上!选对款式不仅能很好的达到增高作用,而且整套look售罄断货!悦诗风吟红茶面霜成为年货节最大赢家前段时间,由于熬夜频次增加导致皮肤出现疲态,感觉自己老了10岁,作为悦诗风吟的忠实粉丝立马想到它们家的红茶面霜,但在搜索的时候,在旗舰店竟然已经无法搜到链接,一问客服才知道竟然售空