命名

程序设计的真正难题是替事物命名及使缓存失效。

——Phil Karlton


  • 标识符使用英文命名。
    [link]

    1. # 差 - 标识符使用非 ASCII 字符
    2. заплата = 1_000
    3. # 差 - 标识符使用拉丁文写法的保加利亚单词
    4. zaplata = 1_000
    5. # 好
    6. salary = 1_000

  • 符号、方法、变量使用蛇底式小写(snake_case)。
    [link]

    1. # 差
    2. :'some symbol'
    3. :SomeSymbol
    4. :someSymbol
    5. someVar = 5
    6. var_10 = 10
    7. def someMethod
    8. ...
    9. end
    10. def SomeMethod
    11. ...
    12. end
    13. # 好
    14. :some_symbol
    15. some_var = 5
    16. var10 = 10
    17. def some_method
    18. ...
    19. end

  • 给符号、方法、变量命名时,避免分隔字母与数字。
    [link]

    1. # 差
    2. :some_sym_1
    3. some_var_1 = 1
    4. def some_method_1
    5. # 做一些事情
    6. end
    7. # 好
    8. :some_sym1
    9. some_var1 = 1
    10. def some_method1
    11. # 做一些事情
    12. end

  • 类与模块使用驼峰式大小写(CamelCase)。(HTTP、RFC、XML 等首字母缩写应该仍旧保持大写形式)
    [link]

    1. # 差
    2. class Someclass
    3. ...
    4. end
    5. class Some_Class
    6. ...
    7. end
    8. class SomeXml
    9. ...
    10. end
    11. class XmlSomething
    12. ...
    13. end
    14. # 好
    15. class SomeClass
    16. ...
    17. end
    18. class SomeXML
    19. ...
    20. end
    21. class XMLSomething
    22. ...
    23. end

  • 文件名使用蛇底式小写,如 hello_world.rb
    [link]


  • 目录名使用蛇底式小写,如 lib/hello_world/hello_world.rb
    [link]


  • 尽量使一个源文件中只有一个类或模块。文件名就是类名或模块名,但使用蛇底式小写而不是驼峰式大小写。
    [link]


  • 其他常量使用尖叫蛇底式大写(SCREAMING_SNAKE_CASE)。
    [link]

    1. # 差
    2. SomeConst = 5
    3. # 好
    4. SOME_CONST = 5

  • 谓词方法(返回布尔值的方法)的名字应当以问号结尾。(比如 Array#empty?)。不返回布尔值的方法不应以问号结尾。
    [link]


  • 谓词方法的名字应当避免使用 isdoescan 等助动词作为前缀。这些助动词在实际场景中显得冗余,且与标准库的命名习惯(比如 empty?include?)很不一致。
    [link]

    1. # 差
    2. class Person
    3. def is_tall?
    4. true
    5. end
    6. def can_play_basketball?
    7. false
    8. end
    9. def does_like_candy?
    10. true
    11. end
    12. end
    13. # 好
    14. class Person
    15. def tall?
    16. true
    17. end
    18. def basketball_player?
    19. false
    20. end
    21. def likes_candy?
    22. true
    23. end
    24. end

  • 具有潜在危险性的方法,当其存在对应安全版本的方法时,其名字应当以惊叹号结尾。(比如修改 self 或参数值的方法、相对 exit 方法不会在退出时运行 finalizers 执行清理工作的 exit! 方法等)
    [link]

    1. # 差 - 没有对应安全版本的方法
    2. class Person
    3. def update!
    4. end
    5. end
    6. # 好
    7. class Person
    8. def update
    9. end
    10. end
    11. # 好
    12. class Person
    13. def update!
    14. end
    15. def update
    16. end
    17. end

  • 尽量根据危险方法来定义对应安全版本的方法。
    [link]

    1. class Array
    2. def flatten_once!
    3. res = []
    4. each do |e|
    5. [*e].each { |f| res << f }
    6. end
    7. replace(res)
    8. end
    9. def flatten_once
    10. dup.flatten_once!
    11. end
    12. end

  • 当定义二元操作符时,将参数命名为 other<<[] 例外,因为其语义与此不同)。
    [link]

    1. def +(other)
    2. # 省略主体
    3. end