A guide for programming well.
- Don't duplicate the functionality of a built-in library.
- Don't swallow exceptions or "fail silently."
- Don't write code that guesses at future functionality.
- Exceptions should be exceptional.
- Keep the code simple.
- Avoid global variables.
- Avoid long parameter lists.
- Limit collaborators of an object (entities an object depends on).
- Limit an object's dependencies (entities that depend on an object).
- Prefer composition over inheritance.
- Prefer small methods. One line is best.
- Prefer small objects with a single, well-defined responsibility.
- Tell, don't ask.
- Avoid optional parameters. Does the method do too much?
- Avoid monkey-patching.
- Prefer classes to modules when designing functionality that is shared by multiple models.
- Prefer
private
when indicating scope. Useprotected
only with comparison methods likedef ==(other)
,def <(other)
, anddef >(other)
.
- Don't change a migration after it has been merged into master if the desired change can be solved with another migration.
- Validate the associated
belongs_to
object (user
), not the database column (user_id
). - Avoid exact version numbers in
Gemfile
except for non-framework gems.
- Use the project's Gemfile to specify the Ruby version
- Use an exact version
in the
Gemfile
for fragile gems, such as Rails. - Use a pessimistic version in the 'Gemfile' for gems that follow semantic versioning, such as rspec, factory_girl, and capybara.
- Use versionless
Gemfile
declarations for gems that are safe to update often, such as pg, thin, and debugger.
- Avoid multicolumn indexes in Postgres. It combines multiple indexes efficiently. Optimize later with a compound index if needed.
- Consider a partial index for queries on booleans.
- Constrain most columns as
NOT NULL
.
- Store IDs, not
ActiveRecord
objects for cleaner serialization, then re-find theActiveRecord
object in theperform
method.
- Use SendGrid or Amazon SES to deliver email in staging and production environments.
- Use a tool like mail_view to look at each created or updated mailer view before merging.
- Disable real HTTP requests to external services with
WebMock.disable_net_connect!
. - Test background jobs with a
Delayed::Job
matcher. - Use a Fake to stub requests to external services.
- Use integration tests to execute the entire app.
- Use non-SUT methods in expectations when possible.
- Don't support clients without Javascript.
- Don't support IE6.
- Prefer categories on
Foundation
classes to helper methods. - Prefer string constants to literals when providing keys or key paths to methods.