ErrorHandlingProtocol
Provides common error messages in the protocol of class Object
.
For example, to report the error that a subclass should have implemented one of the superclass's messages.
Inspired in Smalltalk's Error Handling Protocol.
See Smalltalk-80: The Language And Its Implementation, Chapter 6, page 102.
Installation
Add this line to your application's Gemfile:
gem 'error_handling_protocol'
And then execute:
$ bundle
Or install it yourself as:
$ gem install error_handling_protocol
Usage
Just require 'error_handling_protocol'
.
Subclass Responsibility
Report to the user that a method specified in the superclass of the receiver should have been implemented in the receiver's class.
Motivation
Ruby does not have a way to communicate a method should be implemented by a subclass.
Either the method is not defined at all in the superclass, or it is implemented by throwing some kind of error.
The first alternative is not good at all because the model fails to communicate whether the message is part of the hierarchy's procotol or not, and because the method was not defined in the superclass, a NoMethodError
will be raised.
The problem with that is ambiguity: it is not clear if the object was not expected to respond to the message, or if someone forgot to implement it.
That means is the developer's job to read the class definition to clear that out, on a case-by-case basis.
The second alternative communicates better the fact that a message is part of the hierarchy's protocol by explicitly informing which method a subclass was supposed to implement, freeing the developer from doing that task manually.
The downside is that the error raising collaborations will quickly be duplicated all over the codebase (i.e. fail 'implement me'
).
The :subclass_responsibility
message addresses this issue by providing a reusable message developers can use to communicate better their intentions when designing classes.
The error raised when sent, SubclassResponsibilityError
, provides detailed information about the method that should have been implemented, the subclass responsible to do it, and whether the method should be an instance or class one.
Example: communicating subclasses are responsible to implement an instance method
class A
def m1
self.subclass_responsibility
end
end
class B < A
end
Sending the :m1
message to an instance of B
yields:
B.new.m1
ErrorHandlingProtocol::SubclassResponsibilityError: B had the responsibility to implement :m1 instance method.
Example: communicating subclasses are responsible to implement a class method
class C
def self.m2
self.subclass_responsibility
end
end
class D < C
end
Sending the :m2
message to D
yields:
D.m2
ErrorHandlingProtocol::SubclassResponsibilityError: D had the responsibility to implement :m2 class method.
Contributing
- Fork it ( http://github.com//error_handling_protocol/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request
Developed & maintained by 10 Pines