高效、稳定开发功能的一些心得

在开始编码前一定要足够了解案子,了解各种特殊情况,和美术、策划、服务器沟通好,最后写好伪代码。

一些建议

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flume与Kafka整合案例详解

环境配置 名称 版本 下载地址 Centos 7.0 64x 百度 Zookeeper 3.4.5 Flume 1.6.0 Kafka 2.1.0 flume笔记 直接贴配置文件 [rootzero239 kafka_2.10-0.10.1.1]# cat /opt/hadoop/apache-flume-1.6.0-bin/conf/kafka-conf.properties # The configuration file needs to …

mybatis学习(37):动态sql-trim

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

SQL-简单查询

/*人员:LDH功能:SQL-简单查询日期:2018-7-18*/USE TSQLFundamentals2008; GO-- Select some columns information. SELECT empid,lastname,firstname,address,city,country FROM HR.Employees;-- GROUP BY SELECT 国家 country,COUNT(1) AS …

mybatis学习(38):动态sql-foreach

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

mybatis学习(39):动态sql片段

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

中国古代十三美男

一、潘安    潘岳,就是人所周知的潘安,西晋时河南人氏,表字安仁,小字檀奴。其人“姿容既好,神情亦佳”。潘岳年轻时,坐车到洛阳城外游玩,当时不少妙龄姑娘见了他,都会怦然心动给他…

mybatis学习(40):逆向工程的创建

目录 首先导入我们的jar包 链接:https://pan.baidu.com/s/1Ent3kAwOagOZLT0XxDLEeA 提取码:zqpu 建立一个com.geyao.generator的包 generator的java类 package com.geyao.generator; import java.io.File; import java.util.*;import org.mybatis.ge…

SpringBoot中Tomcat配置(学习SpringBoot实战)

1、Tomcat配置 Spring Boot默认内嵌的Tomcat为Servlet容器,所以本节只讲对Tomcat配置,其实本节的配置对Tomcat、Jetty和Undertow都是通用的。 1.1 配置Tomcat 关于Tomcat的所有属性都在org.springframework.boot.autoconfigure.web.ServerProperties配…

axios的数据请求方式及跨域

express 的三大功能:静态资源、路由、模板引擎 app.use(express.static(www));  只要是创建这个静态的目录,这个 www 的静态目录里面的文件就可以被访问 数据的请求方式 axios get 的 请求方式    axios.get(url地址).then(function(success){  //…

mybatis学习(41):使用逆向工程

新建一个项目,将逆向工程的生成的拷贝进来 配置文件 log4j.properties ### \u914D\u7F6E\u6839 ### log4j.rootLogger debug,console ,fileAppender,dailyRollingFile,ROLLING_FILE,MAIL,DATABASE### \u8BBE\u7F6E\u8F93\u51FAsql\u7684\u7EA7\u522B\uFF0C\u5176…

[Alg] 二叉树的非递归遍历

1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点。 (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈,并判断节点V的左子节点L是否为空。若L不为空&#…

[c++]访MSN浮出窗口的示例

【声明】严格来讲,这篇文章不属于我的原创。我在这里参考了codeproject上的国外作者的模仿MSN浮出窗口的C#代码。换句话说,可以认为我把C#代码翻译成了C代码。另外,为了简化代码,CloseButton我没有采用自己绘制,而是用…

mybatis学习(42):mybatis的一级缓存

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

防止ASP.NET按钮多次提交的办法

方法一<asp:Button ID"btnSumbit" runat"server" UseSubmitBehavior"false" OnClientClick"this.valueSumbit;this.disabledtrue; " Text"Sumbit" OnClick"btnSumbit_Click" /> 方法二1<html xmlns"…

mybatis学习(43):一级缓存被刷新情况

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

python文件读写小结

读文件 打开一个文件用open()方法(open()返回一个文件对象&#xff0c;它是可迭代的)&#xff1a; >>> f open(test.txt, r) r表示是文本文件&#xff0c;rb是二进制文件。&#xff08;这个mode参数默认值就是r&#xff09; 如果文件不存在&#xff0c;open()函数就会…

mybatis学习(44):二级缓存1

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

HDU6089 恐怖分子(变形线段树)

题目描述 n*m的平面内有K个不安全点&#xff0c;Q个询问位置在(x,y)的人能走到多少个点&#xff1f;从(x,y)走到(x,y)是合法的&#xff0c;当且仅当(x,y)和(x,y)之间的矩形中不包含不安全点。 题解 问题相当于平面中有若干障碍点&#xff0c;询问以某一个点为四个角之一的不包含…

mybatis学习(45):开启二级缓存

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

【读书笔记】重要的东西

以上摘自一本叫做《大道至简》的小册子&#xff0c;有关介绍可以参考下面的链接 http://www.china-pub.com/34356转载于:https://www.cnblogs.com/chenxizhang/archive/2008/08/11/1264917.html