从零开始实现放置游戏(八)——实现后台管理系统(6)代码重构

简介:   前几张,我们主要实现了升级经验、人物等级属性、地图、地图怪物,这四种配置的增删查改以及Excel导入功能。我们主要以地图怪物为例,因此在文章末尾提供的源代码中只实现了地图怪物这部分的逻辑功能。  如果你照猫画虎,把4种配置功能的逻辑全部实现的话,就会发现,增删查改的代码基本相同,除了SQL语句和模型对象不同,其他地方变化不大。  本章我们利用泛型模板,对整个系统就行重构。在重构结束后,你就会发现写代码简直就是特喵的艺术!

 前几张,我们主要实现了升级经验、人物等级属性、地图、地图怪物,这四种配置的增删查改以及Excel导入功能。我们主要以地图怪物为例,因此在文章末尾提供的源代码中只实现了地图怪物这部分的逻辑功能。


  如果你照猫画虎,把4种配置功能的逻辑全部实现的话,就会发现,增删查改的代码基本相同,除了SQL语句和模型对象不同,其他地方变化不大。


  本章我们利用泛型模板,对整个系统就行重构。在重构结束后,你就会发现写代码简直就是特喵的艺术


后端重构


idlewow-core


  我们从最底层开始,首先重构位于core模块中的数据访问层。目前看来,基本上所有的模型对象,都应包含增删查改、批量添加、列表查询这些基本方法。那我们把这些方法抽象到一个单独的Mapper和Manager里。


  新建com.idlewow.common包,再该包下新建接口类BaseMapper:


BaseMapper.java


再在该包下,新建一个抽象类BaseManager,代码如下:


BaseManager.java


 还是以地图怪物为例,我们重构MapMobMapper和MapMobManager,只要让他们继承BaseMapper和BaseManager即可,代码如下:


MapMobMapper.java


MapMobManager.java


重构后的Mapper和Manager直接继承基类的增删查改方法,无需在各个业务中一遍又一遍的书写重复代码。


idlewow-rms


  在rms模块中,主要对controller中的重复代码进行重构。在前几章,我们抽象出过一个BaseController,在里面实现了一些最基础的方法。这里,我们再抽象出一个CrudController来实现数据的增删查该;在CrudController的基础上,再抽象出一个ExcelController来实现Excel的批量导入。


  在com.idlewow.rms.controlelr包下新建抽象类CrudContoller,代码如下:


CrudController.java


 这个CrudController起到了一个模板的作用,可以说非常的精髓。首先,利用泛型约束,解决了不同业务数据模型、查询参数不同的问题。然后,通过反射获取不同业务controller的Url映射,解决了不同业务跳转页面路径不同的问题。具体业务的controller直接继承此类,无需再写任何代码,即可实现增删查改。


  下面我们再实现Excel导入功能的模板类,在该包内新建一个抽象类ExcelController,代码如下:


ExcelController.java


在这个类中,我们将Excel导入功能分解成3个方法。importExcel,对应前端点击事件,保存上传的临时文件;saveExcelData,保存解析出的数据,即调用mapper的批量添加方法;这两个方法都是通用的,直接在ExcelController中实现即可。只有loadExcelData,解析Excel数据这个方法,不同业务的实现不同,我们把它定义成抽象方法,等待各个业务自己实现。


  好了,基类已经定义好了,我们让MapMobController继承ExcelController即可,代码如下:


 MapMobController.java


 现在业务Controller里,只有一个独立实现的loadExcelData方法,再也不用重复书写增删查改了。(注意:这个类里多了个缓存对象mapCache,是我用来缓存地图数据的。pom中添加了对应包,具体可在源码中查看。用法比较简单,可搜EhCache。)


前端重构


  除了后端代码冗余外,其实很容易发现,前端的代码重复部分也很多,尤其是写ajax请求的部分,其实每次变化的只有url地址,或者请求参数等。我们直接在js里定义一个类来实现增删查改等这些ajax请求的通用部分。


  在/webapp/js/helper.js中,定义一个类CRUD,代码如下:


 Helper.js


然后,在/webapp/js/wow/map_mob中,修改add.js, edit.js 和 list.js 如下:


add.js


 edit.js


list.js


 可以看到,重构后的js,和后端一样,简洁多了。


运行效果


  这里,由于改动了core模块,需要先对项目编译打包。再运行rms模块,即可正常启动项目。启动后,效果和之前一样,只是代码变得简洁多了,这里就不再截图了。


小结


  本章终于把冗余的代码进行了重构,整个代码瞬间提升了几层逼格,变得干净多了。

说明:我的代码风格就是不套用设计模式,在不确定最终效果时,不做过多提前设计,先实现了再说,实现了再慢慢重构,还有就是几乎不注释。


  最近因为有其他的事情,所以停更了一周。写到这里其实发现这一大章题目似乎叫RMS系统的初步实现更好。


  写代码和写文章其实差别还有点大。自己写代码的时候,想到哪写到哪,各个模块并行随缘开发。但写文章就必须按一定顺序来,否则容易让人困惑。所以文章里的代码都是单独拉一个分支重新整理的。

相关文章
|
缓存 NoSQL 数据库
从零开始实现放置游戏(十六)——道具系统(1)道具字典
道具系统是游戏的核心系统之一,常见的业务功能包括 “角色背包”, “道具商店”, “怪物掉落” 等,都依赖道具系统。     在实现这些功能之前,首先要解决的问题就是要定义我们的游戏世界中,到底会有哪些道具, 以及这些道具是如何分类的?     这就是我们这期要做的“道具字典“。首先必须要有一个“字典”来说明这个道具是什么,接下来才能有“背包”系统,来表示角色的背包里有些什么道具,数量有多少。
从零开始实现放置游戏(十六)——道具系统(1)道具字典
|
前端开发 JavaScript Java
从零开始实现放置游戏(三)——实现后台管理系统(1)后台管理系统搭建
上一章已经把整体的代码框架搭建完毕。然而整个游戏的功能非常的多,这就要求我们必须思路清晰,把所有功能依次分解开,逐步实现。
从零开始实现放置游戏(三)——实现后台管理系统(1)后台管理系统搭建
|
定位技术
从零开始实现放置游戏(一)——游戏设计
想要做一款成功的游戏,离不开优秀的策划,设计,玩法,美术,等等等等。这其中需要学习的东西太多。然而多想无益,这些东西越学越多,只有先尽快做出成品,然后不断迭代,才能更加深入了了解。因此,这里我们直接参考已有的成功案例,并加入一些我们自己的理解,适当改良。
从零开始实现放置游戏(一)——游戏设计
|
SQL XML JSON
从零开始实现放置游戏(四)——实现后台管理系统(2)数值配置的增删查改
 上一章我们将RMS后台管理系统搭建完毕,本章我们就在这个系统上实现录入游戏配置的功能。目前我们需要配置四项,每个等级的人物属性,每个等级的升级经验,游戏地图,地图中的怪物。下面我们以游戏地图配置为例子,实现对它的增删查改功能。
|
存储 前端开发 算法
从零开始实现放置游戏(十五)——实现战斗挂机(6)在线打怪练级
 本章初步实现游戏的核心功能——战斗逻辑。   战斗系统牵涉的范围非常广,比如前期人物的属性、怪物的配置等,都是在为战斗做铺垫。   战斗中,人物可以施放魔法、技能,需要技能系统支持。   战斗胜利后,进行经验、掉落结算。又需要背包、装备系统支持。装备系统又需要随机词缀附魔系统。   可以说是本游戏最硬核的系统。   因为目前技能、背包、装备系统都还没有实现。我们先初步设计实现一个简易战斗逻辑。   战斗动作仅包括普通攻击,有可能产生未命中、闪避和暴击。
从零开始实现放置游戏(十五)——实现战斗挂机(6)在线打怪练级
|
SQL IDE Java
从零开始实现放置游戏(二)——整体框架搭建
上一篇,我们讲解了游戏的大概背景,知道了要做什么内容。现在已经可以开始搭建游戏的代码框架。
从零开始实现放置游戏(二)——整体框架搭建
|
JavaScript 前端开发 Java
从零开始实现放置游戏(九)——实现后台管理系统(7)地图选择控件
前面做了地图怪物的添加,删除,查询等功能。但添加怪物的时候,需要选择怪物所在地图。前几张的源代码中,我忘了把这部分改回去,所以如果想要成功添加,需要自己改一下html界面,手动填写怪物所在地图的ID。然而,我们配置的时候,地图ID并不是固定的,而是数据库自增的。所以这里最好做成一个弹窗,点击后弹出一个地图列表,让我们手动选择怪物所在地图。   本章我们就实现这样一个弹窗控件,实现对地图的选择。后面如果有选择怪物,选择装备等需求,都可照猫画虎。
从零开始实现放置游戏(九)——实现后台管理系统(7)地图选择控件
|
前端开发 Java Maven
从零开始实现放置游戏(七)——实现后台管理系统(5)参数校验
前面几章实现了在RMS系统中进行数据的增删查改以及通过Excel批量导入。但仍有遗留的问题,比如在新增或编辑时,怪物的生命值、护甲等数据我们可以输入负值,这种数据是不合理且没有意义的。本章我们就实现服务端对参数的校验。
|
XML 前端开发 Java
从零开始实现放置游戏(十)——实现战斗挂机(1)hessian服务端搭建
 前面实现RMS系统时,我们让其直接访问底层数据库。后面我们在idlewow-game模块实现游戏逻辑时,将不再直接访问底层数据,而是通过hessian服务暴露接口给表现层。   本章,我们先把hessian服务搭好,并做一个简单的测试,这里以用户注册接口为例。   先简单介绍下,实现hessian接口,只需要在facade模块暴露接口,然后在core模块实现接口,最后在hessain模块配置好接口路由,将其启动即可。
|
IDE Java 应用服务中间件
从零开始实现放置游戏(五)——实现后台管理系统(3)实现切面日志
 上一章,我们初步实现了后台管理系统的增删查改功能。然而还有很多功能不完善。这一章,我们先把系统日志搭建起来,不管是生产问题排查,还是方便开发调试,日志都是必不可少的核心功能。所谓切面日志,比如说,我们想把每个方法的入参都记录日志,那需要在每个方法里都写一行记录参数的语句,非常繁琐。所以需要提取出切面“方法执行前”,“方法执行后”等等,然后在这个切面里进行编程,记录入参的语句只需要写一次。
从零开始实现放置游戏(五)——实现后台管理系统(3)实现切面日志

热门文章

最新文章