1. 程式人生 > >lua程式碼規範

lua程式碼規範

Lua程式碼風格

目錄

一、程式的版式

Code is read much more often than it is written.

Programming style is an art.

1.1 空行

  • 需加空行:
    • 函式之間都要加空行;
    • 函式內部程式碼概念與邏輯之間,邏輯段落小節之間,都應該加空行;
    • 註釋行之前。
  • 不加空行:
    • 在一個函式體內,邏揖上密切相關的語句之間不加空行;
    • 多行註釋解釋引數的時候,註釋之間不加空行。

1.2 空格

  • 需加空格:

    • and“,”or“等關鍵字前後留一個空格,便於辨析;
    • 逗號”,“後面要留一個
      空格;
    • 賦值操作符、比較操作符、算術操作符如”=“、 “==“、”~=“、”>=“、”<=“、”>“、”<“、”+“、”-“、”*“、”/“、”%“、”^“,等二元操作符的前後應當加空格;
    • ifforwhile等關鍵字之後如果要加左括號”(“,關鍵字與左括號之間應留一個空格,以突出關鍵字;
  • 不加空格:

    • 函式名之後不要留空格,緊跟左括號”(“;
    • 左括號”(” 向緊跟,緊跟處不留空格;
    • 右括號”)“、逗號”,“、分號”;“,向緊跟,緊跟處不留空格;
    • 字串連線符”..“前後不加空格;
    • :“,”.“,”[“,”]“這類操作符前後不加空格;

      a > b and a or b           -- 良好的風格
      a > b  and a or  b         -- 不良的風格
      
      local a, b, c, max         -- 良好的風格
      local a,b,c,max            -- 不良的風格
      
      if a > b then              -- 良好的風格
          max = a 
      end 
      if a>b then max=a end      -- 不良的風格
      
      data = dataTable[index]    -- 良好的風格
      data = dataTable [ index ] -- 不良的風格
      
      function(posX, posY)       -- 良好的風格
      function (posX,posY)       -- 不良的風格
      

1.3 長行拆分

  • 程式碼行最大長度宜控制在70至80個字元以內。程式碼行不要過長,否則眼睛看不過來,也不便於列印;
  • 長表示式要在低優先順序操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。

     -- 良好的風格
     local newBuindingBtn = UI.newButton({             
         text = btnName,
         x = self.x,
         y = self.y,
         parent = self, 
         style = {
             normal = ResConfig.png.commonBtnBlue
         }
     })
    
     -- 不良的風格
     local newBuindingBtn = UI.newButton({text = btnName,x = self.x,y = self.y,parent = self, style = {normal = ResConfig.png.commonBtnBlue}})
    
    
     -- 良好的風格
     if veryLongerVariable1 >= veryLongerVariable2
         and veryLongerVariable3 <= veryLongerVariable5
         and veryLongerVariable4 <= veryLongerVariable6 then
         doo()
     end
    
     -- 不良的風格
     if veryLongerVariable1 >= veryLongerVariable2 and veryLongerVariable3 <= veryLongerVariable5 and veryLongerVariable4 <= veryLongerVariable6 then
         doo()
     end
    

1.4 使用縮排

  • 類中的成分
  • 方法體或語句塊中的成分
  • 換行時的非起始行

二、命名規則

三思而命名。

2.1 共性規則

  • 命名應當直觀且可拼讀,可望文知意;
  • 識別符號的長度應當符合“min-length && max-information”原則;
  • 採用英文單詞或單詞組合,英文單詞不要複雜,但用詞需準確,切忌使用漢語拼音命名
  • 切勿為了避免命名過長而隨意擷取單詞,以丟失可讀性;
  • 所有命名都不要與-x已有的命名風格衝突,例如不要以CC,UI開頭;

2.2 檔案命名

  • 所有Lua檔案的命名時使用大駝峰法;
  • 根據檔案的特性,一般以檔案裡的模組名或者類名作為同名檔名;
  • 確定命名前,請檢查下,不要跟其他檔案同名;

    CCArmature.lua    -- 不良的風格
    UILayout.lua      -- 不良的風格
    

2.3 類的命名

  • 所有類命名時使用大駝峰法;
  • 類名一般由”名詞”或”多名詞”組成,不要簡寫;
  • 根據類的特性,加上相關的字尾或者字首;

    字尾:  
    管理類  Manager
    快取類  Cache
    控制類  Controller
    模組    Module
    網路類  Proxy
    

2.4 變數命名

  • 通用規則

    • 使用 “名詞” 或是 “形容詞+名詞” 命名;
    • 使用小駝峰法命名;
    • 為了可讀性,儘量避免變數名中出現標號,如value1, value2;
    • 不要出現僅靠部分字母大小寫區分的相似的變數;
    • 除非是區域性變數功能等價全域性變數,不然區域性變數不要與已有的全域性變數同名;
    • 儘量不要使用已有的類名作為變數名;

      local data          -- 良好的風格  
      local oldData       -- 良好的風格 
      local newData       -- 良好的風格     
      local pairs = pairs -- 良好的風格
      
      local posx,posX     -- 不良的風格 
      local btn1,btn2     -- 不良的風格
      local TABLE = {}    -- 不良的風格
      local uILabel       -- 不良的風格
      
  • 類的成員變數

    • 類的成員變數以”self.”開頭,以區分於區域性變數;

      例如:
          function init()
      
              self.mainPanel = false -- 常用格式
      
              topPanel = false       -- 這樣是全域性變數,佔用全域性資源,而且難以區分於區域性變數 
              ...
          end
      
  • 全域性變數

    • 全域性變數使用雙下劃線(“__“)開頭以及結尾,中間的命名以名詞拼接,或”形容詞+名詞”拼接,不同單詞之間用(”_“)隔開;

      例如:
          __VERSION_CODE__ = "1.0.0.0"            
      
  • 區域性變數

    • M常用做模組裡面表示模組本身

      module("MainGame.Module.IntegrationTest.MapModule",package.seeall)
      
      local M = class(SceneView,"MapScene")
      
      --資料的初始化
      function M:init()
          ...
      end
      
      ...
      return M
      
      • 引用進來的類或模組,用大駝峰法命名,引用路徑統一帶括號;

        module(“MainGame.Module.IntegrationTest.MapModule”,package.seeall)

        local M = class(SceneView,”MapScene”)
        local Surface = require(“xx.xx”)
        local TestButtonPanel = require(“xx”)

  • 臨時變數

    • 常用下劃線”_”作為可以忽略的變數

      for _,v in ipairs(t) do print(v) end
      
    • i,k,v,t常做臨時變數

      for k,v in pairs(t) ... end
      for i,v in ipairs(t) ... end
      mt.__newindex = function(t, k, v) ... end
      

2.5 常量,事件名的命名

  • 常量,事件名所用單詞均大寫,單詞用下劃線(‘_‘)分割;

    例如:
        -- 常量 預設寬度
        LIST_DEFAULT_WIDTH = 100
    
        -- 事件 新增到場景
        ADDED_TO_STAGE = getId() 
    

2.6 列舉的命名

  • 列舉名命名,與類名命名一致;
  • 列舉值命名,與常量,事件名的命名一致;

    例如:
        ControllerViewType = {
            SCENE = "SCENE",
            PANEL = "PANEL",
            POP =   "POP",
        }
    

三、檔案組織

3.1 檔案描述

  • 檔案開頭加上此檔案的簡要功能作用描述;

    -- MapModule.lua
    --Author:xx
    --Email:[email protected]
    --20xx年x月x日 xx:xx
    --Using:建立地圖       
    module("MainGame.Module.IntegrationTest.MapModule",package.seeall)
    ...
    

3.2 檔案中變數的定義

  • 如果在檔案中需要多次使用的某些匯入檔案,可以在檔案開頭用區域性變數儲存匯入資訊,而不是在每次使用的時候都重新匯入一次;

    例如:
        ...
        local Surface = require("xx.xx")
        local TestButtonPanel = require("xx")
    
        function M:xx()
            local testBtn = TestButtonPanel.newCC()
            ...
        end
    
        function M:yy()
            local panel = TestButtonPanel.newCC()
            local surface = Surface.newCC()
            ...
        end
    
        ...
    

3.3 類變數的定義

  • 類中的成員變數需要在init中先宣告,並賦予初始值,不允許不宣告直接使用

3.4 函式引數的定義

  • 所有函式的引數都用統一的params做引數,並加入如下格式的註釋:

    --[[
        普通按鈕 可縮放 scale9
        @param #string text 按鈕名稱
        @param #table style 按鈕樣式
    ]]
    function UI.newButtonScale9(params)
       ...
    end
    

3.5 函式的定義規則

  • 函式的行數過長(大於 100 行)時,儘量拆分為多個子函式;
  • 函式中一些晦澀的部分,一定要加上註釋;

3.6 註釋的使用

  • 短小的註釋用–;
  • 長註釋用–[[]];

四、編碼技巧

4.1 應該儘量使用local變數而非global變數

  • 全域性變數實際是放入全域性表中,每次呼叫是用傳入變數名作為key去獲取,而local變數是直接通過lua的堆疊訪問的;
  • 推薦寫法

    • 在能用區域性變數解決的地方,不要使用全域性變數,這點很容易被忽略;
    • 多次重複使用的全域性介面,可以用區域性變數儲存下再使用;

      * 比如需要多重遍歷操作一個大表:
      寫法1:
      for k1,v1 in pairs(tbl) do
          for k2,v2 in pairs(v1) do
              ... 
          end
      end
      
      寫法2:
      do
          local pairs = pairs
          for k1,v1 in pairs(tbl) do
              for k2,v2 in pairs(v1) do
                  ... 
              end
          end
      end
      
      -- 由於pairs是一個全域性變數應用的函式,所以寫法2在這裡有稍微效率上的提升,但要是單層遍歷的沒有這個效果了。
      
      * 當作常量來多次使用的全域性變數可以存為區域性變數使用
      local playerName = Cache.playerCache.username 
      ...
      local function = itemTemplate(data)            
          nameLabel:setText(playerName)
      
      local list = NewList.newCC(,{
          itemTemplate = itemTemplate,
          ... 
      })
      

4.2 臨時變數的處理

  • 字串的連線 ..
    由於字串的管理機制,字串在使用..連線時,會產生新的物件。由於lua在VM內對相同的string永遠只保留一份唯一copy。

    例如:
    local description = ""
    for i = 1,20 do
        description = description.."xxx"
    end
    -- 這樣會生成21份string的copy,但實際上我們只需要最後那一份 
    

    如果是輕量級的簡單連線還是可以使用的,因為影響不大,但要是大量的類似拼接,推薦使用string.format

  • 類似於字串的管理機制,表也存在類似的臨時變數copy:

    函式傳引數
    function func({x,y})
        ...
    end
    

    這種傳參方式,每次都會生成一份copy,所以推薦以下的用法:

    function func(x,y)
        ...
    end
    
    function func({posX = x, posY = y})
        ...
    end
    

4.3 利用邏輯運算的短路效應

  • and or 的返回值是表示式中的左值或者右值,可用來簡化程式碼

    function foo(arg)
        arg = arg or "default"
        ...
    end
    
    -- 但要注意當賦值為bool值時候,容易出bug
    a = a or true  -- 錯誤的寫法,當 a 明確寫為 false 的時候,也會被改變成 true 。
    a = a ~= false -- 正確的寫法,當 a 為 nil 的時候,被賦值為 true ;而 false 則不變。
    
  • 另外,巧妙使用 and or 還可以實現類似 C 語言中的 ?: 三元操作:

    function max(a,b)
        return a > b and a or b
    end
    
    -- 這裡相當於 return (a > b) ? a : b;      
    

五、程式碼建議

5.1 程式碼的除錯

  • 用Luastudio工具除錯,代替Sublime除錯Lua程式碼;

5.2 複雜度和效能問題

  • 寫程式碼時儘可能寫的簡單,考慮效能時先做好推斷,看看能提升多少,增加的複雜度以及造成的程式碼晦澀有多嚴重,然後再決定如何做;

5.3 函式的優化思考

  • 開銷大的函式,呼叫次數低的話,可以不做優化;
  • 開銷較小的函式,但呼叫頻率很高,則從如何降低呼叫頻率以及減少函式的開銷兩個角度去思考優化;

5.4 提交程式碼的檢查

  • 提交程式碼前,在svn commit中驗證提交的程式碼,去掉或註釋掉無關的程式碼,保證提交的程式碼無誤;

5.5 表結構的引用

  • 儘量減少表中的成員是另個表的引用;

參考資料:

相關推薦

lua程式碼規範

Lua程式碼風格 目錄 一、程式的版式 Code is read much more often than it is written. Programming style is an art. 1.1 空行

C++程式碼規範和CodeReview

C++程式碼規範和CodeReview 背景 最近手頭上的開發工作基本已經完成主要功能,其後續進行的工作主要在細小功能的調整和完善上,週末在家看書,想到了CodeReview,想把這件事在組內推廣下(其實CodeReview應該是在開發過程中進行的,現在提出,也是希望以後不要步此後

[轉載] Python程式碼規範和命名規範

http://www.imooc.com/article/19184?block_id=tuijian_wz#child_5_1 Python程式碼規範和命名規範 前言 Python 學習之旅,先來看看 Python 的程式碼規範,讓自己先有個意識,而且在往後的學習中慢慢養成習慣

程式碼規範工具大比拼---Alibaba Java Coding Guidelines

                  程式碼規範工具大比拼---Alibaba Java Coding Guidelines &n

lua程式碼加密策略

1、使用類似cocos的加密方式,對檔案打上加密標記頭,然後檔案內容呢,加密後存放。需要修改lua載入檔案的部分程式碼。 安全性:基於演算法保密+金鑰保密,對於很多cocos程式來說,金鑰是寫死在程式碼裡,所以通過反編譯程式碼很容易獲取到 2、luac編譯後使用,luac編譯後的程式碼,採用工具

程式碼規範樣例討論-註釋1

“其實沒啥需要多說的,大家參照阿里 java 開發規範就好了。僅僅記錄工作中遇到的討論” 1 簡單的邏輯註釋是否真的需要?參照 王垠推薦的方法行數保持在40行,大約是電腦螢幕的高度。減少上下滑動的操作,可以更加專注。所以減少無用的註釋。 2 由上面程式碼行數引出的一個問題,方

php開發程式碼規範

1,if不能巢狀超過三層,儘量取反return掉 2,迴圈不要巢狀超過三層,不要申明變數,查庫等,除非必要的邏輯處理不要在迴圈中做 3,儘量減少重複程式碼,減少程式碼邏輯,如果邏輯過多,進行邏輯抽離,私有方法,靜態方法等 4,命名必須遵從駝峰形式 5,一個函式的引數最多不要超過八個

javascript基礎 之 程式碼規範

1,變數名   1,變數名推薦使用小駝峰寫法:類似於:firstName   2,全域性變數和常量建議用大寫:PI   3,支援下劃線 2,縮排   1,一般使用4個空格當作縮排,tab建議少用   2,運算子左右和左花括號前建議使用空格:var x = a + b ;   3,以分號作為結束符

前端程式碼規範大全

初衷 不管參與專案的人數有多少,確保每一行程式碼都像是同一個人編寫的; 根據實際情況制定良好的程式碼規範; 遵守編碼風格使程式碼更容易維護,對長期專案大有裨益; 實施程式碼規範增加程式碼可讀性,提高協作開發效率; 實施程式碼規範減少低

StyleCop C#程式碼規範外掛============>VS2017外掛

外掛中有許多預設的規則,其中部分預設規則比較炒蛋     比如 :  引用必須寫在名稱空間內  在網上查詢發現 : SA1200 就是這個規則 右鍵 分析器 ==>點選 ===>  開啟活動規約集 現在去

華為標準註釋與文件,以及程式碼規範

註釋 為什麼要寫註釋呢?為什麼要寫文件呢? 也許有人會這樣問。但是我只想說如果你還在這樣問,那麼你不僅不是一個優秀的程式設計師,應該說你是不是程式設計師都應該受到質疑。 先說一下注釋的重要性: 在公司的開發中,我們要明白程式不是寫給自己看的,也不是所有的程式碼都是自己寫的,我們不僅需要看

sublime3 除錯榮耀lua程式碼

經常需要sublime3除錯的朋友,可以引數如下 新建一個編譯環境,引數設定如下 {     "shell_cmd": "E:/code/shaoyang/jinhuaban/ryclient/run/debug/win32/GloryProject.exe -

flutter/dart 程式碼 規範 翻譯 加自我理解

前言 最近看qq群裡發的很多程式碼截圖,感覺命名規則/檔案命名都不符合規範 很多朋友都是從其他語言轉向dart/flutter的,深感語言環境還需要大家共同去維護,建議還是規範化程式碼,這樣所有人看著都會舒服 恰好dart語言官方有自己的程式碼規範和相關的說明,在dartlang官網

Scrum立會報告+燃盡圖(十一月十五日總第二十三次):程式碼規範與技術交流

此作業要求參見:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2384 專案地址:https://git.coding.net/zhangjy982/QuJianBang.git Scrum立會master:張俊餘   一、小組介

程式碼規範問題之post請求

由於粗心大意,導致的問題: 在PHP程式設計中,使用資料庫查詢,規範的格式如下 <? echo "<form action='' method='post'>"; echo "請輸入要查詢的學號:"."<input type='text' name='sear

程式設計師必知--程式碼規範

首先用我之前的部落格中的程式碼舉例子 (C語言程式設計100例): 第一段程式碼: #include <stdio.h> int main(){ int i, j, n = 0, a[17] = { 0,1 }, l, r; while (n<1 || n>1

Python基礎(一)--- Python簡介,特點,程式碼規範,變數,運算子,條件迴圈語句,元組,字串,列表,字典,檔案操作

一、Python簡介 ----------------------------------------------------------- 1.Python是一種解釋型,面向物件,動態資料型別的高階程式語言 2.像Perl語言一樣, Python 原始碼同樣遵循 GPL(GNU

python程式碼規範 以及如何處理Pycharm的波浪號警告

一.命名規範 1.模組名和包名採用小寫字母並且以下劃線分隔單詞的形式; 如:regex_syntax,py_compile,_winreg 2.類名或異常名採用每個單詞首字母大寫的方式; 如:BaseServer,ForkingMixIn,KeyboardInterrupt 3.全域性或者類

小程式自動修復程式碼規範

1。package.json:修改下面一行程式碼: { "name": "mpvue-demo", "version": "1.0.0", "description": "A Mpvue project", "author": "", "private": true,

程式碼規範:idea上新增阿里巴巴Java開發外掛

    在一個專案中,不可缺少的是書寫程式碼的規範,沒有好的程式碼規範約束,大家各寫各的,十分不利於程式碼的維護與修改。     首先來看看如何在idea上新增這個外掛:     直接上圖