|Think about Loose Coupling|
(jeffa) Re: How do you avoid "Code Burnout"?by jeffa (Bishop)
|on Jun 30, 2003 at 22:14 UTC||Need Help??|
Just hanging around here inspires me to write all kinds of code/snippets that i would never think of otherwise. Going with Corion's advice about the Facade Pattern (brian d foy wrote an excellent Perl Review article on that pattern by the way - you should read it), here is my quick-n-dirty mini-tutorial:
Say you have a dynamic website whose content is driven by a series of methods/functions contained in some library. Currently, CGI.pm is being used to generate HTML. The library (module) might look like:
A cow-orker decides to rewrite these methods and use HTML::Template instead:
They haven't even finished, but the boss is so impressed that (s)he asks you to go ahead and substitute the new methods in. What do you do? You write another "layer" - another module that uses both libraries and delegates which library to use for a given method call. A first naive (as all my first approaches usually are) might look like:
Before i say why that is naive, here is the test script:
Go ahead and create those 4 files and make sure everything works. So why naive? Because you probably have more than 4 methods in you old library, many more. I myself am too lazy correctly type in every single method ... why not just use AUTOLOAD? (don't you wish C had one?) Much like the anonymous list i used on the last line of the test script, we could use a similar technique. Here is a revised Interface.pm:
Now all you need to do is add the name of the methods to %new as they are completed. Once Old.pm has been completely deprecated you could get rid of Interface.pm.
By this point you must be asking how all of these name changes are going to affect users ... because they are! In this example, i had the luxury of knowing ahead of time what was going to happen, so i programmed to the Interface.pm module. In reality, i would be programming to the Old.pm module instead. My recommendation is to simply rename the old library to something else, and name your Interface.pm the original old lib name. Then, when the old library has been completely deprecated (oxymoron?), rename the new library to the original old lib name.Sounds easy, but i know it really isn't. It's hard work no matter how you slice it, but if you provide a seamless way for the lib users to continue to use old methods while new ones are being implemented, then it's probably worth it (er ... whatever it is ...).
Brushing up and writing about the Facade Pattern has nothing to do with my current projects, but i somehow feel more refreshed for doing something new and "not my job" ... oh, and beating the crap outta my drums doesn't hurt either ;)
L-LL-L--L-LL-L--L-LL-L-- -R--R-RR-R--R-RR-R--R-RR B--B--B--B--B--B--B--B-- H---H---H---H---H---H--- (the triplet paradiddle with high-hat)