对ruby和python这样的动态语言的开发者来说,从来没有官方的编码规范和最佳实践,下面介绍一种。
这个代码的规范推荐ruby开发者把它作为最佳实践,这样一个开发者写的代码就可以被真实世界中的其他开发者维护。
格式
几乎每一个人都相信除了自己的代码别人的风格都是丑陋的,代码都是不可读的。不过事实真的是这样?最好还是有一个规范。
1 source的文件编码使用utf-8。
2 使用2个空格的缩进,不要使用tabs,tabs在不同的操作系统上有不同的空格数(并且可以被人为的设置)。这可能导致在有些人的编辑器在代码看起来不同。
3 在操作符前后使用空格,包括逗号,冒号,分号,{的前后和}的前面,空格也许(大部分)和Ruby的解释器无关,但它的正确使用是写易读的代码的关键。
sum = 1 + 2
a, b = 1, 2
1 > 2 ? true : false; puts 'Hi'
[1, 2, 3].each { |e| puts e }
唯一的例外是使用指数操作符
# bad
e = M * c ** 2
# good
e = M * c**2
4 没有空格在(, [的后面和], )的前面。
some(arg).other
[1, 2, 3].length
5 when和case的步长一样深
这个有很多的人不认同,不过这种风格在"The Ruby Programming Language"和"Programming Ruby"都得到了确认。
case
when song.name == 'Misty'
puts 'Not again!'
when song.duration > 120
puts 'Too long!'
when Time.now.hour > 21
puts "It's too late"
else
song.play
end
kind = case year
when 1850..1889 then 'Blues'
when 1890..1909 then 'Ragtime'
when 1910..1929 then 'New Orleans Jazz'
when 1930..1939 then 'Swing'
when 1940..1950 then 'Bebop'
else 'Jazz'
end
6 在一个方法的返回值前面使用空行(除非只有一行),并且在def之间使用空行。
def some_method
do_something
do_something_else
result
end
def some_method
result
end
7 使用api文档和它的约定。不要在注释块和def之间使用空行。
8 使用空行把一个方法分为逻辑段。
9 保持每行少于80个字符
Emacs的用户也许相应设置这样的配置在他们的config中 (e.g. ~/.emacs.d/init.el):
(setq whitespace-line-count 80
whitespace-style '(lines))
{code}
Vim的用户也许相应设置这样的配置在他们的config中(e.g. ~/.vimrc):
{code}
" VIM 7.3+ has support for highlighting a specified column.
if exists('+colorcolumn')
set colorcolumn=80
else
" Emulate
au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%80v.\+', -1)
endif
10 避免结尾空格
Emacs的用户也许相应设置这样的配置在他们的config中 (和前面的例子完美的结合起来):
(setq whitespace-style '(trailing space-before-tab
indentation space-after-tab))
{code}
Vim Emacs的用户也许相应设置这样的配置在他们的 ~/.vimrc:
{code}
autocmd BufWritePre * :%s/\s\+$//e
语法
1 def使用括号当有参数的时候,忽略括号当没有参数
def some_method
# body omitted
end
def some_method_with_arguments(arg1, arg2)
# body omitted
end
2 不要使用for,除非你知道为什么。大部分的时候使用迭代器代替。for在each中被实现了(所以你是间接使用),不过for没有引入到一个新的范围中(不像each),而且在块中定义的变量外部仍然可见。
arr = [1, 2, 3]
# bad
for elem in arr do
puts elem
end
# good
arr.each { |elem| puts elem }
3 在if/unless多行的时候不要使用then
# bad
if some_condition then
# body omitted
end
# good
if some_condition
# body omitted
end
4 比起if/then/else/end 结构更加喜爱使用三元运算符,它的更为普遍和明显更简洁。
# bad
result = if some_condition then something else something_else end
# good
result = some_condition ? something : something_else
5