Naming conventions in Ruby language

The only real difficulties in programming are cache invalidation and naming things.

A naming convention is a set of rules for choosing the character sequence(or simply name) to be used for identifiers which denote variables, types, functions, and other entities in source code and documentation. (Source)

Using a naming convention has following benefits:

  • To reduce the effort needed to read and understand source code.
  • To enable code reviews to focus on more important issues than arguing over syntax and naming standards
  • To enable code quality review tools to focus their reporting mainly on significant issues other than syntax and style preferences.
  • To help improve the productivity among the team by following coding standards and reducing arguments over syntax and style.

Following are the few naming conventions one should know and taken from Ruby community style guide). These rules are set to make Ruby code more readable, acceptable in the community.

Although these rules are not mandatory but by following these conventions you are helping others to understand your code quickly and in an efficient manner.

CamelCase for Classes

Use CamelCase for classes and modules. (Keep acronyms like HTTP, RFC, XML uppercase).

# bad class names
Someclass
Some_Class
SomeXml
XmlSomething

# good class names
SomeClass
SomeXML
XMLSomething

Snake Case for Symbols, Methods and Variables

Use snake_case for symbols, methods and variables

# bad names
:'some symbol'
:SomeSymbol
:someSymbol
someVar = 5
someMethod
SomeMethod

# good names
:some_symbol
some_var = 5
some_method

Snake Case for file and directory name

Use snake_case for naming files and directories

# bad names
someDir/someFile.rb
SomeDir/SomeFile.rb
Some_Dir/Some_File.rb

# good names
some_dir/some_file.rb

Screaming Snake Case for Constants

Use SCREAMING_SNAKE_CASE for other constants (those that don’t refer to classes and modules).

# bad name
SomeConst = 5

# good name
SOME_CONST = 5

Identifiers with a Numeric Suffix

Do not separate numbers from letters on symbols, methods and variables.

# bad names
:some_sym_1
some_var_1 = 1
var_10 = 10
some_method_1

# good names
:some_sym1
some_var1 = 1
var10 = 10
some_method1

One Class per File

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.

Appropriate suffix for method names

Question mark to method returning boolean value

The 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.

# bad
def even(value)
end

# good
def even?(value)
end

Dangerous Method Suffix

The names of potentially dangerous methods (i.e. methods that modify self or the arguments, exit! (doesn’t run the finalizers like exit does), etc) should end with an exclamation mark if there exists a safe version of that dangerous method.

# 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
end

Check more here.

Avoid predicate Methods prefix

Avoid prefixing predicate methods with the auxiliary verbs such as is, does, or can. These words are redundant and inconsistent with the style of boolean methods in the Ruby core library, such as empty? and include?.

# bad
def is_tall?
end

def can_play_basketball?
end

def does_like_candy?
end

# good
def tall?
end

def basketball_player?
end

def likes_candy?
end

Unused Variables Prefix

Prefix with _ unused block parameters and local variables. It’s also acceptable to use just _ (although it’s a bit less descriptive). This convention is recognized by the Ruby interpreter and tools like RuboCop and will suppress their unused variable warnings.

# bad
result = hash.map { |k, v| v + 1 }

def something(x)
  unused_var, used_var = something_else(x)
end

# good
result = hash.map { |_k, v| v + 1 }

def something(x)
  _unused_var, used_var = something_else(x)
end

result = hash.map { |_, v| v + 1 }

def something(x)
  _, used_var = something_else(x)
end

Help me to improve BRG Trainings.