前言
本规约、记述的是在用Ruby进行编程时所使用的编程规约。在实际项目开发的时候,推荐以此为基础,根据项目实际情况进行客户化后再使用。
代码缩进
为了增加程序的可读性而进行的适当的缩进,缩进的幅度以2个字符为宜。另外,缩进的时候,只可使用空格,不可使用TAB(编程工具不同的时候,看起来会不一样)
例:
ifx > 0
ify > 0
puts"x > 0 && y > 0"
end
end
一行的字符数
一行的字符数以80字符(半角)为宜。
用空行来区分开复数的类
正例:
classFoo
...
end
classBar
...
end
误例:
classFoo
...
end
classBar
...
end
另外、类中的各个构成要素之间也需要用空行来隔开。但是,最初的要素之前和最后的要素之后不需要插入空行。
正例:
classFoo
attr:bar
defbaz
...
end
defquux
..
end
end
误例:
classFoo
attr:bar
defbaz
...
end
defquux
...
end
end
注释
方法的定义中不需要注释行。(认为需要注释的地方使用refactoring。)
但是,对类、模块、或公有方法的注释要使用RDoc的风格来注释。
例:
#コンマ区切の文字列+str+を分割し、結果を配列にして返す。
defsplit_csv(str)
returnstr.split(/,/)
end
程序结构相关的规约
类的构成要素以下记的顺序来记述。
模块的包含
常数的定义
类变量、类实例的定义
公有方法的定义
控制符的定义
initialize的定义
公有实例方法的定义
保护类方法的定义
保护控制符的定义
保护实例方法的定义
私有类方法的定义
私有控制符的定义
私有实例方法的定义
嵌套类的定义
在控制符的定义中,使用attr_accessor、attr_reader、attr_writer(不使用attr)
方法的定义
方法的定义中,形参要用括号括起来。但是、没有参数的时候,括号可以省略。
正例:
deffoo(x, y)
...
end
deffoo
...
end
误例:
deffoo x, y
...
end
deffoo()
...
end
类方法的定义的时候要使用self。
正例:
classFoo
defself.foo
...
end
end
误例:
classFoo
defFoo.foo
...
end
end
调用某个方法的时候,参数要用括号括起来。但是,没有参数的时候,括号可以省略。另外,print、puts、p的时候,也可已省略参数。
正例:
foo(1,"abc")
obj.foo(1,"abc")
bar
print"x = ", x, "\n"
误例:
foo1, "abc"
obj.foo1, "abc"
bar()
一个代码块基本上使用do... end来包括起来
正例:
foo(x,y) do
...
end
x= bar(y, z) do
...
end
误例:
foo(x,y) {
...
}
x= bar(y, z) {
...
}
但是,方法链使用的时候,用{... }来包括起来。
正例:
s= ary.collect { |i| i.to_s }.join(",")
误例:
s= ary.collect do |i| i.to_s end.join(",")
方法有返回值的时候、必须使用return来明示。另外、return的括号可以省略。
例:
defadd(x, y)
returnx + y
end
误例:
defadd(x, y)
x+ y
end
defadd(x, y)
return(x+ y)
end
yield的调用方法遵照方法的调用规则。
If语句的then可以省略。另外、如果是if!x的时候、请用unlessx来置换。但是,unless的时候、不使用else。还有,非常简单的条件,一行能够写下来的时候,直接使用if/while也可。
正例:
ifx > 0
puts"x > 0"
else
puts"x <= 0"
end
unlessx
puts"x is false"
end
puts"x is true" if x
误例:
ifx > 0 then
puts"x > 0"
end
unlessx
puts"x is false"
else
puts"x is true"
end
puts"foo && bar && baz && quux" if foo&&
bar&& baz && quux
能使用case、请使用case。省略掉then。
正例:
casex
when1
...
when2
...
end
误例:
ifx == 1
...
elsifx == 2
...
end
casex
when1 then
...
when2 then
...
end
不要直接使用条件分支作为代入值。
正例:
ifx > 0
msg= "x > 0"
else
msg= "x <= 0"
end
误例:
msg= if x > 0
"x> 0"
else
"x<= 0"
end
循环
While语句do省略。另外、while!x的时候、请使用untilx。
正例:
whilecond
...
end
untilcond
...
end
误例:
whilecond do
...
end
另外、无限循环的时候,使用loop。
正例:
loopdo
...
end
误例:
whiletrue
...
end
逻辑运算符
逻辑运算中,使用!、&&、||。(not/and/or不使用。)
三项运算符
除非有明确的可读性,尽量不要使用三项运算符。特别是、括号等必要的条件复杂的时候、跨行的时候、不使用三项运算符。
字符串
字符串基本上使用"..."的形式。但是,只有在某些特殊文字的场合,使用'...'的形式。另外、原则上不使用“heredocument”
命名规约
全体
原则上、不建议使用省略的单词。
作用域小的变量、i,j, k等单字母,顺序使用。
作用域小的变量、使用类名的省略语也没有关系。(例:eo= ExampleObject.new)
类以及模块名、每个单词的头一个字母大写、不要使用’_’(下划线)等分隔符。但是、像HTTP这样的通用缩略语,全体大写也可。
正例:
ExampleClass
HTTPClient
误例:
Example_Class
EXAMPLE_CLASS
HttpClient
HTTPclient
HTTP_Client
方法名は、全部小写、各个单词之间用’_’分隔。方法名中请使用动词的原形。
正例:
add_something
误例:
addsSomething
Add_Something
返回真假值的方法的命名、在动词或形容词后追加’?’、形容词的时候,不用添加’is_’。
正例:
visible?
误例:
is_visible
is_visible?
另外、破坏性和非破坏性的方法都提供的时候、在破坏性的方法名后追加’!’。
例:
split
split!# 具有破坏性的split
常数名
类模块名以外的常数名、全部用大写、单词之间用’_’来分隔。
例:
EXAMPLE_CONSTANT
变量名中、全部用小写、单词之间用’_’来分隔。
例:
tmp
local_variable
@instance_variable
$global_variable
文件名
在文件名中、全部使用小写字母、单词之间用’_’来分隔。另外、可以把文件中主要的类名变成小写后作为文件名来使用。(把模块作为命名空间来使用的时候,同时使用目录名,可以体现出构造的阶层来。)
例:
foo.rb# 定义了类Foo
foo-bar.rb# 定义了类FooBar
foo/bar-baz.rb# 定义了类Foo::BarBaz
Copyright(C) 2007 Shugo Maeda
licensedunder CreativeCommons Attribution License