漫谈反射在业务代码中的应用

    很多人都觉得写业务代码很枯燥,没有什么技术含量,大部分就是if-else逻辑的叠加。写业务代码确实没有写中间件来的高大上,但是我觉得不管是写什么代码,想要写出好的代码都不是一件容易的事情。这不,最近我们生产系统的版本迭代过程中一个需求就让我思考了很多,并且在实现方式上做得更加的优雅。

   场景如下:我们在生产系统中需要维护各个游戏的状态,当需要上线一个游戏时,需要对该游戏的各方面的信息做一遍检查,当检查所有的字段都达到要求之后,再切换该游戏的状态为已上线。首先,针对安卓游戏,我们需要检查该游戏的资质审核状态,运营包地址和渠道包地址是否分发完成,基本信息中的必填字段是否非空,是否接入公司的sdk,若接入sdk,则还需要检查该游戏的支付信息中的必填字段是否已经完成等等,针对ios游戏,h5游戏以及网页游戏,我们需要检查的字段各不相同。

   首先看到这个需求,给人的第一感觉是很繁琐,每个游戏的字段很多,由于在后台使用了mbg,游戏的支付信息,安装包信息和基本信息等字段并不在同一个bean中,并且我们还要区分游戏的类型,不同的游戏要检查的字段也不尽相同,最后,关于游戏的基本信息,支付信息等信息的必填字段还在不断的增加,这一部分的业务的变化也较为频繁。若后续的必填字段有调整或者新增,那这里的代码也要做改动。

   好了,我们立马动手写,取出这个游戏的所有的字段,为需要校验的字段去一个个的判断是否符合要求......这时候,我们发现字段太多了,写起来很累,而且这段代码无论是从可读性和可扩展性上来讲,都做的不够好。在非常沮丧的时候,我想到了反射,如果把反射用在这里,是不是使得代码中避免了大量的if(XXX == null)这样的语句呢,赶紧动手写。代码如下:

   首先把最核心的判断解决了,如果该游戏有一个字段不符合要求,直接抛出我们自定义的异常传给前端展示:

1 /** 2 * 通过反射比较配置的必填字段和数据库取出的bean,找出必填的字段是不是空,传入gameId便于直接返回ajax信息 3 * 4 * @param tGameInfo 5 * @param gameRequiredInfoConfig 6 * @param gameId 7 * @param gameInfoType 8 * @throws GameRequiredInfoException 9 */ 10 private void reflectCheckRequiredInfo(Object tGameInfo, List<String> gameRequiredInfoConfig, long gameId, int gameInfoType) throws GameRequiredInfoException { 11 try { 12 // 反射model,校验gameInfo的必填属性的值是不是空 13 Field[] gameInfoFields = tGameInfo.getClass().getDeclaredFields(); 14 for (Field gameInfoField : gameInfoFields) { 15 gameInfoField.setAccessible(true); 16 if (gameRequiredInfoConfig.contains(gameInfoField.getName()) && Objects.isNull(gameInfoField.get(tGameInfo))) { 17 if (gameInfoType == GameInfoType.BASE.getValue()) { 18 throw new GameRequiredInfoException("该游戏基本信息不完整,请前往<a href=http://www.likecs.com/\'" + applicationConfig.getBaseUrl() + "/game/editBaseInfo?gameId=" + gameId + "\' target=http://www.likecs.com/\"_blank\">游戏详情</a>页面完善资料后重试!"); 19 } else if (gameInfoType == GameInfoType.PAY.getValue()) { 20 throw new GameRequiredInfoException("该游戏支付信息不完整,请前往<a href=http://www.likecs.com/\'" + applicationConfig.getBaseUrl() + "/game/editInterfaceInfo?gameId=" + gameId + "\' target=http://www.likecs.com/\"_blank\">游戏详情</a>页面完善资料后重试!"); 21 } else if (gameInfoType == GameInfoType.PACKAGE.getValue()) { 22 throw new GameRequiredInfoException("该游戏安装包信息不完整,请前往<a href=http://www.likecs.com/\'" + applicationConfig.getBaseUrl() + "/game/editPackageInfo?gameId=" + gameId + "\' target=http://www.likecs.com/\"_blank\">游戏详情</a>页面完善资料后重试!"); 23 } 24 } 25 } 26 } catch (IllegalAccessException e) { 27 throw new GameRequiredInfoException("获取字段信息失败,后台配置错误"); 28 29 } 30 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzpfx.html