Naming
Name identifiers in English. [link]
# 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_000Use
snake_casefor symbols, methods and variables. [link]# bad :"some symbol" :SomeSymbol :someSymbol someVar = 5 def someMethod ... end def SomeMethod ... end # good :some_symbol def some_method ... endUse
CamelCasefor classes and modules. (Keep acronyms like HTTP, RFC, XML uppercase.)Note: The autoloader in Rails expects acronyms to have an initial capital only (
ApiWrapperinstead ofAPIWrapper), so it makes sense to use that style in Rails code. [link]# bad class Someclass ... end class Some_Class ... end class SomeXml ... end class XmlSomething ... end # good class SomeClass ... end class SomeXML ... end class XMLSomething ... endUse
snake_casefor naming files, e.g.hello_world.rb. [link]Use
snake_casefor naming directories, e.g.lib/hello_world/hello_world.rb. [link]Aim to have just a single class/module per source file. Name the file name as the class/module, but replacing CamelCase with snake_case. [link]
Use
SCREAMING_SNAKE_CASEfor other constants. [link]# bad SomeConst = 5 # good SOME_CONST = 5The names of predicate methods (methods that return a boolean value) should end in a question mark. (i.e.
Array#empty?). Methods that don't return a boolean, shouldn't end in a question mark. [link]The names of potentially dangerous methods (i.e. methods that modify
selfor the arguments,exit!(doesn't run the finalizers likeexitdoes), etc.) should end with an exclamation mark if there exists a safe version of that dangerous method.Note: Rails mostly ignores this convention. In Rails related code,
!is often added to methods that modify the receiver. These method may or may not have a non-modifying version. [link]# bad: there is no 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 endDefine the non-bang (safe) method in terms of the bang (dangerous) one if possible. [link]
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 endWhen defining binary operators, name the parameter
other(<<and[]are exceptions to the rule, since their semantics are different). [link]def +(other) # body omitted end