Ruby編程中的命名風(fēng)格指南
用英語(yǔ)命名標(biāo)識(shí)符。
# 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(駝峰式大小寫(xiě))的形式給類和模塊命名。(保持使用縮略首字母大寫(xiě)的方式如HTTP,
RFC, XML)
# bad class Someclass ... end class Some_Class ... end class SomeXml ... end # good class SomeClass ... end class SomeXML ... end
使用 snake_case 來(lái)命名文件, 例如 hello_world.rb。
以每個(gè)源文件中僅僅有單個(gè) class/module 為目的。按照 class/module 來(lái)命名文件名,但是替換 CamelCase 為 snake_case。
使用SCREAMING_SNAKE_CASE給常量命名。
# bad SomeConst = 5 # good SOME_CONST = 5
在表示判斷的方法名(方法返回真或者假)的末尾添加一個(gè)問(wèn)號(hào)(如Array#empty?)。
方法不返回一個(gè)布爾值,不應(yīng)該以問(wèn)號(hào)結(jié)尾。
可能會(huì)造成潛在“危險(xiǎn)”的方法名(如修改 self或者 參數(shù)的方法,exit! (不是像 exit 執(zhí)行完成項(xiàng))等)應(yīng)該在末尾添加一個(gè)感嘆號(hào)如果這里存在一個(gè)該 危險(xiǎn) 方法的安全版本。
# 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
如果可能的話,根據(jù)危險(xiǎn)方法(bang)來(lái)定義對(duì)應(yīng)的安全方法(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
當(dāng)在短的塊中使用 reduce 時(shí),命名參數(shù) |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
在定義二元操作符時(shí),把參數(shù)命名為 other (<< 與 [] 是這條規(guī)則的例外,因?yàn)樗鼈兊恼Z(yǔ)義不同)。
def +(other) # body omitted end
map 優(yōu)先于 collect,find 優(yōu)先于 detect,select 優(yōu)先于 find_all,reduce 優(yōu)先于inject,size 優(yōu)先于 length。以上的規(guī)則并不絕定,如果使用后者能提高代碼的可讀性,那么盡管使用它們。有押韻的方法名(如 collect,detect,inject)繼承于 SmallTalk 語(yǔ)言,它們?cè)谄渌Z(yǔ)言中并不是很通用。鼓勵(lì)使用 select 而不是 find_all 是因?yàn)?select 與 reject 一同使用時(shí)很不錯(cuò),并且它的名字具有很好的自解釋性。
不要使用 count 作為 size 的替代。對(duì)于 Enumerable 的 Array 以外的對(duì)象將會(huì)迭代整個(gè)集合來(lái)
決定它的尺寸。
# bad some_hash.count # good some_hash.size
傾向使用 flat_map 而不是 map + flatten 的組合。
這并不適用于深度大于 2 的數(shù)組,舉個(gè)例子,如果 users.first.songs == ['a', ['b', 'c']] ,則使用 map + flatten 的組合,而不是使用 flat_map 。
flat_map 將數(shù)組變平坦一個(gè)層級(jí),而 flatten 會(huì)將整個(gè)數(shù)組變平坦。
# bad all_songs = users.map(&:songs).flatten.uniq # good all_songs = users.flat_map(&:songs).uniq
使用 reverse_each 代替 reverse.each。reverse_each 不會(huì)分配一個(gè)新數(shù)組并且這是好事。
# bad
array.reverse.each { ... }
# good
array.reverse_each { ... }
相關(guān)文章
Ruby基礎(chǔ)知識(shí)之?dāng)?shù)據(jù)類型
這篇文章主要介紹了Ruby基礎(chǔ)知識(shí)之?dāng)?shù)據(jù)類型,本文講解了數(shù)值類型、字符串類型、字符類型、哈希類型、范圍類型、對(duì)象標(biāo)識(shí)、對(duì)象的類、類型等內(nèi)容,需要的朋友可以參考下2015-04-04
Ruby實(shí)現(xiàn)的最優(yōu)二叉查找樹(shù)算法
這篇文章主要介紹了Ruby實(shí)現(xiàn)的最優(yōu)二叉查找樹(shù)算法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05
使用RVM實(shí)現(xiàn)控制切換Ruby/Rails版本
RVM 是Ruby Version Manager的縮寫(xiě),是一個(gè)命令行工具,它可以讓你輕松地安裝,管理和使用多個(gè)版本的Ruby.不同的rails項(xiàng)目使用等ruby和rails版本不一樣的時(shí)候,可以使用RVM自由切換。2017-06-06
利用RJB在Ruby on Rails中使用Java代碼的教程
這篇文章主要介紹了利用RJB在Ruby on Rails中使用Java代碼的教程,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04
淺談Rails 4 中Strong Parameters機(jī)制
本文主要是通過(guò)Rails3中的Parameters與Rails4中新引入的Strong Parameters機(jī)制進(jìn)行對(duì)比,從而得出他們直接的異同2014-06-06

