1. 程式人生 > >寫程式碼必看!!!!

寫程式碼必看!!!!

專業程式設計師的7個素質: 承擔責任,高質量程式碼,程式碼上的時間,對自己領域的精通,思維模式,溝通,合作。

1 . 寫邏輯程式碼寫完後一定要對著自己的邏輯全部走通一遍。不要寫完立即開始執行除錯。這樣的除錯會浪費大量的時間。因為有些錯誤僅僅是因為你程式碼寫錯,筆誤,或者邏輯的一個漏洞而導致。而這些問題都是非常簡單的。所以我們在寫完邏輯的時候一定要對著程式碼理一遍思路,看看有沒有一些弱智錯誤,再三確認無誤再去執行除錯,除錯成功之後看現象是否正確,如果現象已經正確,那麼你要根據你的流程看輸出日誌是否完全符合你的邏輯!

2 更改程式碼邏輯的時候,記住一定要去增加程式碼,而不要去刪除或者更改程式碼。增加程式碼是最好的方式。
3 在更改一些程式碼的情況,比如修改了一個變數的名字或者邏輯。一定要多思考這個地方更改的這個變數有沒有在其他的地方使用到過。邏輯的修改會不會影響其他程式碼的呼叫!!! 有的時候不小心改了一個地方,但是沒有去思考,其他原本正確的邏輯也錯了,會給自己帶來相當大的困擾!! 也需要不斷的列印日誌去查詢。 其實就是一個非常弱智的錯誤!!!

4.在呼叫別人的介面獲取資料的時候一定要給自己留一手!特別是在自己寫一個獨立的功能需要用到一些其他模組的資料! 取到資料一定要判斷一下有沒有! 最好直接斷言。 防止你自己模組出問題其實是別人那的資料問題!!

5 自己的介面函式儘量要想辦法不去依賴全域性變數或者其他獲取資料的介面! 要什麼資料全部以引數的方式傳進來!! 引數的方式傳進來。 自己傳引數可以保證資料是正確的。另一種情況,這個介面要移植就會非常的方便,只需要自己用不同的方式建立引數資料。

6 在一些問題使用當前的方法無法解決的時候,一定有新的方法可以驗證你的錯與對。你可以輸出幾種情況進行比較。

  1. 做專案一定要抽時間看看別人的程式碼,先從跟你有關聯的地方開始看,再看跟你沒有關聯的地方。第一可以學習別人設計好的地方和良好的程式碼。第二在新增功能和修改bug的時候可能需要跟他們的程式碼進行聯絡,之前讀過他們的邏輯這樣就很方便。

8 再新增一個遊戲功能的時候一定要多考慮一些東西,在一些特殊的情況一定要多考慮,比如遊戲的斷線重連,考察需要還原的資料是否有你需要的。比如新增一個if條件, if myserver == 3. 你一定要去假象有沒有myserver不定於3卻又滿足你邏輯的情況! 一定要多思考,不然會給別人帶來很多的麻煩。

9.全域性變數或者單利類 真的是有利有弊,今天算是體會到了。 exp.一個全域性分配事件管理器g_eventManager,自己在一個類裡面註冊了事件A,但是在釋放類的時候忘記刪除了事件A,在下一個環境建立這個類的時候有一次註冊了事件A! 所有在分配事件的時候你會發現A事件執行了兩次!! 如此迴圈,程式直接卡死。

10 儘量不要出現這樣的程式碼:
for (i = 0 ;i<20;i++)
{
if (a == getSelfData ())
}
關注這個getSelfData()函式,被呼叫了20次,其實這個值是固定的,其實你直接可以在外層寫一個臨時變數來儲存這個資料,這樣getSelfData 只會被呼叫一次!

11.在修改程式碼邏輯的時候需要加入新的邏輯變數,一定要注意在這個函式當中是否已經有了這個變數名稱,否則會帶來不可預料的後果。

12.寫邏輯之前一定要先理清楚,在開始寫程式碼,最好先畫一個流程圖來整理自己的思路!新增新的邏輯一定不要動原來的程式碼,如果你動了一個函式,那麼已經定要檢查是否多個邏輯都在呼叫這個函式,所謂介面的複用性還是有一定的弊端的,改了這個函式的邏輯,那麼所有呼叫函式的功能邏輯都會發生改變。

13.伺服器傳送過來的訊息邏輯一定要記錄下來,遊戲邏輯複雜必須要經過多次梳理!】

14 計算機執行的邏輯永遠是正確的(雖然也有意外,)調bug的時候一定要多懷疑,排查每個函式不要點到為止,偶現bug 沒有執行你預期的動作絕對就是有問題!鎖定一個區域一定要仔細往下查!!

15 經常偶現bug在第一次的時候無法查出其中的原因,而我們應該做的事情是在懷疑的地方加上日誌,這樣在下次出現的時候就可以方便解決,當然,最簡單的辦法就是寫程式碼的時候一定要考慮需要加入日誌的地方,這很重要!

16 希望自己看完這段程式碼能夠想起防禦性程式設計:

function LoadingPanel:ctor(msg, atonce)
    print("LoadingPanel1:new")
    self.mMsg = msg
    self.mCurDot = 0
    self:enableNodeEvents()
    self:initUI()
    --在下一幀新增到場景中
    print("LoadingPanel:ctor1,ref:"..tostring(self:getReferenceCount()))
    self:retain()
    print("LoadingPanel:ctor2,ref:"..tostring(self:getReferenceCount()))
    local winSize = cc.Director:getInstance():getWinSize()
    self.delayAddToSceneHandler = nil

    self:setPosition(cc.p(winSize.width/2, winSize.height/2))
    if atonce == true then 
        print("LoadingPanel1:addToScene")
        cc.Director:getInstance():getRunningScene():addChild(self) 
    else
        self:retain()
        self.delayAddToSceneHandler = Utils.delayExcute(0, function()
                                print("LoadingPanel1:addToScene")
                                cc.Director:getInstance():getRunningScene():addChild(self)
                                self.delayAddToSceneHandler = nil
                                self:release()
                                end)
    end
    print("LoadingPanel:ctor3,ref:"..tostring(self:getReferenceCount()))
end
function LoadingPanel:destroy()
    if self.delayAddToSceneHandler ~= nil then
        Utils.cancelDelayExcute(self.delayAddToSceneHandler)
        self.delayAddToSceneHandler = nil
        self:release()
    end
    print("LoadingPanel1:destroy")
    print("msgis"..self.mMsg)
--    print("LoadingPanel:destroy1,ref:"..tostring(self:getReferenceCount()))
    self:release()
--    print("LoadingPanel:destroy2,ref:"..tostring(self:getReferenceCount()))
    self:removeFromParent()
end