I'm not sure what you're referring to, but Pree's distinction always left me with an empty feeling. I've just shepherded a paper about classifying design patterns using Pree's distinction, but I think it only met with very limited success.
I think that there are many, many more issues involved in a Taxonomy of Patterns and Pattern Languages than Pree's work. The issues involved are usually completely orthogonal to "fixed" vs "changing".
For instance, some of the axes are:
Are the patterns in this language Architectural, Design or Coding Patterns (Idioms)? Are the patterns general purpose, or do they apply only to a specific domain? Are they patterns about people (Organizational patterns), software, or something else?
If you want a really tough problem, try to come up with a good taxonomy that can handle all of the patterns in the first two PLoP books. The editors made a Herculean effort to shoehorn them into topics in each volume, but it's much more interesting to try and figure out how they fit together across volumes.
I think what we'll end up with is a multi-dimensional net. Sort of like the WikiWikiWeb!
-- KyleBrown
Second, I believe that we can capture the essence only of non-generative patterns using commonality analysis. If it can be regularized in terms of what is stable and what changes, then the design principle is subject to a more general paradigm, and more general principles of formulating abstractions. I rail a bit about this in "A Professional Dilemma" (the dilemma between patterns and paradigms) in the CppReport 8(3), March 1996, 80-89.
Alexander makes clear the major principles of a PatternLanguageTaxonomy, which he calls "large patterns include smaller patterns." It is a refinement hierarchy (well, a DAG actually, which is why the WikiWikiWeb is such a cool way to capture it). Note that it is not a containment hierarchy: the smaller patterns don't necessarily work on the same artifacts scoped by the larger patterns they elaborate. Nor is "refinement" the same as "specialization" in the subtyping sense: you can't substitute a small pattern to do the job of a larger one. While it's hard for me to describe here, the concept is intuitive from the PatternLanguage book.
In practice, I find that the following rules guide a PatternLanguageTaxonomy:
-- JimCoplien
By selecting non-subjective factors in analysing design patterns, we can better see how and WHY certain design patterns are related. Then we examine these patterns and see how they work in different contexts [an oxymoron, under current definition of DP].
From this analysis, we can empirically determine causal factors just like any of the physical sciences. Why certain patterns work in some contexts and not in other contexts, leads us to the basic principles. Once we know these principles, we can predict new patterns. Robert Martin's recent list in CppReport lists several of these principles, some of which have roots that go back to Constantine and DeMarco.
-- ARickAnderson
I think that ARick missed the point on generalization here. I don't think that suppressing differences for the sake of finding commonality is necessarily the right approach. I've never seen things work from "grand principles" down. Instead, I've found that when looking for ways to group patterns (e.g. writing a language, which I think is more helpful in every way than a dry taxonomy) you look for "clusters" first. Clusters are small groups that work together based on composition (these fit together in this way) rather than inheritance (these are alike because they all do X).
Contrary to ARick's contention, people do NOT learn to talk by working from general to specific. My two-year old is constantly confusing specifics for generals. It's not "drink", it's "Juice" or "Milk", regardless of what is actually on the table. Generalization is something that is learned much later.
To see a better illustration of the dangers of generalizing and looking for false analogies, look at GeologicTaxonomy.
-- KyleBrown
I (more or less) agree with Kyle's take on this, and when organizing patterns into languages I've looked for clusters of related patterns, and then organized the clusters into some sort of superstructure - I call these clusters PatternLanguageFragments, because they should eventually come together to form a pattern language.
To build clusters, I think about three RelationshipsBetweenPatterns: PatternUses, what Cope calls refinement, where one pattern "plugs in to" another pattern; PatternSpecializes, which is like inheritance (which I originally called refinement, but that's confusing), and PatternConflicts, where two patterns present different solutions to similar problems.
Trying to manage any more than about twenty patterns is *hard*. More on my attempts is at http://www.mri.mq.edu.au/~kjx/drafts.html#classify.
-- JamesNoble
This page mirrored in WikiPagesAboutWhatArePatterns as of April 29, 2006