how to bang...like a boss
In the Ruby programming language, there exists two characters you are only permitted to use when naming a method: ? and !. These special permissions are designed to allow you to establish a certain level of convention in your method naming, for example, a method ending in "?" in Ruby is mosty likely always going to return a Boolean response of true or false. Not only is this convention not questioned much, but there seems to be very little sensible use out of making a "?" method not return a boolean response.
Unlike the "?" suffix, which has an established and unchallenged purpose
within the Ruby community, "!" is a lot less cut and dry. In ActiveRecord,
for example, "!" is added to methods like save()
and create()
when you
want an Exception to be thrown in the case where those methods fail to
execute properly. It's easy enough to add the "!" to those methods when
you need to change the nature of your business logic, or perhaps you wish
to capture the Exception so you can raise a new one overtop of that
error case.
# app/models/post.rb
class Post < ActiveRecord::Base
validates_presence_of :title
end
# app/controllers/posts_controller.rb
def create
model = Model.create! # => throws ActiveRecord::ValidationError
end
def create
model = Model.create # => just returns 'false'
end
But Ruby, on the other hand, uses "!" to denote when you're mutating the object that you're calling the method on. This is an entirely different use case from Rails, yet this use case also seems to make sense on a syntactic level:
starter = { foo: 'bar' }
newer = starter.merge(baz: 'bat') # => returns a new Hash: { foo: 'bar', baz: 'bat' }
starter.merge!(baz: 'bat') # => merges in { baz: 'bat' } to the starter Hash instance
bang is the yolo convention
At eLocal, we use "!" as a generalized YOLO convention. It means we're about to execute some actions which may fail, or are connecting to an outside resource (such as an API or our mothership site) In either case, the "!" dictates that our app's control flow should stop.