這篇文章給大家介紹OpenResty編碼有哪些規(guī)范,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
陵川網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站自2013年起到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
本編碼規(guī)范由 APISIX 編寫和維護(hù)。
很多開發(fā)語言都有自己的編碼規(guī)范,來告訴開發(fā)者這個(gè)領(lǐng)域內(nèi)的約定俗成,讓大家寫的代碼看上去風(fēng)格保持一致,并且避免一些常見的陷阱,這些對于新手都是非常友好的,可以讓初學(xué)者快速的上手。比如 Python 的 PEP 80,就是其中的典范,幾乎所有的 Python 開發(fā)者都閱讀過這份 Python 作者執(zhí)筆的編碼規(guī)范。
讓開發(fā)者統(tǒng)一思想,按照規(guī)范來寫代碼,是一件非常重要的事情。OpenResty 還沒有自己的編碼規(guī)范,有些開發(fā)者在提交 PR 后,會(huì)在代碼風(fēng)格上被反復(fù) review 和要求修改,消耗了大量本可以避免的時(shí)間和精力。
其實(shí),在 OpenResty 中有兩個(gè)可以幫你自動(dòng)化檢測代碼風(fēng)格的工具:luacheck 和 lj-releng。前者是 Lua 和 OpenResty 世界通用的檢測工具,后者是 OpenResty 自己用 perl 寫的代碼檢測工具。對于我自己而言,我會(huì)在 vs code 編輯器中安裝 luacheck 的插件,這樣我寫代碼的時(shí)候就有工具來自動(dòng)提示;而在項(xiàng)目的 CI 中,則是會(huì)把這兩個(gè)工具都運(yùn)行一遍,比如:
luacheck -q lua ./utils/lj-releng lua/*.lua lua/apisix/*.lua 復(fù)制代碼
多一個(gè)工具的檢測總不是壞事。
但這兩個(gè)工具更多的是檢測全局變量、每行長度等這些最基礎(chǔ)的代碼風(fēng)格,離 Python pep80 的詳細(xì)程度還有遙遠(yuǎn)的距離,并且也沒有文檔給你做參考。
今天我就根據(jù)自己在 OpenResty 相關(guān)開源項(xiàng)目中的經(jīng)驗(yàn),總結(jié)下 OpenResty 的編碼風(fēng)格文檔,這個(gè)規(guī)范也和一些常見的 API 網(wǎng)關(guān):Kong、APISIX 的代碼風(fēng)格是一致的。
在 OpenResty 中使用 4 個(gè)空格作為縮進(jìn)的標(biāo)記,雖然 Lua 并沒有這樣的語法要求。
--No if a then ngx.say("hello") end 復(fù)制代碼
--yes if a then ngx.say("hello") end 復(fù)制代碼
你可以在使用的編輯器中,把 tab 改為 4 個(gè)空格,來簡化操作。
在操作符的兩邊,都需要用一個(gè)空格來做分隔:
--No local i=1 local s = "apisix" 復(fù)制代碼
--Yes local i = 1 local s = "apisix" 復(fù)制代碼
不少開發(fā)者會(huì)把其他語言的開發(fā)習(xí)慣帶到 OpenResty 中來,比如在行尾增加一個(gè)分號(hào)。
--No if a then ngx.say("hello"); end; 復(fù)制代碼
增加分號(hào)會(huì)讓 Lua 代碼顯得非常丑陋,也是沒有必要的。另外,不要為了節(jié)省代碼的行數(shù),后者為了顯得“簡潔”,而把多行代碼變?yōu)橐恍小_@樣會(huì)在定位錯(cuò)誤的時(shí)候不知道到底那一段代碼出了問題:
--No if a then ngx.say("hello") end 復(fù)制代碼
--yes if a then ngx.say("hello") end 復(fù)制代碼
函數(shù)之間需要用兩個(gè)空行來做分隔:
--No local function foo() end local function bar() end 復(fù)制代碼
--Yes local function foo() end local function bar() end 復(fù)制代碼
如果有多個(gè) if elseif 的分支,它們之間需要一個(gè)空行來做分隔:
--No if a == 1 then foo() elseif a== 2 then bar() elseif a == 3 then run() else error() end 復(fù)制代碼
--Yes if a == 1 then foo() elseif a== 2 then bar() elseif a == 3 then run() else error() end 復(fù)制代碼
每行不能超過 80 個(gè)字符,超過的話,需要換行并對齊:
--No return limit_conn_new("plugin-limit-conn", conf.conn, conf.burst, conf.default_conn_delay) 復(fù)制代碼
--Yes return limit_conn_new("plugin-limit-conn", conf.conn, conf.burst, conf.default_conn_delay) 復(fù)制代碼
在換行對齊的時(shí)候,要體現(xiàn)出上下兩行的對應(yīng)關(guān)系。就上面的示例而言,第二行函數(shù)的參數(shù),要在第一行左括號(hào)的右邊。
如果是字符串拼接的對齊,需要把 ..
放到下一行中:
--No return limit_conn_new("plugin-limit-conn" .. "plugin-limit-conn" .. "plugin-limit-conn") 復(fù)制代碼
--Yes return limit_conn_new("plugin-limit-conn" .. "plugin-limit-conn" .. "plugin-limit-conn") 復(fù)制代碼
應(yīng)該永遠(yuǎn)使用局部變量,不要使用全局變量:
--No i = 1 s = "apisix" 復(fù)制代碼
--Yes local i = 1 local s = "apisix" 復(fù)制代碼
變量命名使用 snake_case
風(fēng)格:
--No local IndexArr = 1 local str_Name = "apisix" 復(fù)制代碼
--Yes local index_arr = 1 local str_name = "apisix" 復(fù)制代碼
對于常量要使用全部大寫:
--No local max_int = 65535 local server_name = "apisix" 復(fù)制代碼
--Yes local MAX_INT = 65535 local SERVER_NAME = "apisix" 復(fù)制代碼
使用table.new
來預(yù)先分配數(shù)組:
--No local t = {} for i = 1, 100 do t[i] = i end 復(fù)制代碼
--Yes local new_tab = require "table.new" local t = new_tab(100, 0) for i = 1, 100 do t[i] = i end 復(fù)制代碼
不要在數(shù)組中使用 nil:
--No local t = {1, 2, nil, 3} 復(fù)制代碼
如果一定要使用空值,請用 ngx.null 來表示:
--No local t = {1, 2, ngx.null, 3} 復(fù)制代碼
不要在熱代碼路徑上拼接字符串:
--No local s = "" for i = 1, 100000 do s = s .. "a" end 復(fù)制代碼
--Yes local t = {} for i = 1, 100000 do t[i] = "a" end local s = table.concat(t, "") 復(fù)制代碼
函數(shù)的命名也同樣遵循 snake_case
:
--No local function testNginx() end 復(fù)制代碼
--Yes local function test_nginx() end 復(fù)制代碼
函數(shù)應(yīng)該盡可能早的返回:
--No local function check(age, name) local ret = true if age < 20 then ret = false end if name == "a" then ret = false end -- do something else return ret 復(fù)制代碼
--Yes local function check(age, name) if age < 20 then return false end if name == "a" then return false end -- do something else return true 復(fù)制代碼
所有 require 的庫都要 local 化:
--No local function foo() local ok, err = ngx.timer.at(delay, handler) end 復(fù)制代碼
--Yes local timer_at = ngx.timer.at local function foo() local ok, err = timer_at(delay, handler) end 復(fù)制代碼
為了風(fēng)格的統(tǒng)一,require 和 ngx 也需要 local 化:
--No local core = require("apisix.core") local timer_at = ngx.timer.at local function foo() local ok, err = timer_at(delay, handler) end 復(fù)制代碼
--Yes local ngx = ngx local require = require local core = require("apisix.core") local timer_at = ngx.timer.at local function foo() local ok, err = timer_at(delay, handler) end 復(fù)制代碼
對于有錯(cuò)誤信息返回的函數(shù),必須對錯(cuò)誤信息進(jìn)行判斷和處理:
--No local sock = ngx.socket.tcp() local ok = sock:connect("www.google.com", 80) ngx.say("successfully connected to google!") 復(fù)制代碼
--Yes local sock = ngx.socket.tcp() local ok, err = sock:connect("www.google.com", 80) if not ok then ngx.say("failed to connect to google: ", err) return end ngx.say("successfully connected to google!") 復(fù)制代碼
自己編寫的函數(shù),錯(cuò)誤信息要作為第二個(gè)參數(shù),用字符串的格式返回:
--No local function foo() local ok, err = func() if not ok then return false end return true end 復(fù)制代碼
--No local function foo() local ok, err = func() if not ok then return false, {msg = err} end return true end 復(fù)制代碼
--Yes local function foo() local ok, err = func() if not ok then return false, "failed to call func(): " .. err end return true end 復(fù)制代碼
關(guān)于OpenResty編碼有哪些規(guī)范就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章標(biāo)題:OpenResty編碼有哪些規(guī)范
轉(zhuǎn)載源于:http://www.chinadenli.net/article24/pigdce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、Google、云服務(wù)器、網(wǎng)站策劃、電子商務(wù)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)