当前位置: 首页 > news >正文

关于游戏中仓库类的设计

前言

这个游戏中的仓库类设计开始于春节前,和大家一样,我也是期盼着放假而无心工作,所以在放假前一天虽然蹦出了思维的火花,我却没有使用文字记录下来,但是大致的思路我已经记录到脑子中了,这一次的突然感悟,与上次突然明白什么是选择排序,什么是冒泡排序很类似,都是一瞬间突然明白,是一个从量变到质变的过程,接下来简单记录下我关于仓库的理解。

初觉不妥

游戏中的仓库是用来存放道具的,这是我在接触这套游戏代码时形成的稳固的印象,结果就是代码中充斥着道具属性的判断,因为是很古老的代码,一开始我并没有产生疑问,同时也是修修补补的解决了许多BUG,可是渐渐的问题暴露了出来,设计上仓库里存储的是道具的索引,通过索引可以找到唯一的一个道具,这个思想根深蒂固,导致在写代码时自然而然的就在仓库的类里直接判断了道具属性,仔细想想这是不正确的。

起初感觉有问题时,大概是工作两年后,第一次重构道具系统的时候,当时在写放入道具和取出道具的时候总感觉怪怪的,但是又说不出问题出在哪里,其实就是在放入和取出的逻辑中,操作了道具的属性,修改了道具的坐标。也就是在仓库类的代码中设置了道具的属性,但是他们两个类不是依赖关系,硬生生的产生了依赖关系。

新的任务

道具系统的第一次重构,我并没有找到为什么代码怪怪的,也就没有修改,但是新的任务在工作4年之后给了我一个新的机会,再写一遍道具系统,这时候那段奇怪的代码给我的感觉更强烈了,绝对有问题,也就是那么一瞬,我似乎明白了,仓库这个类被我们强加了太多的东西,谁说仓库中就一定要放道具了,我们在游戏中也没有直接把道具的对象保存在仓库中,而是把道具的索引存在了仓库中,也就是仓库中存储了道具的身份证,同理如果我们把人的身份中存在仓库中,那么仓库就是管理人的,如果我们把车牌号存储在仓库中,那么仓库就是管理车辆的。

因为起初游戏中的仓库只保存了道具的索引,所以我们想当然的认为仓库中只能保存道具,所以把一大堆的道具操作代码写到了仓库类中,是时候把代码提出来了,仓库就是仓库,它只根据坐标存储对应数据的ID,而这个ID对应的数据,应该在仓库以外的类中操作,这个ID可能对应道具、可能对应人、也可能对应车辆,干干净净的仓库管理了一组数据的ID,至于对ID对应数据的操作,一概不应该放在仓库类中进行。

重构的结果

仓库类简简单单,保存着道具ID,只提供按位置放入ID,按位置取出ID,能够给出仓库的使用情况,能够初始化仓库的状态,仓库类有以上这些操作足以,仓库本身并不应该知道自己存的是道具还是车辆,真正要修改道具的属性,或者要查找指定属性的道具,放到道具管理类中来编写逻辑即可。

相关文章:

  • .bat批处理(五):遍历指定目录下资源文件并更新
  • 神秘莫测的时间复杂度
  • 排序算法系列之(三)——略显神秘的快速排序
  • .bat批处理(六):替换字符串中匹配的子串
  • 操作指向类成员的指针需要了解的两个操作符-*和.*
  • VS2015调试dump文件时提示未找到xxx.exe或xxx.dll
  • 结构体sockaddr、sockaddr_in、sockaddr_in6之间的区别和联系
  • 简述TCP三次握手和四次挥手流程
  • 智能指针(零):分类及简单特性
  • 智能指针(一):auto_ptr浅析
  • 智能指针(二):shared_ptr浅析
  • 智能指针(四):unique_ptr浅析
  • Lua中关于table对象引用传递的注意事项
  • VS2015调试dump文件时提示打不开KERNELBASE.dll
  • Mysql中使用select into语句给变量赋值没有匹配记录时的结果
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • Android 架构优化~MVP 架构改造
  • CentOS从零开始部署Nodejs项目
  • Consul Config 使用Git做版本控制的实现
  • cookie和session
  • Docker 笔记(2):Dockerfile
  • gops —— Go 程序诊断分析工具
  • interface和setter,getter
  • Java编程基础24——递归练习
  • JS专题之继承
  • mockjs让前端开发独立于后端
  • spring-boot List转Page
  • 深度解析利用ES6进行Promise封装总结
  • 我与Jetbrains的这些年
  • 云大使推广中的常见热门问题
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 选择阿里云数据库HBase版十大理由
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​学习一下,什么是预包装食品?​
  • ![CDATA[ ]] 是什么东东
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #NOIP 2014# day.2 T2 寻找道路
  • #NOIP 2014#Day.2 T3 解方程
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (07)Hive——窗口函数详解
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (利用IDEA+Maven)定制属于自己的jar包
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (实战篇)如何缓存数据
  • (四)鸿鹄云架构一服务注册中心
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转) ns2/nam与nam实现相关的文件
  • (转)http-server应用
  • (转)ORM
  • .gitignore文件—git忽略文件