|     | Software Design Patterns,   What's that ? |   In "Understanding  and Using Patterns in Software Development", Dirk Riehle and Heinz  Zullighoven give a nice definition of the term "pattern" which is very  broadly applicable:   A pattern is the abstraction from  a concrete form which keeps recurring in specific non-arbitrary contexts.  The above authors point out that, within the  software patterns community, the notion of a pattern is "geared toward  solving problems in design." More specifically, the concrete form which  recurs is that of a solution to a recurring problem. But a pattern is more  than just a battle-proven solution to a recurring problem. The problem  occurs within a certain context, and in the presence of numerous competing  concerns. The proposed solution involves some kind of structure which balances  these concerns, or "forces", in the manner most appropriate for the given  context. Using the pattern form, the description of the solution tries  to capture the essential insight which it embodies, so that others may  learn from it, and make use of it in similar situations. The pattern is  also given a name, which serves as a conceptual handle, to facilitate discussing  the pattern and the jewel of information it represents. So a definition  which more closely reflects its use within the patterns community is: A pattern is a named nugget of instructive  information that captures the essential structure and insight of a successful  family of proven solutions to a recurring problem that arises within a  certain context and system of forces.A slightly more compact definition which might  be easier to remember is: A pattern is a named nugget of insight  that conveys the essence of a proven solution to a recurring problem within  a certain context amidst competing concerns.Patterns are usually concerned with some kind  of architecture or organization of constituent parts to produce a greater  whole. Richard Gabriel, author of  Patterns  of Software: Tales From the Software Community, provides a clear  and concise definition of the term pattern in the Patterns  Definitions section of the  Patterns  Home Page: Each pattern is a three-part rule,  which expresses a relation between a certain context, a certain system  of forces which occurs repeatedly in that context, and a certain software  configuration which allows these forces to resolve themselves.As Gabriel explains, Alexander describes it a  bit more colorfully in  [TTWoB]: Each pattern is a three-part rule,  which expresses a relation between a certain context, a problem, and a  solution.  In Software  Patterns, esteemed "patternite"  Jim  Coplien writes:As an element in the world, each pattern  is a relationship between a certain context, a certain system of forces  which occurs repeatedly in that context, and a certain spatial configuration  which allows these forces to resolve themselves.
 As an element of language, a pattern is an  instruction, which shows how this spatial configuration can be used, over  and over again, to resolve the given system of forces, wherever the context  makes it relevant.
 The pattern is, in short, at the same time  a thing, which happens in the world, and the rule which tells us how to  create that thing, and when we must create it. It is both a process and  a thing; both a description of a thing which is alive, and a description  of the process which will generate that thing (p. 247). I like to relate this definition  to dress patterns. I could tell you how to make a dress by specifying the  route of a scissors through a piece of cloth in terms of angles and lengths  of cut. Or, I could give you a pattern. Reading the specification, you  would have no idea what was being built or if you had built the right thing  when you were finished. The pattern foreshadows the product: it is the  rule for making the thing, but it is also, in many respects, the thing  itself.So we see that a pattern involves a general description  of a recurring solution to a recurring problem replete with various goals  and constraints. But a pattern does more than just identify a solution,  it also explains why the solution is needed! Patterns for software development are one  of the latest "hot topics" to emerge from the object-oriented community.  They are a literary form of software engineering problem-solving discipline  that has its roots in a design movement of the same name in contemporary  architecture, literate programming, and the documentation of best practices  and lessons learned in all vocations.  Fundamental to any science or engineering  discipline is a common vocabulary for expressing its concepts, and a language  for relating them together. The goal of patterns within the software community  is to create a body of literature to help software developers resolve recurring  problems encountered throughout all of software development. Patterns help  create a shared language for communicating insight and experience about  these problems and their solutions. Formally codifying these solutions  and their relationships lets us successfully capture the body of knowledge  which defines our understanding of good architectures that meet the needs  of their users. Forming a common pattern language for conveying the structures  and mechanisms of our architectures allows us to intelligibly reason about  them. The primary focus is not so much on technology as it is on creating  a culture to document and support sound engineering architecture and design.
 
 |