高效、稳定开发功能的一些心得
在開始編碼前一定要足夠了解案子,了解各種特殊情況,和美術(shù)、策劃、服務(wù)器溝通好,最后寫好偽代碼。
一些建議
1.盡量復(fù)用,例如重復(fù)的對象單獨(dú)抽出來做成item,別的模塊也用到的做成通用item,不要寫重復(fù)代碼。
2.做功能前先考慮別人會不會用到,用到可能是什么情況,也可以詢問策劃,例如下面這個界面有7個業(yè)務(wù)用到,每個業(yè)務(wù)的需求都不太一樣。做的時候可以先考慮進(jìn)去。不然后面大概率還是在你的界面做修改,還得反工。
3.能配置的盡量走配置,特別是一些細(xì)微的差別,這個很重要。就比如上面的界面可以這么配置
DungeonsDefine.BattleType = enum {ARMY_DETAIL = 1, -- 軍團(tuán)詳情SLG = 2, -- 出征軍團(tuán)FORMATION = 3, -- slg校場編隊 GUARD_WALL = 4, -- 守城RPG_MONSTER = 5, -- RPG戰(zhàn)斗魔物 RPG_DUNGEONS = 6, -- RPG戰(zhàn)斗,副本RPG_ARENA = 7, -- RPG戰(zhàn)斗競技場ARMY_MONSTER_DETAIL = 8, -- 獵魔軍團(tuán)詳情 }local BattleType = DungeonsDefine.BattleType --isRpg:是否是rpg類型, rpg:顯示英雄技能、英雄類型 slg:顯示英雄軍團(tuán)技能,帶兵量 --isShowAdd:格子為空時是否顯示加號, true:顯示 --isSizerState:是否篩選英雄狀態(tài), true:正常狀態(tài)排在前,出征英雄排在后 --canSelectOutManor:是否可以選擇不再城內(nèi)英雄 true:可以(isSizerState 為true時才有用到) --isShowState:HeroFormationItem是否顯示英雄狀態(tài)圖標(biāo) true:顯示 --isNotFullTips:自定義英雄結(jié)束時,出戰(zhàn)英雄未滿是否需要提示, true:提示 您還可以選擇更多英雄,確定要繼續(xù)嗎 --autoClose:點(diǎn)確定自動關(guān)閉界面,默認(rèn)關(guān)閉--title:界面標(biāo)題,默認(rèn) 自定義英雄 --btnTxt按鈕文本,默認(rèn) 確定 --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行以內(nèi)),定位bug比較方便,策劃改案子也比較方便實(shí)現(xiàn),只需要改對應(yīng)的小塊就好了。
?
詳細(xì)步驟
1.需求案:盡量對比競品,詳細(xì)的看3-4遍。
1-1.需要知道這個功能包括哪些界面。
1-2.策劃案是否有遺漏(考慮多種情況,例如有道具怎么展示,沒有道具怎么展示)。
1-3.比對競品,詢問策劃和競品不一致的地方。
1-4.如果有多語言,提前配置,方便拼界面時直接使用。
2.美術(shù)示意圖:
2-1.關(guān)注多語言是否超框,一般英語比較長。
2-2.比對案子,是否和案子一致,不一致要及時跟策劃溝通。是否有一些情況遺漏了。例如鍛造時顯示進(jìn)度條,不鍛造時顯示文本。
2-3.記錄需要用到的數(shù)據(jù)(服務(wù)端、配置讀取)
2-4.記錄所有的界面按鈕,知道按鈕的反應(yīng)事件(請求服務(wù)器、打開界面、修改界面邏輯如選中狀態(tài)、調(diào)用其他模塊如設(shè)置),額外關(guān)注需要請求服務(wù)端的按鈕,第四步定協(xié)議用得上。
3.比對服務(wù)端協(xié)議。例如
3-1.初始化需要數(shù)據(jù),例如主界面的小紅點(diǎn)。
3-2.需要同步的數(shù)據(jù),例如平叛會導(dǎo)致英雄狀態(tài)、經(jīng)驗(yàn)值、等級變化,那么都需要同步給英雄模塊。
3-3.請求類,基本都是按鈕觸發(fā),關(guān)注請求需要的數(shù)據(jù),服務(wù)端需要返回的數(shù)據(jù)。
4.拼界面,經(jīng)過上面三步,基本案子就很清楚了。
4-1.拆分界面,盡量拆分的細(xì)一點(diǎn),盡量把重復(fù)的對象拆分成一個item,例如AcquiredHeroItem。劃分后大概是下面這個樣子的。拆分規(guī)則為:子界面>子item>方法。
按方法劃分是指:每個方法負(fù)責(zé)一部分界面邏輯(例如替換該部分的圖片、文本,設(shè)置顯示隱藏等等)
4-2.界面適配,主要關(guān)注寬高比2:1的,4:3的,示意圖的比例三種。
4-2.關(guān)注多語言,盡量拉長、拉高文本框,因?yàn)橛⒄Z和阿語都比中文長很多。
導(dǎo)圖大概是這樣子的:
?5.寫數(shù)據(jù)類(邏輯類)
5-1.接受并保存服務(wù)端下發(fā)的數(shù)據(jù),對外提供獲取數(shù)據(jù)接口,例如
-- 獲取已獲得英雄 -- 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 end5-2.收到服務(wù)端數(shù)據(jù)后更新本地數(shù)據(jù),分發(fā)相對應(yīng)的事件通知業(yè)務(wù)更新界面(消息系統(tǒng)參考:https://www.cnblogs.com/wang-jin-fu/p/11255831.html)
5-3.請求服務(wù)端的接口,例如
--請求穿戴戰(zhàn)利品 function HeroCtrl:ReqDressBootyo(sort, pos)local data = {sort = sort, slotid = pos}NetMsg.SendMsg("reqherodressbooty", data) end5-4.盡量將相同類型數(shù)據(jù)單獨(dú)分裝數(shù)據(jù)類,由該模塊的ctrl維護(hù)。例如每個英雄生成一個HeroData的數(shù)據(jù)類,該類對外提供所有業(yè)務(wù)需要的接口,例如獲取服務(wù)端數(shù)據(jù)和配置數(shù)據(jù)的接口。
5-5.邏輯計算盡量放在數(shù)據(jù)類里,例如是否顯示小紅點(diǎn),計算都在HeroData,業(yè)務(wù)只要通過返回值設(shè)置小紅點(diǎn)的顯示、隱藏就好了。
--計算小紅點(diǎn) 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 end6.實(shí)現(xiàn)界面邏輯
這步就只是單純的填界面了,需要的數(shù)據(jù),數(shù)據(jù)類的獲取接口都寫好了。只要調(diào)用數(shù)據(jù)類獲取數(shù)據(jù)(文本內(nèi)容、圖片名字、顯示和隱藏),再把獲取的數(shù)據(jù)設(shè)置給對象就好了。
?
?最后,審案子、ui示意圖一定要仔細(xì)再仔細(xì),以為這個涉及到你后面的定服務(wù)端協(xié)議、界面拼接。邏輯理清楚了,拆分夠小塊了(也不能太小塊了,方法調(diào)用也是要消耗性能的,大概一塊的邏輯在10-30行左右),你的程序就不容易出邏輯bug,很更好維護(hù)、修改。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wang-jin-fu/p/11305417.html
總結(jié)
以上是生活随笔為你收集整理的高效、稳定开发功能的一些心得的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#测绘兰勃特墨卡托投影
- 下一篇: 敏感词过滤golang