高效、稳定开发功能的一些心得
在开始编码前一定要足够了解案子,了解各种特殊情况,和美术、策划、服务器沟通好,最后写好伪代码。
一些建议
1.尽量复用,例如重复的对象单独抽出来做成item,别的模块也用到的做成通用item,不要写重复代码。
2.做功能前先考虑别人会不会用到,用到可能是什么情况,也可以询问策划,例如下面这个界面有7个业务用到,每个业务的需求都不太一样。做的时候可以先考虑进去。不然后面大概率还是在你的界面做修改,还得反工。
3.能配置的尽量走配置,特别是一些细微的差别,这个很重要。就比如上面的界面可以这么配置
DungeonsDefine.BattleType = enum {ARMY_DETAIL = 1, -- 军团详情SLG = 2, -- 出征军团FORMATION = 3, -- slg校场编队 GUARD_WALL = 4, -- 守城RPG_MONSTER = 5, -- RPG战斗魔物 RPG_DUNGEONS = 6, -- RPG战斗,副本RPG_ARENA = 7, -- RPG战斗竞技场ARMY_MONSTER_DETAIL = 8, -- 猎魔军团详情 }local BattleType = DungeonsDefine.BattleType --isRpg:是否是rpg类型, rpg:显示英雄技能、英雄类型 slg:显示英雄军团技能,带兵量 --isShowAdd:格子为空时是否显示加号, true:显示 --isSizerState:是否筛选英雄状态, true:正常状态排在前,出征英雄排在后 --canSelectOutManor:是否可以选择不再城内英雄 true:可以(isSizerState 为true时才有用到) --isShowState:HeroFormationItem是否显示英雄状态图标 true:显示 --isNotFullTips:自定义英雄结束时,出战英雄未满是否需要提示, true:提示 您还可以选择更多英雄,确定要继续吗 --autoClose:点确定自动关闭界面,默认关闭--title:界面标题,默认 自定义英雄 --btnTxt按钮文本,默认 确定 --showHelp 是否显示帮助按钮 DungeonsDefine.BattleConfig = enum {[BattleType.ARMY_DETAIL] = {isRpg = false, isShowAdd = false, isSizerState = false, canSelectOutManor = true,isShowState = false, isNotFullTips = false, autoClose = true},[BattleType.ARMY_MONSTER_DETAIL] = {isRpg = true, isShowAdd = false, isSizerState = false, canSelectOutManor = true,isShowState = false, isNotFullTips = false, autoClose = true},[BattleType.SLG] = {isRpg = false, isShowAdd = true, isSizerState = true, canSelectOutManor = false,isShowState = true, isNotFullTips = false, autoClose = true},[BattleType.FORMATION] = {isRpg = false, isShowAdd = true, isSizerState = true, canSelectOutManor = true,isShowState = false, isNotFullTips = false, autoClose = true},[BattleType.GUARD_WALL] = {isRpg = false, isShowAdd = true, isSizerState = true, canSelectOutManor = true,isShowState = true, isNotFullTips = false, autoClose = true, title = "des_360", btnTxt = "des_618", showHelp = true},[BattleType.RPG_MONSTER] = {isRpg = true, isShowAdd = true, isSizerState = true, canSelectOutManor = false,isShowState = true, isNotFullTips = true, autoClose = true},[BattleType.RPG_DUNGEONS] = {isRpg = true, isShowAdd = true, isSizerState = true, canSelectOutManor = false,isShowState = true, isNotFullTips = true, autoClose = false},[BattleType.RPG_ARENA] = {isRpg = true, isShowAdd = true, isSizerState = false, canSelectOutManor = true,isShowState = false, isNotFullTips = true, autoClose = false}, }
4.每个功能尽量拆分成一小块(每个小块逻辑在30行以内),定位bug比较方便,策划改案子也比较方便实现,只需要改对应的小块就好了。
详细步骤
1.需求案:尽量对比竞品,详细的看3-4遍。
1-1.需要知道这个功能包括哪些界面。
1-2.策划案是否有遗漏(考虑多种情况,例如有道具怎么展示,没有道具怎么展示)。
1-3.比对竞品,询问策划和竞品不一致的地方。
1-4.如果有多语言,提前配置,方便拼界面时直接使用。
2.美术示意图:
2-1.关注多语言是否超框,一般英语比较长。
2-2.比对案子,是否和案子一致,不一致要及时跟策划沟通。是否有一些情况遗漏了。例如锻造时显示进度条,不锻造时显示文本。
2-3.记录需要用到的数据(服务端、配置读取)
2-4.记录所有的界面按钮,知道按钮的反应事件(请求服务器、打开界面、修改界面逻辑如选中状态、调用其他模块如设置),额外关注需要请求服务端的按钮,第四步定协议用得上。
3.比对服务端协议。例如
3-1.初始化需要数据,例如主界面的小红点。
3-2.需要同步的数据,例如平叛会导致英雄状态、经验值、等级变化,那么都需要同步给英雄模块。
3-3.请求类,基本都是按钮触发,关注请求需要的数据,服务端需要返回的数据。
4.拼界面,经过上面三步,基本案子就很清楚了。
4-1.拆分界面,尽量拆分的细一点,尽量把重复的对象拆分成一个item,例如AcquiredHeroItem。划分后大概是下面这个样子的。拆分规则为:子界面>子item>方法。
按方法划分是指:每个方法负责一部分界面逻辑(例如替换该部分的图片、文本,设置显示隐藏等等)
4-2.界面适配,主要关注宽高比2:1的,4:3的,示意图的比例三种。
4-2.关注多语言,尽量拉长、拉高文本框,因为英语和阿语都比中文长很多。
导图大概是这样子的:
5.写数据类(逻辑类)
5-1.接受并保存服务端下发的数据,对外提供获取数据接口,例如
-- 获取已获得英雄 -- containRecruit 是否包含可招募英雄 -- 是否要排序 function HeroCtrl:GetAcquiredHero(containRecruit, sort)local heros = {}if containRecruit thenfor k,v in pairs(self._recruitData) dotable.insert(heros, v)endendfor k,v in pairs(self._heroData) dotable.insert(heros, v)endif sort thentable.sort(heros, HeroCtrl.SortHeroList)endreturn heros end
5-2.收到服务端数据后更新本地数据,分发相对应的事件通知业务更新界面(消息系统参考:https://www.cnblogs.com/wang-jin-fu/p/11255831.html)
5-3.请求服务端的接口,例如
--请求穿戴战利品 function HeroCtrl:ReqDressBootyo(sort, pos)local data = {sort = sort, slotid = pos}NetMsg.SendMsg("reqherodressbooty", data) end
5-4.尽量将相同类型数据单独分装数据类,由该模块的ctrl维护。例如每个英雄生成一个HeroData的数据类,该类对外提供所有业务需要的接口,例如获取服务端数据和配置数据的接口。
5-5.逻辑计算尽量放在数据类里,例如是否显示小红点,计算都在HeroData,业务只要通过返回值设置小红点的显示、隐藏就好了。
--计算小红点 function HeroData:ComputeHint()if self.own == HeroOwnState.RECRUIT thenreturn trueendlocal heroCtrl = PlayerTop:GetModule("HeroCtrl")if self:CanUpRank() and not heroCtrl:IsUpRank(self:GetHeroSort()) thenreturn trueendif self:CanUpQuality() and not heroCtrl:IsUpQuality(self:GetHeroSort()) thenreturn trueendfor i=1,#self.equip dolocal state = self.equip[i].stateif state == EquipState.CAN_DRESS or state == EquipState.COMPOSE thenreturn trueendendreturn false end
6.实现界面逻辑
这步就只是单纯的填界面了,需要的数据,数据类的获取接口都写好了。只要调用数据类获取数据(文本内容、图片名字、显示和隐藏),再把获取的数据设置给对象就好了。
最后,审案子、ui示意图一定要仔细再仔细,以为这个涉及到你后面的定服务端协议、界面拼接。逻辑理清楚了,拆分够小块了(也不能太小块了,方法调用也是要消耗性能的,大概一块的逻辑在10-30行左右),你的程序就不容易出逻辑bug,很更好维护、修改。
转载于:https://www.cnblogs.com/wang-jin-fu/p/11305417.html
高效、稳定开发功能的一些心得相关推荐
- 在闲鱼,我们如何用Dart做高效后端开发?
背景 像阿里其他技术团队以及业界的做法一样,闲鱼的大多数后端应用都是全部使用java来实现的.java易用.丰富的库.结构容易设计的特性决定了它是进行业务开发的最好语言之一.后端应用中数据的存储.访问 ...
- 高效团队建设与管理 学习心得
高效团队建设与管理----培训心得 企业文化: 高效团队首要特质就是具有灵魂,灵魂在企业内部可以被定义为企业文化:一群人如果具有共同的理想,共同的未来,共同的思考问题的途径和共同解决问题的原则.指导思 ...
- OneApiConnect(二)三菱MC通讯协议源代码,高效稳定
每家PLC厂商都有自己的通讯协议,三菱有MC.倍福有ADS.modbus tcp/rtu,然而没有统一性的接口协议. 为适应每一家通讯,每一家设备商.MES和工厂等都需要针对每款产品开发相应的通讯接口 ...
- 智慧农业系统开发功能有哪些?
农业从古至今都是备受关注的话题,新时代背景下农业发展已经融合了互联网,数字化技术等新型发展方式,形成了农业物联网管控系统,让农业生产更加科技化.智能化.高效化,对农业可持续发展有巨大的推动作用.所以, ...
- 微信小程序原生开发功能合集一:微信小程序开发介绍
一.专栏介绍 本专栏主要内容为微信小程序常用功能开发过程的介绍说明,包括开发微信小程序常用组件的封装.常用功能的开发等,提供源代码.开发过程讲解视频.完整的课程等. 组件封装: 下拉选择组件. ...
- 如何写出简洁明了的开发功能说明书
当企业上了ERP 或其他信息系统后,随着业务的发展,总会需要新的功能来助力业务发展,这时就会涉及新功能的开发.不论是标准功能的增强定制,还是自开发新功能,都需要编写开发功能说明书. 身为一枚业务顾问, ...
- [指北针分类信息软件 v1.5.2.1] 全自动分类信息软件+高效稳定建立SEO外部链接
介绍: 源码简介: 指北针分类信息软件是一款全自动分类信息软件,高效稳定建立SEO外部链接.,可以对众多大型中型分类站做推广.客户只要录入好帐号,密码,以及内容,就可以快速实现信息的覆盖. " ...
- 瑜伽健身app开发功能详细说明
瑜伽健身app开发,瑜伽健身app开发功能.很多人会挑选在家锻炼,具备社交媒体特性的运作平台遭受年青男孩和女孩钟爱,每日瑜伽app主打大量等级分类视觉塑型课堂教学作用,瑜伽健身app可以线上开展预订瑜 ...
- 商超O2O小程序开发功能模块
传统式商超百货商店从试着结合线上与线下销售方式,迈向新零售的融合与变革:从纯百货商店的运营模式,迈向稳定实干的转型发展,并进到转型发展深水区.在"新零售"的社会下扩展领域变革的新视 ...
最新文章
- iOS 自定义返回按钮,保留系统滑动返回
- android PendingIntent参数详细解析
- 【Paper】2013_An efficient model predictive control scheme for an unmanned quadrotor helicopter
- 计算机英语发展历史,英语翻译计算机发展史,领域与未来发展 一、计算机发展史简介 人类所使用的计算工具是随着生产的发展和社会的进步,从简单到复...
- 快速撑握C#知识点之变量,类型及类型转换
- Silverlight 解谜游戏 之十三 游戏暗示(2)
- WebService应用一例,带有安全验证
- 揭秘ASP.NET 2.0的Eval方法
- PCL之点云可视化--CloudViewer
- 摩托android one手机图片,Motorola One都说外观像iPhone,但实际却不一样!
- 百度地图,你必须知道的自定义Marker图标方法
- 百度墨卡托经纬度互转工具类
- matlab 语音识别为文字,语音识别(Speech Recognition)是让机器通过识别和理解过程把语音信号转变为相应的文本...
- 上海市居住证积分提交材料
- 【mcuclub】模数转换ADC0832
- mysql的全文搜索功能
- HTTP 2.0 中文版
- 概率校准calibration_curve,用Isotonic regression,得出calibration_curve的好坏,用交叉熵检验,和方差,及使用朴素贝叶斯方法
- pytorch repeat 使用详解
- 普及下病毒性感冒和细菌性感冒的区别(如何看血常规)
热门文章
- 电脑表格日期怎么修改原有日期_为何电脑系统时间常出错或无法修改?怎么解决?...
- Linux命令 - watch
- 计算机一级115,计算机一级BASIC模拟115.doc
- android imageview 图片切换动画,在Android中以动画方式将ImageView移动到不同的位置...
- echarts轨迹图,各个城市线路图轨迹如何取值
- MPP install
- SharePoint Framework 构建你的第一个web部件(三)
- 双频无线网安装设置(5g ) for linux
- iOS设计模式 - 迭代器
- RatingBar的自定义