图文店做网站有用处吗/今天北京发生大事了

图文店做网站有用处吗,今天北京发生大事了,抖音代运营合作策划书,免费网站认证很多开发语言都有自己的编码规范,来告诉开发者这个领域内一些约定俗成的东西,让大家写的代码风格保持一致,并且避免一些常见的陷阱。这对于新手来说是非常友好的,可以让初学者快速准确地上手。比如 Python 的 PEP 80,就…

很多开发语言都有自己的编码规范,来告诉开发者这个领域内一些约定俗成的东西,让大家写的代码风格保持一致,并且避免一些常见的陷阱。这对于新手来说是非常友好的,可以让初学者快速准确地上手。比如 Python 的 PEP 80,就是其中的典范,几乎所有的 Python 开发者都阅读过这份 Python 作者执笔的编码规范。

**让开发者统一思想,按照规范来写代码,是一件非常重要的事情。**OpenResty 还没有自己的编码规范,有些开发者在提交 PR 后,会在代码风格上被反复 review 和要求修改,消耗了大量本可避免的时间和精力。

其实,在 OpenResty 中,也有两个可以帮你自动化检测代码风格的工具:luacheck 和 lj-releng。前者是 Lua 和 OpenResty 世界通用的检测工具,后者则是 OpenResty 自己用 perl 写的代码检测工具。

对我自己来说,我会在 VS Code 编辑器中安装 luacheck 的插件,这样在我写代码的时候就有工具来自动提示;而在项目的 CI 中,则是会把这两个工具都运行一遍,比如:

luacheck -q lua./utils/lj-releng lua/*.lua lua/apisix/*.lua 

毕竟,多一个工具的检测总不是坏事。

但是,这两个工具更多的是检测全局变量、每行长度等这些最基础的代码风格,离 Python PEP 80 的详细程度还有遥远的距离,并且也没有文档给你参考。

所以今天,我就根据自己在OpenResty 相关开源项目中的经验,总结了一下 OpenResty 的编码风格文档,这个规范也和一些常见的 API 网关比如 Kong、APISIX 的代码风格是一致的。

缩进

在 OpenResty 中,我们使用 4 个空格作为缩进的标记,虽然 Lua 并没有这样的语法要求。下面是错误和正确的两段代码示例:

--No
if a then
ngx.say("hello")
end--yes
if a thenngx.say("hello")
end

为了方便,你可以在使用的编辑器中,把 tab 改为 4 个空格,来简化操作。

空格

在操作符的两边,都需要用一个空格来做分隔。下面是错误和正确的两段代码示例:

--No
local i=1
local s    =    "apisix"--Yes
local i = 1
local s = "apisix"

空行

不少开发者会把其他语言的开发习惯带到 OpenResty 中来,比如在行尾增加一个分号:

--No
if a thenngx.say("hello");
end;

但事实上,增加分号会让 Lua 代码显得非常丑陋,也是没有必要的。同时,你也不要为了节省代码的行数,追求所谓的“简洁”,而把多行代码变为一行。这样做会让你在定位错误的时候,不知道到底是哪一段代码出了问题:

--No
if a then ngx.say("hello") end--yes
if a thenngx.say("hello")
end

另外,函数之间需要用两个空行来做分隔:

--No
local function foo()
endlocal function bar()
end--Yes
local function foo()
endlocal function bar()
end

如果有多个 if elseif 的分支,它们之间也需要一个空行来做分隔:

--No
if a == 1 thenfoo()    
elseif a== 2 thenbar()    
elseif a == 3 thenrun()    
elseerror()
end--Yes
if a == 1 thenfoo()elseif a== 2 thenbar()elseif a == 3 thenrun()elseerror()
end

每行最大长度

每行不能超过 80 个字符,如果超过的话,需要你换行并对齐。并且,在换行对齐的时候,我们要体现出上下两行的对应关系。就下面的示例而言,第二行函数的参数,要在第一行左括号的右边。

--No 
return limit_conn_new("plugin-limit-conn", conf.conn, conf.burst, conf.default_conn_delay)--Yes
return limit_conn_new("plugin-limit-conn", conf.conn, conf.burst,conf.default_conn_delay)

如果是字符串拼接问题的对齐,则需要把 … 放到下一行中:

--No 
return limit_conn_new("plugin-limit-conn" ..  "plugin-limit-conn" .."plugin-limit-conn")--Yes
return limit_conn_new("plugin-limit-conn" .. "plugin-limit-conn".. "plugin-limit-conn")

变量

这一点我前面也多次强调过,我们应该永远使用局部变量,不要使用全局变量:

--No
i = 1
s = "apisix"--Yes
local i = 1
local s = "apisix"

至于变量的命名,应该使用 snake_case 风格:

--No
local IndexArr = 1
local str_Name = "apisix"--Yes
local index_arr = 1
local str_name = "apisix"

而对于常量,则是要使用全部大写的形式:

--No
local max_int = 65535
local server_name = "apisix"--Yes
local MAX_INT = 65535
local SERVER_NAME = "apisix"

数组

在OpenResty中,我们使用table.new 来预先分配数组:

--No
local t = {}
for i = 1, 100 dot[i] = iend--Yes 
local new_tab = require "table.new"local t = new_tab(100, 0)for i = 1, 100 dot[i] = iend

另外注意,一定不要在数组中使用 nil:

--No
local t = {1, 2, nil, 3}

如果一定要使用空值,请用 ngx.null 来表示:

--Yes
local t = {1, 2, ngx.null, 3}

字符串

千万不要在热代码路径上拼接字符串:

--No
local s = ""
for i = 1, 100000 dos = s .. "a"
end--Yes
local t = {}
for i = 1, 100000 dot[i] = "a"
end
local s =  table.concat(t, "")

函数

函数的命名也同样遵循 snake_case:

--No
local function testNginx()
end--Yes
local function test_nginx()
end

并且,函数应该尽可能早地返回:

--No
local function check(age, name)local ret = trueif age < 20 thenret = falseendif name == "a" thenret = falseend-- do something else return ret --Yes
local function check(age, name)if age < 20 thenreturn falseendif name == "a" thenreturn falseend-- do something else return true 

模块

所有 require 的库都要 local 化:

--No
local function foo()local ok, err = ngx.timer.at(delay, handler)
end--Yes
local timer_at = ngx.timer.atlocal function foo()local ok, err = timer_at(delay, handler)
end

为了风格的统一,require 和 ngx 也需要 local 化:

--No
local core = require("apisix.core")
local timer_at = ngx.timer.atlocal function foo()local ok, err = timer_at(delay, handler)
end--Yes
local ngx = ngx
local require = require
local core = require("apisix.core")
local timer_at = ngx.timer.atlocal function foo()local ok, err = timer_at(delay, handler)
end

错误处理

对于有错误信息返回的函数,我们必须对错误信息进行判断和处理:

--No
local sock = ngx.socket.tcp()local ok = sock:connect("www.google.com", 80)ngx.say("successfully connected to google!")--Yes
local sock = ngx.socket.tcp()local ok, err = sock:connect("www.google.com", 80)if not ok thenngx.say("failed to connect to google: ", err)returnendngx.say("successfully connected to google!")

而如果是自己编写的函数,错误信息要作为第二个参数,用字符串的格式返回:

--No
local function foo()local ok, err = func()if not ok thenreturn falseendreturn true
end--No
local function foo()local ok, err = func()if not ok thenreturn false, {msg = err}endreturn true
end--Yes
local function foo()local ok, err = func()if not ok thenreturn false, "failed to call func(): " .. errendreturn true
end

原文

https://github.com/apache/apisix/blob/v1.3/CODE_STYLE.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统移植篇(十一)Linux 内核启动流程

要分析 Linux 启动流程&#xff0c;同样需要先编译一下 Linux 源码&#xff0c;因为有很多文件是需要编译才 会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds&#xff0c;通过链接脚本可以 找到 Linux 内核的第一行程序是从哪里执行的。vmlinux.lds …

【Docker入门】构建推送第一个Docker映像

【Docker入门】构建推送第一个Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是轻量级的可执行独立包&#xff0c;包含代码、运行时、库、环境变量以及配置文件&#xff0c;它对于运行软件至关重要。注册表可在团队间分享映像。…

【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发

在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上&#xff0c;将隧道转发改成直接转发 一、改成直接转发需要改动的配置 &#xff08;一&#xff09;将连接AP的接口改成trunk口&#xff0c;并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …

SPI 总线协议

1、协议介绍 SPI&#xff0c;是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。主节点或子节点的数据在…

我爱学算法之——滑动窗口攻克子数组和子串难题(上)

现在来学习"滑动窗口"这一算法思想。 至于什么是"滑动窗口"呢&#xff1f;简单来说就是同向双指针&#xff1b;现在来通过题目来了解什么是"滑动窗口" 一、长度最小的子数组 题目链接&#xff1a;长度最小的子数组 题目解析 先来看题目&#…

ora-600 ktugct: corruption detected---惜分飞

接手一个oracle 21c的库恢复请求,通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测之后,发现undo文件offline之后,做了resetlogs操作,导致该文件目前处于WRONG RESETLOGS状态 尝试恢复数据库ORA-16433错误 SQL> recover datafile 1; ORA-00283:…

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…

IIS 服务器日志和性能监控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能强大、灵活且可扩展的 Web 服务器&#xff0c;用于托管网站、服务和应用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供网页的协议&#xff0c;因此广泛用于企业环境。 IIS 的…

12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)

文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1&#xff09;对文件对象的信息的操作2&#xff09;文件/文件夹的创建/删除3&#xff09;⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例&#xff1a;2…

oracle 基础知识之 多表查询

多表查询定义&#xff1a;当查询的数据并不是来源一个表时&#xff0c;需要使用多表连接操作完成查询。多表连接查询通过表之间的关联字段&#xff0c;一次查询出多个表的数据。多表查询包括了等值连接、左连接、右连接、完全连接。 1.等值连接 等值连接也称为简单连接&#xf…

Prims region.Views 为null

原因&#xff1a; 导航未完成或异步问题 解决方式&#xff1a;使用回调确认导航完成后再操作视图 _regionManager.RequestNavigate("MonitorRegion", "MonitorView", nps, navigationResult > {if (navigationResult.Result true){var region _regio…

reconstruct_3d_object_model_for_matching例子

文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…

软件安全性测试的重要性和常用工具介绍,软件测试服务公司推荐

在当今数字化快速发展的时代&#xff0c;软件已经成为各行各业不可或缺的一部分。然而&#xff0c;随着软件系统的复杂性增加&#xff0c;安全性问题也愈发突出&#xff0c;因此软件产品生产周期中安全测试必不可少。软件安全性测试是指对软件系统进行评估&#xff0c;以发现潜…

使用 ESP8266 和 Android 应用程序实现基于 IOT 的语音控制家庭自动化

使用 ESP8266 实现基于 IOT 的语音控制家庭自动化 欢迎来到另一个令人兴奋的项目,我们将使用 Wi-Fi 模块构建一个语音控制ESP8266家庭自动化系统,您可以在其中通过语音通过 Android 应用程序从世界任何地方控制您的家用电器。是的,您只需使用语音命令即可打开或关闭负载(L…

【HarmonyOS Next】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解

【HarmonyOS Next】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解 一、三者的区别与关系 1. 官方迭代过程为&#xff1a; CustomDialog 》 OpenCustomDialog 》 DialogHub 迭代过程表明&#xff0c;弹框的调用越来越便捷&#xff0c;与UI解耦&…

【C++】stack和queue的使用及模拟实现(含deque的简单介绍)

文章目录 前言一、deque的简单介绍1.引入deque的初衷2.deque的结构3.为什么选择deque作为stack和queue的底层默认容器 二、stack1.stack的介绍2.stack的使用3.stack的模拟实现 三、queue1.queue的介绍2.queue的使用3.queue的模拟实现 前言 一、deque的简单介绍&#xff08;引入…

开源PACS(dcm4che-arc-light)部署教程,源码方式

目录 文件清单下载地址安装概述OpenLDAP、Apache Directory StudioWildflydcm4che 安装部署MySQL源码编译dcm4cheedcm4chee-arc-light OpenLDAP安装ApacheDirectoryStudio安装配置WildFly服务器 部署完成 文件清单 下载地址 Apache directory studio - linkOpenLDAP - linkdcm…

工作记录 2017-02-04

工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors&#xff0c;见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…

C语言动态内存管理(下)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;C语言动态内存管理(下) 发布时间&#xff1a;2025.3.18 隶属专栏&#xff1a;C语言 目录 动态内存常见错误内存泄漏&#xff08;Memory Leak&#xff09;典型场景后果解决方案 悬挂指针&#xff08;Dangling Pointe…

Vue:Vue2和Vue3创建项目的几种常用方式以及区别

前言 Vue.js 和 Element UI 都是用 JavaScript 编写的。 1、Vue.js 是一个渐进式 JavaScript 框架。2、Element UI 是基于 Vue.js 的组件库。3、JavaScript 是这两个项目的主要编程语言。 而Element Plus是基于TypeScript开发的。 一、Vue2 1、基于vuecli工具创建 vue2 …