----- 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! :)

> 
> 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
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>

Reply via email to