Ruby编程中的命名风格指南
用英语命名标识符。
# bad - identifier using non-ascii characters заплата = 1_000 # bad - identifier is a bulgarian word, written with latin letters (instead of cyrillic) zaplata = 1_000 # good salary = 1_000
使用snake_case的形式给变量和方法命名。
# bad :'some symbol' :somesymbol :somesymbol somevar = 5 def somemethod ... end def somemethod ... end # good :some_symbol def some_method ... end
snake case: punctuation is removed and spaces are replaced by single underscores. normally the letters share the same case (either upper_case_embedded_underscore or lower_case_embedded_underscore) but the case can be mixed
使用camelcase(駝峰式大小寫)的形式给类和模块命名。(保持使用缩略首字母大写的方式如http,
rfc, xml)
# bad class someclass ... end class some_class ... end class somexml ... end # good class someclass ... end class somexml ... 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 - there is not matching 'safe' method class person def update! end end # good class person def update end end # good class person def update! end def update end end
如果可能的话,根据危险方法(bang)来定义对应的安全方法(non-bang)。
class array def flatten_once! res = [] each do |e| [*e].each { |f| res << f } end replace(res) end def flatten_once dup.flatten_once! end end
当在短的块中使用 reduce 时,命名参数 |a, e| (accumulator, element)。
#combines all elements of enum枚举 by applying a binary operation, specified by a block or a symbol that names a method or operator. # sum some numbers (5..10).reduce(:+) #=> 45#reduce # same using a block and inject (5..10).inject {|sum, n| sum + n } #=> 45 #inject注入 # multiply some numbers (5..10).reduce(1, :*) #=> 151200 # same using a block (5..10).inject(1) {|product, n| product * n } #=> 151200
在定义二元操作符时,把参数命名为 other (<< 与 [] 是这条规则的例外,因为它们的语义不同)。
def +(other) # body omitted 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 { ... }
上一篇: Ruby配置rspec和RestClient来检测服务器
下一篇: 炒香菇要不要焯水