29
Mixins are inheritance
Inheritance is getting a bad rap and rightfully so in my opinion. Inheritance has turned out to be a specialist tool for specific situations and was unfortunately overused. Long story short, try composition before inheritance.
Now, that said, I have come across developers who understand the above and yet still fall unwittingly into the trap of inheritance over-use. This happens because they think mixins are composition, but mixins are actually Ruby's answer to multiple inheritance. Don't believe me?
Here is an example of classic inheritance:
class Superclass; def talk; "world"; end; end
class Subclass < Superclass; def talk; "hello #{super}"; end; end
Now here is an example usage and a look under the hood.
puts Subclass.new.talk
#> hello world
puts Subclass.ancestors.inspect
#> [Subclass, Superclass, Object, PP::ObjectMixin, Kernel, BasicObject]
Now, here is the same code using mixins. Note that the method signature is identical.
module Superclass; def talk; "world"; end; end
class Subclass; include Superclass; def talk; "hello #{super}"; end
And again, a usage and a look under the hood. Note that they are identical to the classic inheritance implementation.
puts Subclass.new.talk
#> hello world
puts Subclass.ancestors.inspect
#> [Subclass, Superclass, Object, PP::ObjectMixin, Kernel, BasicObject]
To sum up, mixins are going to run into most of the problems you would get with inheritance because they are a type of inheritance.
29