On Oct 11, 2011, at 11:33 AM, John Napiorkowski wrote: > ----- Original Message ----- >> From: Steve <st...@matsch.com> >> To: Stevan Little <stevan.lit...@iinteractive.com> >> Cc: Moose ML <moose@perl.org>; John Napiorkowski <jjn1...@yahoo.com> >> Sent: Tuesday, October 11, 2011 11:19 AM >> Subject: Re: OO Design Principles/Patterns >> >> John and Stevan, >> >> Thank you both for your comments. This is pretty heady stuff for >> someone who went to college to get a business degree :) > > I have degrees in Philosophy, English and Performance Studies, so join the > Club! :)
No degree and barely 1.5 yrs towards a Fine Arts Painting BFA here, that whole CS thing is overrated :P >> I will definitely take a look at all the resources referenced, and offer >> one more that I stumbled across after my initial message: >> http://www.bryanesmith.com/documents/a2pm/design-patterns-03-16-2011.pdf. >> It is from a presentation given at a PM meeting in Ann Arbor, MI. >> Interestingly, of the five patterns described using Moose, (Singleton, >> Decorator, Adapter, Proxy, and Composite) there was no mention about the >> applicability of the pattern when using perl. That said, I do agree >> that some don't appear to be particularly relevant to our language of >> choice! >> >> Thanks again, >> Steve >> On 10/11/2011 10:01 AM, Stevan Little wrote: >>> On Oct 11, 2011, at 9:02 AM, John Napiorkowski wrote: >>>>> From: Steve<st...@matsch.com> >>>>> To: "moose@perl.org"<moose@perl.org> >>>>> Sent: Tuesday, October 11, 2011 8:50 AM >>>>> Subject: OO Design Principles/Patterns >>>>> >>>>> As someone who arrived somewhat late to the OO game, I have take >> every opportunity to learn some of the principles of OO design and use. I >> have >> been using Moose for a couple of years, primarily in the context of Catalyst >> and >> HTML::FormHandler. Lately though, I am studying the book 'Design Patterns - >> Elements of Reusable Object-Oriented Software', which comes highly >> recommended in OO land. >>>>> >>>>> I am wondering if anyone in the Moose community is: 1) aware of the >> book, 2) used the patterns with Moose, and 3) has taken time to write about >> implementing some of the patterns with Moose. >>>>> >>>>> The only thing I've seen referenced is how Moose >> 'almost' can be used to create an abstract class with roles. This might >> be good subject matter for a book on Moose! >>>>> >>>>> Steve >>>>> >>>> Dear Steve, >>>> >>>> I sorta started a project like this once, but got lazy and never got >> past https://metacpan.org/release/Patterns-ChainOfResponsibility (not sure >> if >> that is the most awesome example of the CoR pattern either) >>>> >>>> I think the thing was I started to think that those patterns, while >> interesting, are not universally applicable to all languages and styles. >> For >> example, a lot of the patterns seem to be to be how to make flexible code >> when >> you are using a statically compiled languages. As a result I figured it >> would >> be better to wait a few years and see just exactly how people use Moose to >> good >> effect. Perhaps the community is starting to approach that critical >> knowledge, >> although I doubt I have it! >>>> >>>> I guess even so, having such a thing would not be a bad exercise, and >> serve as a good bit of advocacy as well as help form a bridge for >> programmers >> coming from other languages. >>>> >>>> John >>> John, >>> >>> Actually, in the original book, several of the patterns were written in >> Smalltalk, which is a very dynamic language. However it is also an insanely >> strict OO-only language, so some things had to be invented in there. >>> >>> Steve, >>> >>> Mark Dominus has a great talk on this subject here ( >> http://perl.plover.com/yak/design/ ) I highly suggest you give it a read, it >> is >> pretty short but gets some good points across. >>> >>> In general the Perl community (and many of the other dynamic language >> communities) have decided that many of the original Gang of Four design >> patterns, while nice examples of OO design, are not >> relevant/necessary/useful as >> much when you are not writing in C++/C#/Java or Smalltalk. And in fact some >> people think (myself included) that several of the patterns exist due to >> (what >> we perceive as) deficiencies in the languages themselves ( >> http://en.wikipedia.org/wiki/Design_pattern_(computer_science)#Criticism ). >>> >>> For instance, the simplest and most often cited/used/abused pattern is the >> Iterator pattern. This is common in the Java standard libraries, is core to >> the >> language of C# and basically in Perl is written as: >>> >>> foreach my $item (@items) { ... } >>> >>> or >>> >>> map { ... } @items; >>> >>> Other commonly (ab)used patterns include >>> >>> - Singleton, which is really just a global variable by a different name in >> an attempt to make it acceptable (It also is a way to get around the lack of >> globals in Smalltalk if I recall correctly). >>> >>> - Abstract Factory, which is not terribly necessary in a language like Perl >> where you can simply do: >>> >>> my $classname = "Some::" . $thing; >>> my $instance = $classname->new; >>> >>> - Decorator, actually I think Plack::Middleware is a great example of >> Decorator in action, and it barely uses any OO to do it, just >> anon-subroutines >> wrapping one another. >>> >>> - Interpreter, if I wanted to be a jerk, I could just say "eval", >> but that misses the point in some ways. However, the idea you should >> implement a >> complete language is really not acceptable in most situations either. >>> >>> - Memento, this is really just using Storable, it says "Without >> violating encapsulation" which Storable probably does, but at the >> interpreter level so while it might be cheating, its deep low level cheating >> :) >>> >>> - Lazy Initialization, this is built right into Moose >>> >>> Now, that said, other patterns are actually very useful and knowing the >> details of them and how others have written them will help you write them >> better. A short list of those would be: >>> >>> - Factory Method >>> - Builder (which to some degree is just Dependency Injection) >>> - Adapter >>> - Facade >>> - Command >>> - Observer >>> - Template method/Strategy >>> - Visitor >>> >>> Others are just ill advised in my opinion, like: >>> >>> - State (changing behavior of a class based on internal state seems >> confusing to me) >>> - Singleton (which I mentioned above) >>> >>> But in the end, it is important to recognize that Pattern != Library, these >> are not meant to be implemented and then be used from a library, they are >> guidelines to help you compose your larger OO design together using >> techniques >> which have already been vetted and assigned names and terminology. This >> gives >> you a common language that other people can more easily understand and get >> up to >> speed with. >>> >>> I have a quote from Christopher Alexander (the originator of Design >> Patterns (the architectural ones which the GoF took the idea from)), which >> is: >>> >>> "Each pattern describes a problem which occurs over and over again in >> our environment, and then describes the core of the solution to that >> problem, in >> such a way that you can use this solution a million times over, without ever >> doing it the same way twice." >>> >>> I think this really captures the heart of design patterns and illustrates >> what so many people missed which was: "use this solution a million times >> over, without ever doing it the same way twice". >>> >>> And now it is time for my morning conference call, just made it :) >>> >>> - Stevan >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>