高效 穩定開發功能的一些心得

2022-07-26 21:18:10 字數 4385 閱讀 3777

在開始編碼前一定要足夠了解案子,了解各種特殊情況,和美術、策劃、伺服器溝通好,最後寫好偽**。

一些建議

1.盡量復用,例如重複的物件單獨抽出來做成item,別的模組也用到的做成通用item,不要寫重複**。

2.做功能前先考慮別人會不會用到,用到可能是什麼情況,也可以詢問策劃,例如下面這個介面有7個業務用到,每個業務的需求都不太一樣。做的時候可以先考慮進去。不然後面大概率還是在你的介面做修改,還得反工。

3.能配置的盡量走配置,特別是一些細微的差別,這個很重要。就比如上面的介面可以這麼配置

dungeonsdefine.battletype =enum

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_monster_detail] = ,

[battletype.slg] = ,

[battletype.formation] = ,

[battletype.guard_wall] = ,

[battletype.rpg_monster] = ,

[battletype.rpg_dungeons] = ,

[battletype.rpg_arena] = ,

}

4.每個功能盡量拆分成一小塊(每個小塊邏輯在30行以內),定位bug比較方便,策劃改案子也比較方便實現,只需要改對應的小塊就好了。

詳細步驟

1.需求案:盡量對比競品,詳細的看3-4遍。

1-1.需要知道這個功能包括哪些介面。

1-2.策劃案是否有遺漏(考慮多種情況,例如有道具怎麼展示,沒有道具怎麼展示)。

1-3.比對競品,詢問策劃和競品不一致的地方。

1-4.如果有多語言,提前配置,方便拼介面時直接使用。

2.美術示意圖:

2-1.關注多語言是否超框,一般英語比較長。

2-2.比對案子,是否和案子一致,不一致要及時跟策劃溝通。是否有一些情況遺漏了。例如鍛造時顯示進度條,不鍛造時顯示文字。

2-3.記錄需要用到的資料(服務端、配置讀取)

3.比對服務端協議。例如

3-1.初始化需要資料,例如主介面的小紅點。

3-2.需要同步的資料,例如平叛會導致英雄狀態、經驗值、等級變化,那麼都需要同步給英雄模組。

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 then

for k,v in

pairs(self._recruitdata) do

table.insert

(heros, v)

endend

for k,v in

pairs(self._herodata) do

table.insert

(heros, v)

endif sort then

table.sort

(heros, heroctrl.sortherolist)

endreturn

heros

end

5-2.收到服務端資料後更新本地資料,分發相對應的事件通知業務更新介面(訊息系統參考:

5-3.請求服務端的介面,例如

--

請求穿戴戰利品

function

heroctrl:reqdressbootyo(sort, pos)

local data =

netmsg.sendmsg(

"reqherodressbooty

", data)

end

5-4.盡量將相同型別資料單獨分裝資料類,由該模組的ctrl維護。例如每個英雄生成乙個herodata的資料類,該類對外提供所有業務需要的介面,例如獲取服務端資料和配置資料的介面。

5-5.邏輯計算盡量放在資料類裡,例如是否顯示小紅點,計算都在herodata,業務只要通過返回值設定小紅點的顯示、隱藏就好了。

--

計算小紅點

function

herodata:computehint()

if self.own == heroownstate.recruit then

return

true

endlocal heroctrl = playertop:getmodule("

heroctrl")

if self:canuprank() and

not heroctrl:isuprank(self:getherosort()) then

return

true

endif self:canupquality() and

not heroctrl:isupquality(self:getherosort()) then

return

true

endfor i=1,#self.equip do

local state =self.equip[i].state

if state == equipstate.can_dress or state == equipstate.compose then

return

true

endend

return

false

end

6.實現介面邏輯這步就只是單純的填介面了,需要的資料,資料類的獲取介面都寫好了。只要呼叫資料類獲取資料(文字內容、名字、顯示和隱藏),再把獲取的資料設定給物件就好了。

最後,審案子、ui示意圖一定要仔細再仔細,以為這個涉及到你後面的定服務端協議、介面拼接。邏輯理清楚了,拆分夠小塊了(也不能太小塊了,方法呼叫也是要消耗效能的,大概一塊的邏輯在10-30行左右),你的程式就不容易出邏輯bug,很更好維護、修改。

對開發準則的一些心得

2018 7 4 10 08 24 星期三 有些感悟,一些東西如果設定一些準則,他可能規定了你至少要做哪些事情 你最好這樣去做 根據準則去執行,就會減少不必要的遺漏 對莫能兩可的事情快速做出決定,不再糾結 如果心裡沒有乙個標準,每次開發都會覺得這樣寫也可以那樣寫也可以,左右為難,最後感覺只要能實現當...

C 開發windows服務的一些心得

最近在做乙個windows服務的專案,發現並解決了一些問題,拿出來和大家分享一下,以下windows服務簡稱 服務 文章會在適合時間更新,因為朋友們在不斷提出新的意見或思路,感謝 1.服務如何在某種情況下彈出乙個窗體?第一種解決辦法,用安裝程式的 修改登錄檔來完成 1.右擊服務的檢視設計介面的空白處...

IOCP的一些心得

iocp的工作執行緒的個數一般設定為processors 2 2,這是綜合考慮了工作執行緒可能是等待 掛起 正在執行的狀態。如果你測試出更好的結果,以你的為標準。iocp的工作執行緒由系統排程和優化,不要去干預執行緒的排程,除非你自信能超越系統的排程。在遇到奇怪的問題時,可以嘗試減少iocp工作執行...