Ruby编程中的命名风格指南
用英语命名标识符。
#bad-identifierusingnon-asciicharacters заплата=1_000 #bad-identifierisaBulgarianword,writtenwithLatinletters(insteadofCyrillic) zaplata=1_000 #good salary=1_000
使用snake_case的形式给变量和方法命名。
#bad :'somesymbol' :SomeSymbol :someSymbol someVar=5 defsomeMethod ... end defSomeMethod ... end #good :some_symbol defsome_method ... end
Snakecase:punctuationisremovedandspacesarereplacedbysingleunderscores.Normallytheletterssharethesamecase(eitherUPPER_CASE_EMBEDDED_UNDERSCOREorlower_case_embedded_underscore)butthecasecanbemixed
使用CamelCase(駝峰式大小寫)的形式给类和模块命名。(保持使用缩略首字母大写的方式如HTTP,
RFC,XML)
#bad classSomeclass ... end classSome_Class ... end classSomeXml ... end #good classSomeClass ... end classSomeXML ... end
使用snake_case来命名文件,例如hello_world.rb。
以每个源文件中仅仅有单个class/module为目的。按照class/module来命名文件名,但是替换CamelCase为snake_case。
使用SCREAMING_SNAKE_CASE给常量命名。
#bad SomeConst=5 #good SOME_CONST=5
在表示判断的方法名(方法返回真或者假)的末尾添加一个问号(如Array#empty?)。
方法不返回一个布尔值,不应该以问号结尾。
可能会造成潜在“危险”的方法名(如修改self或者参数的方法,exit!(不是像exit执行完成项)等)应该在末尾添加一个感叹号如果这里存在一个该危险方法的安全版本。
#bad-thereisnotmatching'safe'method classPerson defupdate! end end #good classPerson defupdate end end #good classPerson defupdate! end defupdate end end
如果可能的话,根据危险方法(bang)来定义对应的安全方法(non-bang)。
classArray defflatten_once! res=[] eachdo|e| [*e].each{|f|res<<f} end replace(res) end defflatten_once dup.flatten_once! end end
当在短的块中使用reduce时,命名参数|a,e|(accumulator,element)。
#Combinesallelementsofenum枚举byapplyingabinaryoperation,specifiedbyablockorasymbolthatnamesamethodoroperator. #Sumsomenumbers (5..10).reduce(:+)#=>45#reduce #Sameusingablockandinject (5..10).inject{|sum,n|sum+n}#=>45#inject注入 #Multiplysomenumbers (5..10).reduce(1,:*)#=>151200 #Sameusingablock (5..10).inject(1){|product,n|product*n}#=>151200
在定义二元操作符时,把参数命名为other(<<与[]是这条规则的例外,因为它们的语义不同)。
def+(other) #bodyomitted end
map优先于collect,find优先于detect,select优先于find_all,reduce优先于inject,size优先于length。以上的规则并不绝定,如果使用后者能提高代码的可读性,那么尽管使用它们。有押韵的方法名(如collect,detect,inject)继承于SmallTalk语言,它们在其它语言中并不是很通用。鼓励使用select而不是find_all是因为select与reject一同使用时很不错,并且它的名字具有很好的自解释性。
不要使用count作为size的替代。对于Enumerable的Array以外的对象将会迭代整个集合来
决定它的尺寸。
#bad some_hash.count #good some_hash.size
倾向使用flat_map而不是map+flatten的组合。
这并不适用于深度大于2的数组,举个例子,如果users.first.songs==['a',['b','c']],则使用map+flatten的组合,而不是使用flat_map。
flat_map将数组变平坦一个层级,而flatten会将整个数组变平坦。
#bad all_songs=users.map(&:songs).flatten.uniq #good all_songs=users.flat_map(&:songs).uniq
使用reverse_each代替reverse.each。reverse_each不会分配一个新数组并且这是好事。
#bad array.reverse.each{...} #good array.reverse_each{...}