欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

OpenResty編碼有哪些規(guī)范

這篇文章給大家介紹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)格是一致的。

縮進(jìn)

在 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ù)制代碼

數(shù)組

使用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ù)

函數(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ò)誤處理

對于有錯(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)

手機(jī)網(wǎng)站建設(shè)