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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏光变

Java编程风格

Java编程的风格介绍,主要参考乐google的java code style。对模糊部分作出了明确的选择。

22020
来自专栏北京马哥教育

Python中下划线的5种含义

来源:Python程序员 ID:pythonbuluo 本文介绍了Python中单下划线和双下划线("dunder")的各种含义和命名约定,名称修饰(name...

39870
来自专栏java一日一条

19 个 JavaScript 编码小技巧

这篇文章适合任何一位基于JavaScript开发的开发者。我写这篇文章主要涉及JavaScript中一些简写的代码,帮助大家更好理解一些JavaScript的基...

10340
来自专栏技术/开源

30分钟?不需要,轻松读懂IL

先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用。到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点...

20470
来自专栏C语言及其他语言

[每日一题]字符串的连接

上一次是要反序输出字符串,而这次是要连接两个字符串,难度都不大,快来试试吧! 题目描述 写一函数,将两个字符串连接 输入 两行字符串 输出 链接后的字符串 样...

33060
来自专栏程序员互动联盟

【专业技术】C++里面重要的几个关键字的用法

编者按: 这几个关键字非常重要,程序中经常见到他们的身影,但是确切意思有时候还需要多搜索下才能知道。笔者这里把它搬出来,也是希望大家引起重视,努力掌握它。 C+...

37070
来自专栏owent

理解Protobuf的数据编码规则

之前用Google的Protobuf感觉真是个很好用的东西,于是抽时间研究了下他的数据的存储方式,以后可以扩展其他语言的解析器。其实与其说是研究,不如说是翻译。...

10410
来自专栏IT派

JavaScript 打怪升级 —— 把业务逻辑当练习题做

开发项目和出没社区有一段时间了,会遇上一些比较有印象业务需求。这些业务需求,可能是自己开发项目遇上的,可能是在社区看到的业务需求,或者其他情况接触到的需求,但是...

8630
来自专栏C/C++基础

C++特性使用建议

使用引用替代指针且所有不变的引用参数必须加上const。在C 语言中,如果函数需要修改变量的值,参数必须为指针,如int foo(int *pval),在 C+...

17030
来自专栏达摩兵的技术空间

浅浅的分析下es6箭头函数

箭头函数作为es6重点的语法内容之一,很多开发者对其爱不释手,当也要注意其可能存在的问题,其正确的使用场景,否则会引起不必要的bug。

6210

扫码关注云+社区

领取腾讯云代金券