小白网-奉贤部落-奉贤免费信息发布平台

查看: 65|回复: 0

设想形式在营业系统中的利用设想形式项目中的利用

[复制链接]

2万

主题

0

回帖

8万

积分

论坛元老

Rank: 8Rank: 8

积分
88256
发表于 2025-7-26 12:48 | 显示全部楼层 |阅读模式
本文的重点在于说明工作中所利用的设想形式,为了可以更好的了解设想形式,首先简单先容一下营业场景他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。利用设想形式,可以简化代码、进步扩大性、可保护性和复用性他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。有哪些设想形式,这里就不再先容了,网上很多,本文只先容所用到设想形式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
一 线路检查工具1 意义
为什么需要线路检查工具呢,有以下几个方面的缘由:
每逢大促都需要停止各收集和各行业的线路调剂,调剂完成以后,能否获得期望状态,需要检查确认他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。高低流利用之间数据的分歧性检查,假如存在纷歧致,能够会在定单实行时形成卡单他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。有些题目发生后,营业同学需要周全检查一遍线路数据,判定能否合适预期他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。各范畴之间的数据变更缺少联动性,致使资本和线路出现纷歧致他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。为什么要把线路检查工具产物化呢,斟酌以下:
之前每次大促,都是技术同学现场编写代码捞数据给到营业同学,而且由于职员活动性较大,代码可复用性较低,致使反复劳动他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。产物化后,可以方便地传承下去,避免不需要的反复劳动他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。每次由于时候告急,现场写的代码都比力简单,经常是间接将数据打印到标准输出,然后复制出来,野生拆分转成Excel格式;这样的进程要停止屡次,占用太多技术同学的时候他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。产物化后,束缚了技术同学,营业同学可以自己在页面操纵他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。很大都据检查,是每次大促城市停止的,营业同学与技术同学之间往返相同的本钱较高他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。产物化后,可以避免这些耗时耗力的相同,大师可以把更多的时候放在其他的大促保障工作上他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。2 检查项
按照2020年D11停止的数据检查,本次共实现8项,下面罗列了4项,以下:
时效对齐检查:确保实行分单一般他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。弱控线路与表达收集分歧性:确保实行和路由不会由于线路缺失而卡单他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。资本映照和编码映照分歧:前者是表达线路时所用,后者是定单履约时所用,确保表达和履约可以分歧他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。检查线路数目:统计现存线路的情况他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。好了,领会了布景常识,下面起头先容所用到的设想形式,以及为什么要用、怎样用他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
二 设想形式1 模板方式形式+泛型
上述8项数据检查工具,大致的处置流程是类似的,以下:
针对分歧的检查工具,只要“线路数据检查”这一步是纷歧样的逻辑,其他步调都是不异的,假如每个检查工具都实现这么一套逻辑,一定形成大量的反复代码,保护性较差他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
模板方式形式可以很好地处理这个题目他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。模板方式设想形式包括模板方式和根基方式,模板方式包括了首要流程;根基方式是流程中共用的逻辑,如建立检查使命,成果输出等等他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
下图是所实现的模板方式形式的类继续关系:
分析以下:
1)DataCheckProductService接口为对外供给的办事,dataCheck方式为同一的数据检查接口他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
2)AbstractDataCheckProductService是一个笼统类,设定模板,即在dataCheck方式中设定好流程,包括以下:
commonParamCheck方式:停止参数正当性检查,分歧法的情况下,间接返回他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。createFileName方式:建立文件称号他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。createTaskRecord方式:建立检查使命他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。runDataCheck方式:停止数据检查,这是一个笼统方式,一切检查工具都要实现此方式,以实现自己的逻辑他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。uploadToOSS方式:将检查成果上传到OSS,便于下载他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。updateRouteTask方式:竣事时更新使命为完成他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。dataCheck方式为模板方式,runDataCheck方式由各个子类去实现,其他方式是根基方式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。还有一些其他方式,是各个检查工具都需要利用的,所以就放在了父类中他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
3)CheckSupplierAndCodeMappingService类、CheckLandingCoverAreaService类和CheckAncPathNoServiceService类为具体的检查工具子类,必须实现runDataCheck方式
由于分歧检查项检的查成果的格式是纷歧样的,所以利用了泛型,使得可以兼容分歧的检查成果他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
简化的代码以下:
public interface DataCheckProductService { baseResult dataCheck(DataCheckRequestDTO requestDTO);}public abstract class AbstractDataCheckProductService implements DataCheckProductService {@Overridepublic  baseResult dataCheck(DataCheckRequestDTO requestDTO){try{//1. 参数正当性检查Pair paramCheckResult = commonParamCheck(requestDTO);if(!paramCheckResult.getLeft()){return baseResult.ofFail(paramCheckResult.getRight());}//2. 建立导出使命String fileName = createFileName(requestDTO);RouteTaskRecordDO taskRecordDO = createTaskRecord(fileName, requestDTO.getUserName());//3. 停止数据检查List resultList = Collections.synchronizedList(new ArrayList());runDataCheck(resultList, requestDTO);//4. 写入文件String ossUrl = uploadToOSS(fileName,resultList);//5. 更新使命为完成状态updateRouteTask(taskRecordDO.getId(),DDportTaskStatus.FINISHED.intValue(), resultList.size()-1,"",ossUrl);return baseResult.ofSuccess(taskRecordDO.getId());}catch (Exception e){LogPrinter.errorLog("dataCheck-error, beanName="+getBeanName(),e);return baseResult.ofFail(e.getMessage());}}public abstract  void runDataCheck(List resultList, DataCheckRequestDTO requestDTO);}public class CheckSupplierAndCodeMappingService extends AbstractDataCheckProductService{@Overridepublic  void runDataCheck(List resultList, DataCheckRequestDTO requestDTO){//自己的检查逻辑}}public class CheckLandingCoverAreaService extends AbstractDataCheckProductService{@Overridepublic  void runDataCheck(List resultList, DataCheckRequestDTO requestDTO){//自己的检查逻辑}}public class CheckAncPathNoServiceService extends AbstractDataCheckProductService{@Overridepublic  void runDataCheck(List resultList, DataCheckRequestDTO requestDTO){//自己的检查逻辑}}
利用模板方式形式的益处是:
简化了代码,每个工具只需要关心自己的焦点检查逻辑,不需要关注前置和后置操纵他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。进步了扩大性,可以方便地增加新的检查工具他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。同一的异常捕捉和处置逻辑,子类有异常,虽然往外抛出他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。2 战略形式
之所以会用到战略形式,是由于一些检查工具写完以后,发现跑出来的成果数据太多,有几万、几十万等等,一方面,检查比力耗时,成果文件会很大,下载耗时;另一方面,这么大都据给到营业同学,他们也很难处置和分析,也许他们只是想看一下整体情况,并不想看具体的到哪个地方的线路他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。为此,在本来计划设想的根本上,增加了“统计信息”的选项,让用户可以自行挑选“具体信息”还是“统计信息”,对应到页面上就是一个单选框,以下:
现在增加了一种检查方式,此后能否还会有其他的检查方式?完全有能够的他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。所以得斟酌到扩大性,便于前面同学增加新的检查方式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
此外,还有一种场景也可以利用战略形式,那就是营业系统中有很多营业收集,分歧收集之间有一些差别;本次所实现的检查工具,有几个触及到多个收集,此后能够会触及到一切收集他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
综合以上两种场景,最合适的就是战略形式了他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。“具体信息”和“统计信息”各采用一种战略,分歧收集利用分歧的战略,既便于代码了解,又便于后续扩大他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
“具体信息”和“统计信息”两种检查成果的战略类图以下:
剖析:
CompareModeStrategy对外供给同一的成果处置接口doHandle,战略子类必须实现此接口他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。SupplierAndCodeMappingStatisticsStrategy和SupplierAndCodeMappingDetailStrategy是检查配送资本和编码映照分歧性的两种成果信息方式,前者为统计方式,后者为具体方式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。LandingCoverAreaStatisticsStrategy和LandingCoverAreaDetailStrategy是检查落地配覆盖范围的两种成果信息方式,前者为统计方式,后者为具体方式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。那AbstractCompareModeStrategy是干什么用的?它是一个笼统类,负责承接一切战略子类共用的一些方式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。简化的代码以下:
public interface CompareModeStrategy { List doHandle(List list, DataCheckRequestDTO requestDTO);}public abstract class AbstractCompareModeStrategy implements CompareModeStrategy {//子类的共用方式,可以放在此类中}public class LandingCoverAreaDetailStrategy extends AbstractCompareModeStrategy{@Overridepublic  List doHandle(List list, DataCheckRequestDTO requestDTO){List resultList = new ArrayList();//检查成果处置逻辑return resultList;}}public class LandingCoverAreaStatisticsStrategy extends AbstractCompareModeStrategy{@Overridepublic  List doHandle(List list, DataCheckRequestDTO requestDTO){List resultList = new ArrayList();//检查成果处置逻辑return resultList;}}public class SupplierAndCodeMappingDetailStrategy extends AbstractCompareModeStrategy{@Overridepublic  List doHandle(List list, DataCheckRequestDTO requestDTO){List resultList = new ArrayList();//检查成果处置逻辑return resultList;}}public class SupplierAndCodeMappingStatisticsStrategy extends AbstractCompareModeStrategy{@Overridepublic  List doHandle(List list, DataCheckRequestDTO requestDTO){List resultList = new ArrayList();//检查成果处置逻辑return resultList;}}
一样,分歧收集的处置战略类图以下:
代码与上面类似,就不展现了他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
利用战略形式的益处是:
进步代码扩大性,后续增加此外成果格式或此外收集处置逻辑,可以在不点窜其他战略的情况下间接新增他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。进步代码可读性,取代了if...else,条理清楚他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。分歧系列采用分歧的战略,战略与战略之间可以嵌套利用,构成战略的叠加功效他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。3 工场形式
工场形式处理的是bean的生产题目,简单工场形式按照入参生产分歧的bean,普通工场形式针对每个bean都构建一个工场,此两者各有好坏,看需要他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。本计划采用的是简单工场形式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
之所以利用工场形式,是由于有太多的bean需要机关,假如在营业逻辑中机关各类bean,则会显得混乱和分离,所以需要一个同一天生bean的地方,更好地治理和扩大他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
本计划中首要有三类bean需要工场来天生:
模板方式形式中所用到的子类他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。检查成果格式战略中所用到的子类他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。分歧收集处置战略中所用到的子类他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。所以,利用三个工场别离机关这三品种型的bean他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。别的,由于每个bean首要的功用都在方式中,不触及类变量的利用,所以可以操纵spring容器天生的bean,而不是我们自己new出来,这样就使得bean可以反复利用他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。是以,这里的工场只是bean的决议(按照参数决议利用哪个bean),不用自己new了他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
三个工场别离以下:
DataCheckProductFatory:由getDataCheckProductService方式按照输入参数决议利用哪个数据检查工具他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。CompareModeStrategyFactory:用于决议利用哪类格式输出,由于将输出战略分为了2类(具体信息和统计信息),所以需要传入两个参数才能决议利用哪类战略他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。DataCheckNetworkStrategyFactory:用于决议利用哪类收集处置战略,由于将战略分为了2类(4PL收集和其他收集),所以需要传入两个参数才能决议利用哪类战略他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。这三个工场的代码类似,这里就以CompareModeStrategyFactory为例,简化的代码以下:
@Servicepublic class CompareModeStrategyFactory {@Resourceprivate LandingCoverAreaDetailStrategy landingCoverAreaDetailStrategy;@Resourceprivate SupplierAndCodeMappingDetailStrategy supplierAndCodeMappingDetailStrategy;@Resourceprivate LandingCoverAreaStatisticsStrategy landingCoverAreaStatisticsStrategy;@Resourceprivate SupplierAndCodeMappingStatisticsStrategy supplierAndCodeMappingStatisticsStrategy;public CompareModeStrategy getCompareModeStrategy(DataCheckProductEnum productEnum, DataCompareModeEnum modeEnum){CompareModeStrategy compareModeStrategy = null;switch (modeEnum){case DETAIL_INFO:compareModeStrategy = getDetailCompareModeStrategy(productEnum);break;case STATISTICS_INFO :compareModeStrategy = getStatisticsCompareModeStrategy(productEnum);break;default:;}return compareModeStrategy;}private CompareModeStrategy getDetailCompareModeStrategy(DataCheckProductEnum productEnum){CompareModeStrategy compareModeStrategy = null;switch (productEnum){case CHECK_LANDING_COVER_AREA:compareModeStrategy = landingCoverAreaDetailStrategy;break;case CHECK_SUPPLIER_AND_CODE_MAPPING:compareModeStrategy = supplierAndCodeMappingDetailStrategy;break;default:;}return compareModeStrategy;}private CompareModeStrategy getStatisticsCompareModeStrategy(DataCheckProductEnum productEnum){CompareModeStrategy compareModeStrategy = null;switch (productEnum){case CHECK_LANDING_COVER_AREA:compareModeStrategy = landingCoverAreaStatisticsStrategy;break;case CHECK_SUPPLIER_AND_CODE_MAPPING:compareModeStrategy = supplierAndCodeMappingStatisticsStrategy;break;default:;}return compareModeStrategy;}}
利用工场形式的益处是:
便于bean的治理,一切的bean都在一处建立(或决议)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。条理清楚,便于阅读和保护他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。4 “代理形式”
这个代理形式是打着双引号的,由于不是实在的代理形式,只是从实现方式上来说,具有代理形式的意义他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。为什么需要用到代理形式?是由于类太多了,营业逻辑分离在各个类中,有的在模板子类中,有的在收集战略中,有的在成果输出格式战略中,而这些营业逻辑都需要多线程履行和异常捕捉他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。倘使有个代理类,可以收口这些处置逻辑,只需增加前置多线程处置和后置异常处置即可他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
Java说话中的函数式编程,具有这类才能他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。所谓函数式编程,是指可以将方式当做参数传递给方式,前面“方式”是营业逻辑,前面“方式”是代理,将营业逻辑传递给代理,就实现了同一收口的目标他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
可以实现此功用的接口有四个,别离是:Consumer、Supplier、Predicate与Function,怎样利用可以网上查询他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。本计划利用的是Consumer,由于它是用来消耗的,即需要传入一个参数,没有返回值,合适本计划的设想他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
简化后的代码以下:
@Servicepublic class CheckLandingCoverAreaService extends AbstractDataCheckProductService {@Overridepublic  void runDataCheck(List resultList, DataCheckRequestDTO requestDTO){dataCheckUtils.parallelCheckByFromResCodes(requestDTO,requestDTO.getFromResCodeList(),fromResCode->{ExpressNetworkQuery query = new ExpressNetworkQuery();query.setNs(NssEnum.PUB.getId());query.setStatus(StatusEnum.ENABLE.getId());query.setGroupNameList(requestDTO.getGroupNameList());query.setBrandCodeList(requestDTO.getBrandCodeList());query.setFromResCode(fromResCode);List masterExpressNetworkDOS = tmsMasterExpressNetworkService.queryExpressNetworkTimeList(query);startCompareWithAnc(resultList,requestDTO,masterExpressNetworkDOS,fromResCode,solutionCodeMap);});}}@Servicepublic class DataCheckUtils {public  void parallelCheckByFromResCodes(DataCheckRequestDTO requestDTO, List fromResCodeList, Consumer checkOperation){List futureList = Collections.synchronizedList(new ArrayList());fromResCodeList.forEach(fromResCode->{CompletableFuture future = CompletableFuture.runAsync(() -> {try{checkOperation.accept(fromResCode);}catch (Exception e){LogPrinter.errorLog("parallelCheckByFromResCodes-error, taskId="+requestDTO.getTaskId(),e);recordErrorInfo(requestDTO.getTaskId(),e);}}, DATA_CHECK_THREAD_POOL);futureList.add(future);});//期待一切线程竣事futureList.forEach(future->{try{future.get();}catch (Exception e){LogPrinter.errorLog("parallelCheckByFromResCodes-future-get-error",e);}});}}
可以看出,Consumer所代表的就是一个方式,将此方式作为parallelCheckByFromResCodes方式的一个参数,在parallelCheckByFromResCodes中停止多线程和异常处置,既能同一收口,又大大削减了反复代码他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
代理形式的益处是:
同一收口多种分歧的营业逻辑,同一做日志和异常处置他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。削减反复代码,进步了代码质量他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。可保护性较强他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。5 其他
像成果输出格式战略形式那样,虽然AbstractCompareModeStrategy没有现实的营业逻辑,但仍然把它作为一个基类,目标是一切子类共用的逻辑或方式,可以放在此类中,削减代码量,提升保护性他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
可是有的时辰,不是继续自同一个基类的子类们,仍然要共用一些逻辑或方式(如parallelCheckByFromResCodes方式),但Java说话限制一个类只能继续一个基类,怎样办呢?简单的法子就是把这些共用逻辑或方式放到一个工具类(如DataCheckUtils)中他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
三 思考&感悟在做这个项目标进程中,刚起头没有很好的设想,也没有想的很周全,致使代码改了又改,虽然迟误点时候,但感觉是值得的他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。总结以下几点:
将提升代码可读性、可扩大性和可保护性的认识注入到平常的项目中,便于自己,利于他人他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。假如项目告急没时候斟酌很多,希望以后偶然候时可以改良和优化他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。工作不可是为了完成使命,更是提升自己的进程他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。才能要用未来停止时他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。作者 | 兴亮
原文链接:http://click.aliyun.com/m/1000286002/
本文为阿里云原创内容,未经答应不得转载他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白网-奉贤部落-奉贤免费信息发布平台  

GMT+8, 2025-11-12 09:35 , Processed in 0.374450 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表