Nim编码风格
介绍
Nim语言不限制开发人员使用哪种具体的编码风格,
但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格
这篇文章会列出一系列的编码风格准则,供大家参考。
但值得注意的是,有很多例外场景会与这些准则相悖,
而且,nim语言非常灵活,在一些特定上下文中,这些编码风格准则也不适用。
跟python相似,python的编码风格在不断演化、改变,
nim语言也是这样,随着时间的推移,这个编码风格准则也会改变。
在编写nim的基础类库、编译器、官方工具的时候,
强制要求遵从这些编码风格准则
间距和空白约定
一行的代码量不应该超过80个字符,一行代码量太多的话不利于阅读;
应该使用两个空格来制定缩进,不能使用tab按键来制定缩进;这是因为对于不同的编辑器来说,空格所代表的宽度都是一样的,但制表符所代表的宽度可能是不同的;
虽然开发人员可以使用空格来格式化代码,但是需要注意的是,并不是所有的编辑器都能完成自动对齐工作;
下面这段代码是不推荐的案例
# 下面这段代码是不推荐的案例,
# 如果以后再有人来修改这段代码,
# 他有可能需要重新格式化所有的代码:
type
WordBool* = int16
CalType* = int
... # 5 lines later
CalId* = int
LongLong* = int64
LongLongPtr* = ptr LongLong
命名约定
注意:下面我们描述的命名约定有可能过一段时间就会过时了。
应该使用PascalCase(两个单词中每个单词首字母都大写)命名法命名类型标识符
另外,除了一些常量可能会使用PascalCase命名法之外,
其他的标识符都应该使用camelCase(两个单词中,第一个单词的首字母小写,第二个单词的首字母大写)
const aConstant = 42
const FooBar = 4.2 #常量类型约束不是那么明显 var aVariable = "Meep" type FooBar = object
对于C/C++的包装器来说,nim语言允许开发人员使用ALL_UPPERCASE的命名方式(所有字符都大写),但这看起来实在太丑了。
当命名值、指针、引用类型时,大部分时候的都是直接用一个有意义的名字即可,
也可以根据情况给这些名字加上“Obj”或“Ref”或“Ptr”后缀
对于C/C++的包装器来说,也遵从这样的原则。
type
Handle = int64 # 常用
HandleRef = ref Handle # 不那么常用
对于异常或错误类型的变量,需要加上Error尾缀
type UnluckyError = object of Exception
枚举类型的成员应该有一个确定的前缀,一般情况下都是枚举类型名称的缩写
(如果标记为{.pure.}可以不遵从这项约定)
type PathComponent = enum
pcDir
pcLinkToDir
pcFile
pcLinkToFile
non-pure的枚举值应该使用camelCase命名法
pure枚举值应该使用PascalCase命名法
type PathComponent {.pure.} = enum
Dir
LinkToDir
File
LinkToFile
对于HTTP HTML FTP TCP IP UTF WWW这类词语来说
没必要左右的字母都大写。parseUrl比parseURL要好很多
checkHttpHeader比checkHTTPHeader要好很多
编码约定
只有在流程控制语句需要的时候,才使用return语句
一般情况下都使用默认的result变量
(别忘了nim语言的每个方法中都有一个隐藏的result变量)
一般情况下推荐返回一个[]或者""或者抛出一个异常,而不是返回一个nil
大部分时候用proc(方法)就能满足业务需求了
只有在比较特殊的时候才会用到宏、模版、迭代器、转换器
如果一个变量在其作用域内不会变化,那么尽量用let声明它,(不要用var声明它)
对于用户自定义类型来说,通常建议同时创建"ref"和"object"类型
多行语句和表达式的约定
如果元组类型的定义,长度超过了一行(80个字符),那么就应该分成多行来定义
type
ShortTuple = tuple[a: int, b: string]
ReallyLongTuple = tuple
wordyTupleMemberOne: string
wordyTupleMemberTwo: int
wordyTupleMemberThree: double
同样,任何类型的声明,如果长度超过一行,应该格式化多行来声明
type
EventCallback = proc (
timeRecieved: Time
errorCode: int
event: Event
)
如果一个方法的参数较多,需要在多行内书写,
那么第二行的开始应该与第一行上的左括号对齐
proc lotsOfArguments(argOne: string, argTwo: int, argThree:float
argFour: proc(), argFive: bool): int
{.heyLookALongPragma.} =
如果你需要调用一个方法,而调用语句很长的话
你可以把每个参数都分做一行,也可以多个参数占用一行(与第一行的左括号对齐)
# 对于复杂方法调用的时候,推荐每个参数占用一行.
readDirectoryChangesW(
directoryHandle.THandle,
buffer.start,
bufferSize.int32,
watchSubdir.WinBool,
filterFlags,
cast[ptr dword](nil),
cast[Overlapped](ol),
cast[OverlappedCompletionRoutine](nil)
) # 简单方法调用时,推荐:多个参数占用一行,与第一行的左括号对齐
startProcess(nimExecutable, currentDirectory, compilerArguments
environment, processOptions)
Nim编码风格的更多相关文章
- 学习Linux的编码风格
对于编码,每个码农或许都会有自己的一套风格,很多人可能对编码风格压根就不关心,因为最终编译器编译出来的目标代码并不会受影响.但是在开发一个大型项目时,花费时间成本最多的永远是开发者们之间的沟通与交流. ...
- R 语言编码风格指南
R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...
- 一步一步学Python(1) 基本逻辑控制举例和编码风格规范
(1) 基本逻辑控制举例和编码风格规范 1.while死循环 2.for循环 3.if,elif,else分支判断 4.编码风格(官方建议) 版本:Python3.4 1.while死循环 #func ...
- 来自 Google 的 R 语言编码风格指南
来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...
- JavaScript编码风格指南(中文版)
前言: 程序语言的编码风格对于一个长期维护的软件非常重要,特别是在团队协作中.如果一个团队使用统一规范的编码分风格,可以提高团队的协作水平和工作效率.编程风格指南的核心是基本的格式化规则,这些规则决定 ...
- jmeter随笔(9)--有两种编码风格,导致数据乱码
问题:在一个网站,有两种编码风格,导致数据乱码 解决办法: 1.首先设置jmeter的配置文件 2.针对要求是utf-8格式的这样的请求,做单独的编码处理(beanshell处理) 3.运行,在htm ...
- Android编码风格
整理一下51CTO学院中张凌华老师讲的编码风格课程 一. 项目开发目录命名: Requirement - 需求相关文档 Design - 设计 Planning&Log - 计划,日志,会议 ...
- 一些达成共识的JavaScript编码风格约定
如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要.与其他 ...
- 辛星浅谈PHP的混乱的编码风格
我们都知道.各种编程语言都有自己的风格,即使是像C和C++那样一脉相承的语言(C++本意全然兼容C的语法).编程风格上还是有些区别.比方非常典型的就是C++风格的单行凝视和C风格的多行凝视. 而尽管J ...
随机推荐
- intelj对我来说比较常用的快捷键
文件查找 CTRL+N 查找类 CTRL+SHIFT+N 查找文件 CTRL+SHIFT+ALT+N 查找类中的方法或变量 CTRL+ALT+B 找所有的子类 CTRL+G 定位行 CTR ...
- Android NDK, No rule to make target
这种问题一般是android.mk里面没有找到对应的源文件 http://stackoverflow.com/questions/11570167/android-ndk-no-rule-to-mak ...
- C++的隐式类型转换
C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...
- listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
1.错误提示:Cannot have multiple items selected when the SelectionMode is Single. 刚刚在处理两个Listbox时,将其中一个li ...
- eclipse在光标停留在同一对象的背景色提示,开启与关闭
eclipse在光标停留在变量上的时候,同一变量能够提示相同的背景色.这个功能感觉不起眼,但是实在是很好用啊.如果不小心点消失了会很麻烦. 这里留个记录,如果关闭了记得开启: 开启关闭的位置在工具栏上 ...
- (Python)继承
面向对象的另一个特性是继承,继承可以更好的代码重用. 例如一个学校里面的成员有老师.学生.老师和学生都有共同的属性名字和年纪.但老师还有它自己的属性,如工资.学生也有它的属性,如成绩. 因此我们可以设 ...
- c#下调用dll动态链接库[转]
C# 调用传统的 API 动态链接库,是.NET开发经常被讨论的问题. 比如有这么一个动态链接库(delphi 语言): library DelphiDLL; uses SysUtils, Class ...
- Windows下nginx+php配置
1. 首先,将 nginx.conf 中的 PHP 配置注释去掉. # pass the PHP scripts to FastCGI server listening on # #location ...
- ARC模式下的内存泄露问题
ARC模式下的内存泄露问题 iOS提供的ARC 功能很大程度上简化了编程,让内存管理变得越来越简单,但是ARC并不是说不会发生内存泄露,使用不当照样会发生. 以下列举两种内存泄露情况: 死循环造成的内 ...
- Spring aop 原始的工作原理的理解
理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...