Hack #49. Make Your Objects Truly Polymorphic
Build classes based on what they do, not how they inherit.
Many tutorials and books declare confidently that inheritance is a central feature of object-oriented programming.
They're wrong.
Polymorphism is much, much more important. It matters that when you call log( ) on an object that knows how to log its internal state it does so, not that it inherits from some abstract Logger class somewhere or that it calculates a natural log. Perl 6 encourages this type of design with roles. In Perl 5, you can either build it yourself or use
Class::Trait to decompose complex operations into natural, named groups of methods.
That sounds awfully abstract—but if you have a complex problem you can decompose appropriately, you can write just a little bit of code and accomplish quite a bit.
The Hack
Imagine that you're building an application with properly abstracted model, view, and controller. You have multiple output types—standard XHTML, cut-down-XHTML for mobile devices, and Ajax or JSON output for RESTful web services and user interface goodness.
Every possible view has a corresponding view class. So far the design makes sense. Yet as your code handles an incoming request and decides what to do with it, how do you decide which view to use? Worse, if you have multiple views, how do you build the appropriate classes without going crazy for all of the combinations?
If you cheat a little bit and declare your views as traits, you can apply them to the model ...