Multi-Paradigm Design for C++ / Edition 1

Paperback (Print)
Used and New from Other Sellers
Used and New from Other Sellers
from $1.99
Usually ships in 1-2 business days
(Save 95%)
Other sellers (Paperback)
  • All (10) from $1.99   
  • New (7) from $23.96   
  • Used (3) from $1.99   
Close
Sort by
Page 1 of 1
Showing All
Note: Marketplace items are not eligible for any BN.com coupons and promotions
$23.96
Seller since 2007

Feedback rating:

(5876)

Condition:

New — never opened or used in original packaging.

Like New — packaging may have been opened. A "Like New" item is suitable to give as a gift.

Very Good — may have minor signs of wear on packaging but item works perfectly and has no damage.

Good — item is in good condition but packaging may have signs of shelf wear/aging or torn packaging. All specific defects should be noted in the Comments section associated with each item.

Acceptable — item is in working order but may show signs of wear such as scratches or torn packaging. All specific defects should be noted in the Comments section associated with each item.

Used — An item that has been opened and may show signs of wear. All specific defects should be noted in the Comments section associated with each item.

Refurbished — A used item that has been renewed or updated and verified to be in proper working condition. Not necessarily completed by the original manufacturer.

New
Brand new book. We Pack Carefully and Ship Daily!

Ships from: Miamisburg, OH

Usually ships in 1-2 business days

  • Canadian
  • International
  • Standard, 48 States
  • Standard (AK, HI)
  • Express, 48 States
  • Express (AK, HI)
$31.57
Seller since 2008

Feedback rating:

(17620)

Condition: New
Brand New, Perfect Condition, Please allow 4-14 business days for delivery. 100% Money Back Guarantee, Over 1,000,000 customers served.

Ships from: Westminster, MD

Usually ships in 1-2 business days

  • Canadian
  • International
  • Standard, 48 States
  • Standard (AK, HI)
$31.58
Seller since 2007

Feedback rating:

(23428)

Condition: New
BRAND NEW

Ships from: Avenel, NJ

Usually ships in 1-2 business days

  • Canadian
  • International
  • Standard, 48 States
  • Standard (AK, HI)
$41.82
Seller since 2009

Feedback rating:

(10347)

Condition: New
New Book. Shipped from US within 4 to 14 business days. Established seller since 2000

Ships from: Secaucus, NJ

Usually ships in 1-2 business days

  • Standard, 48 States
  • Standard (AK, HI)
Not Currently Available
$54.39
Seller since 2009

Feedback rating:

(93)

Condition: New
PAPERBACK New 0201824671 Special order direct from the distributor.

Ships from: Victoria, Canada

Usually ships in 1-2 business days

  • Canadian
  • International
  • Standard, 48 States
  • Standard (AK, HI)
  • Express, 48 States
  • Express (AK, HI)
$56.56
Seller since 2014

Feedback rating:

(3)

Condition: New
New

Ships from: Idyllwild, CA

Usually ships in 1-2 business days

  • Canadian
  • International
  • Standard, 48 States
  • Standard (AK, HI)
  • Express, 48 States
  • Express (AK, HI)
$63.00
Seller since 2010

Feedback rating:

(7)

Condition: New
10-13-98 other 1 BRAND NEW! ONLY Expedited orders are shipped with tracking number! *WE DO NOT SHIP TO PO BOX* Please allow up to 14 days delivery for order with standard ... shipping. SHIPPED FROM MULTIPLE LOCATIONS. Read more Show Less

Ships from: San Jose, CA

Usually ships in 1-2 business days

  • Canadian
  • Standard, 48 States
  • Standard (AK, HI)
  • Express, 48 States
  • Express (AK, HI)
Page 1 of 1
Showing All
Close
Sort by

Overview

C++ is a programming language that supports multiple paradigms: classes, overloaded functions, templates, modules, procedural programming, and more. Despite the language's flexibility and richness, however, there has previously been little effort to create a design method that supports the use of multiple paradigms within a single application.

This book presents a coherent framework for approaching multi-paradigm design, offering an advanced set of design practices that form the foundation for a formal multi-paradigm design method.

Multi-Paradigm Design for C++ offers insight into an analysis and design process that takes advantage of C++'s multiple paradigm capability. It uses understandable notation and readable explanations to help all C++ programmers--not just system architects and designers--combine multiple paradigms in their application development for more effective, efficient, portable, robust, and reusable software.

Readers will gain an understanding of domain engineering methods that support multi-paradigm design. This book reveals how to analyze the application domain, using principles of commonality and variation, to define subdomains according to the most appropriate paradigm for each. Multi-paradigm design digs deeper than any single technology or technique to address fundamental questions of software abstraction and design.

All of the concepts and techniques that form the groundwork for domain engineering are presented. These concepts include an in-depth look at commonality and variability analysis, how domain engineering interacts with commonly used design patterns, how to find abstractions in the application domain, and how the principles of domain engineering can be used as a basis for the abstraction techniques of the object paradigm. Most important, this book discusses how to apply analysis techniques that are the most appropriate paradigm to be implemented during the design phase.

0201824671B04062001

Read More Show Less

Editorial Reviews

Software Practitioner
May well be one of the most important books ever written in the software field... treats an extremely complex topic in an extremely complex manner.
Booknews
Presents a design method that takes advantage of the popular programming language's support for multiple paradigms, such as classes, over-loaded functions, templates, modules, and procedural programming. For system architects and designers and other readers already familiar with C++, describes an analysis and design process that allows combining multiple paradigms to develop applications that are more effective, efficient, portable, robust, and reusable. Annotation c. by Book News, Inc., Portland, Or.
Read More Show Less

Product Details

  • ISBN-13: 9780201824674
  • Publisher: Addison-Wesley
  • Publication date: 10/7/1998
  • Edition description: New Edition
  • Edition number: 1
  • Pages: 304
  • Product dimensions: 7.30 (w) x 8.90 (h) x 0.80 (d)

Meet the Author

James O. Coplien is a premier expert and writer on the object paradigm and C++, having worked with the language since its inception at AT&T. Currently a member of Bell Laboratories Research at Lucent Technologies, his work focuses on multi-paradigm development methods and organizational anthropology for software development processes. His previous books include Pattern Languages of Program Design (with Douglas C. Schmidt), Pattern Languages of Program Design, Volume 2 (with John M. Vlissides and Norman L. Kerth), and Advanced C++ Programming Styles and Idioms.

0201824671AB04062001

Read More Show Less

Read an Excerpt

I have rarely invested as much energy in any endeavor as in naming this book. As the manuscript evolved, its title evolved to emphasize one or two concepts at any given time from the set of basic elements Domain, Engineering, Multi-Paradigm, Analysis, Design, Programming, and C++. The publisher was afraid that the unfamiliar term "domain engineering" would fail to engage the target market. One of the reviewers, Tim Budd, was concerned about confusion between his use of "multi-paradigm" and the way the term is used in this book. I was concerned about using terms such as "analysis" because of my desire to put the book into the hands of everyday programmers, whose problems it strives to address. Tim Budd graciously offered that our discipline is diverse enough to accommodate a broad spectrum of definitions for "multi-paradigm," and I insisted on a title that emphasized the role of the programmer and not that of the methodologist. That led to a happy convergence on the current title, Multi-Paradigm Design for C++.

I never considered titles containing the words pattern, object, CORBA, component, or Java. Multi-paradigm design tries to dig deeper than any single technology or technique to address fundamental questions of software abstraction and design. What is a paradigm? What is the relationship between analysis, design, and implementation? These questions go to the foundations of abstraction that underlie the basic paradigms of programming.

One of the most basic questions is, what is abstraction? Abstraction is one of the key tools of software design; it is necessary for managing the immense and ever-growing complexity of computer systems. The common answer to this question usually has something to do with objects, thereby reflecting the large body of literature and tools that have emerged over the past decade or two to support object-oriented techniques. But this response ignores common design structures that programmers use every day and that are not object-oriented: templates, families of overloaded functions, modules, generic functions, and others. Such use is particularly common in the C++ community, though it is by no means unique to that community.

There are principles of abstraction common to all of these techniques. Each technique is a different way of grouping abstractions according to properties they share, including regularities in the way individual entities vary from each other. To some, commonality captures the recurring external properties of a system that are germane to its domain. To others, commonality helps regularize implicit structure that analysis uncovers in the recurring solutions for a domain. Multi-paradigm design honors both perspectives. For example, the technique called object-oriented design groups objects into classes that characterize the common structure and behaviors of those objects. It groups classes into hierarchies or graphs that reflect commonality in structure and behavior, while at the same time allowing for regular variations in structure and in the algorithms that implement a given behavior. One can describe templates using a different characterization of commonality and variation. Commonality and variation provide a broad, simple model of abstraction, broader than objects and classes and broad enough to handle most design and programming techniques.

Commonality and variation aren't new to software design models. Parnas's concept of software families Parnas1976 goes back at least two decades. Families are collections of software elements related by their commonalities, with individual family members differentiated by their variations. The design ideas that have emerged from software families have often found expression in widely accepted programming languages; good examples are modules, classes and objects, and generic constructs. The work of Lai and Weiss on environments for application-specific languages takes this idea to its limits Weiss1999. The so-called analysis activities that focus on the discovery of software families and the so-called coding activities that focus on how to express these abstractions have always been closely intertwined. Multi-paradigm design explicitly recognizes the close tie between language, design, and domain structure and the way they express commonality and variation.

We discover software families in an activity called domain analysis, which is another field with a long history Neighbors1980. Software reuse was the original goal of domain analysis, and this goal fits nicely with software families. Multi-paradigm design explicitly focuses on issues that are important for reuse. To help the designer think about adapting software to a spectrum of anticipated markets, multi-paradigm design explicitly separates commonalities—assumptions that don't change—from variabilities—assumptions that do change. We strive for domain analysis, not just analysis. We design families of abstractions, not just abstractions. Done well, this approach to design leads in the long term to easier maintenance (if we predict the variabilities well) and to a more resilient architecture (we don't have to dig up the foundations every time we make a change). Of course, multi-paradigm development is just one tool that helps support the technical end of reuse. Effective reuse can happen only in the larger context of organizational issues, marketing issues, and software economics.

We use these foundations of commonality and variation to formalize the concept of paradigm. A paradigm, as the term is popularly used in contemporary software design, is a way of organizing system abstractions around properties of commonality and variation. The object paradigm organizes systems around abstractions based on commonality in structure and behavior and variation in structure and algorithm. The template paradigm is based on structural commonality across family members, with variations explicitly factored out into template parameters. Overloaded functions form families whose members share the same name and semantics, and in which each family member is differentiated by its formal parameter types.

C++ is a programming language that supports multiple paradigms: classes, overloaded functions, templates, modules, ordinary procedural programming, and others. Bjarne Stroustrup, the creator of C++, intended it that way. Most programmers use the C++ features that go beyond objects (though some abuse them to excess and others force designs into an object-oriented mold when they should be using more natural expressions of design provided by other language features). The powerful template code of John Barton and Lee Nackman Barton1994 is perhaps the height of tasteful multi-paradigm design.

Even though Stroustrup designated C++ as a multi-paradigm language, there have been no serious attempts to create a design method suited to the richness of C++ features. And though C++ provides a particularly rich and crisp example of multi-paradigm programming, the opportunity for multi-paradigm development generalizes to other programming languages. There is a gap between the current design literature and the intended use of C++ features that is reflected in current practice. This book bridges that gap, using simple notations and vocabulary to help developers combine multiple paradigms instructively.

During a lecture I gave at DePaul University in September 1995, the department chair, Dr. Helmut Epp, suggested the term meta-design for this work because its first concern is to identify design techniques suitable to the domain for which software is being developed. That is a useful perspective on the approach taken in this book and in fact describes how most developers approach design. One must first decide what paradigms to use; then one can apply the rules and tools of each paradigm for the system partitions well-suited to their use. This concern is the domain not only of the system architect and designer, but also of the everyday programmer.

Deciding what paradigm to use is one matter; having tools to express the abstractions of a given paradigm is another. We can analyze the application domain using principles of commonality and variation to divide it into subdomains, each of which may be suitable for design under a specific paradigm. This partitioning occurs during a development phase commonly called analysis. However, it is better thought of as an early phase of design because it tries to create abstractions that the implementation technology can express. Not all implementation tools (programming languages and other tools such as application generators) can express all paradigms. For this reason, it's important to do a domain analysis not only of the application domain, but also of the solution domain. Multi-paradigm design makes this an explicit activity. Solution domain analysis is another facet of the "meta-design" nature of multi-paradigm design.

There are many things this book is not. It is not a comprehensive design method, software development life cycle model, or turn-the-crank approach to design. Most good new designs are variants of old designs that have worked; it's rare that we face completely new or unique software problems. It would be inappropriate and a waste of time to apply the notations and techniques of this book to every module in a new system. But we should be armed to face new problems when they arise so that we can discover the structure in them and carry that understanding into design and implementation. Furthermore, the notations and techniques of multi-paradigm design provide a uniform way to document designs that augment object-oriented techniques with other paradigms.

Multi-paradigm design is a craft that is neither fully an art nor fully a rigorous discipline. This book presents notations, diagrams, and design models to support the developer's thought process. As is true with all such formalisms, there is always the temptation to get caught up in them for their own sake. Multi-paradigm design is a collection of activities that produce an architecture, and architecture is about relationships between pieces. But architecture is also about utility and aesthetics—properties of good software that elude most methods. Good taste has a key place here, and I don't intend the techniques to fuel automated design or coding. Good taste comes in part from experience and in part from good insight. For that reason, this isn't an entry-level book, either. Readers should have a year or two of experience using C++ doing object-oriented (at least) programming in a substantial system.

Used with common sense, these techniques complement good human judgment and experience. If you find that by applying these techniques, you arrive at a design you neither like nor understand, then don't use the design. The techniques are a tool, not a mandate. But all readers should take one thing away from this book: The object paradigm, or any other paradigm, is just one set of useful paradigms, and design must express structures more broadly than any single paradigm can.

The Book's Organization

Each chapter builds on the ones before it to build new concepts and increase the reader's understanding of domain engineering and multi-paradigm techniques. Most readers will read chapters sequentially and return to specific chapters as reference material.

Chapter 1 through 7 are the foundational chapters that lay the groundwork for domain engineering.

  • Chapter 1 introduces vocabulary, motivates the need for multi-paradigm design, and lays high-level foundations for domain engineering.
  • Chapter 2 and Chapter 3 cover commonality and variability analysis, respectively. The two concepts are used together in application, but each is presented in its own right both for simplicity of presentation and to emphasize its language subtleties. Chapter 3 introduces the central concepts of positive and negative variability, themes that are important to clean designs and to understanding how domain engineering interacts with commonly used design patterns.
  • Chapter 4 explains how to use domain analysis to find abstractions in the application domain; it builds on the techniques of the preceding chapters.
  • Chapter 5 demonstrates how the principles of domain engineering can be used as a basis for the abstraction techniques of the object paradigm.
  • Chapter 6 is an important chapter, both because it applies "analysis" techniques in an unconventional way—to characterize the solution domain—and because it places C++ constructs in a formal framework that form the basis of commonality and variability analysis.
  • Chapter 7 ties together all of the preceding chapters into a coherent framework for thinking about design. It introduces a taxonomy of design problems that have varying degrees of structural complexity. It also presents a high-level set of activities that guide good design and that could be the basis for a method based on domain engineering and multi-paradigm design techniques. The chapter deals with the simple case in which each domain can be developed largely independently of others in a single paradigm.
  • Chapter 8 goes a step further, investigating structurally complex designs in which simple divide-and-conquer techniques don't prevail. It presents examples of such recursive, structurally complex designs and presents heuristics for "breaking the recursion."
  • Chapter 9 is an addendum that shows the relationship between popular design patterns and domain engineering. The parallels will surprise many readers, and provide new insights into both patterns and domain engineering, as well as the relationship between them. Though the chapter isn't central to understanding domain engineering, it is crucial to understanding contemporary design practices that incorporate patterns together with objects and other paradigms, with or without domain engineering.

Class diagrams in the book follow the Unified Modeling Language (UML) notation Fowler+1997.

Acknowledgments

Many thanks to all of those who, through their dialogues, comments, and feedback, improved the quality of the manuscript. Just van den Broecke, Frank Buschmann, Paul Chisholm, Russell Corfman, David Cuka, Cay Horstman, Andrew Klein, Andrew Koenig, Stan Lippman, Tom Lyons, Lee Nackman, Brett Schuchert, Larry Schutte, Herb Sutter, Steve Vinoski, and David Weiss all provided review comments at many levels, from the highest level of conceptual murkiness to the smallest C++ detail. I appreciate them very much for their efforts. I also want to thank my tireless and patient editor, Debbie Lafferty, who also worked with me on my first book. She has been a true joy to work with. Special thanks also go to Jacquelyn Young, my production editor; to Laura Michaels, the book's copy editor; and to Kim Arney, the book's compositor. Discussions with Lalita Jagadeesan inspired me to create useful examples. A special thanks to Tom Stone, the acquisition editor, for his early advice to me and his early enthusiasm about this book inside Addison-Wesley. A special thanks to Andrew Klein for help with the UML diagrams. And last, a special thanks to my Bell Labs management and colleagues, especially to David Weiss, for sharing their work with me and providing support and encouragement.

0201824671P04062001

Read More Show Less

Table of Contents

Preface.

1. Introduction: The Need for Multiple Paradigms.

Domain Engineering and Multiple Paradigms.

Design, Analysis, Domains, and Families: Term Definitions.

Beyond Objects.

Commonality and Variability Analysis.

Software Families.

Multi-Paradigm Design.

Multi-Paradigm Development and Programming Language.

Commonality Analysis: Other Perspectives.

Summary.

2. Commonality Analysis.

Commonality: The Essence of Abstraction.

Priming Analysis: The Domain Vocabulary.

Dimensions of Commonality and Commonality Categories.

Examples of Commonality.

Reviewing the Commonality Analysis.

Commonality and Evolution.

Summary.

3. Variability Analysis.

Variability: The Spice of Life.

The Commonality Base.

Positive and Negative Variability.

The Domain and Range of Variability.

Binding Time.

Defaults.

Variability Tables.

Some Variability Traps.

Reviewing the Variability Analysis.

Variability Dependency Graphs.

Summary.

4. Application Domain Analysis.

Analysis, Domain Analysis, and Beyond.

Subdomains within a Domain Analysis.

The Structure of a Subdomain.

Analysis: The Big Picture.

Summary.

5. Object-Oriented Analysis.

About Paradigms and Objects.

Object-Oriented Commonality Analysis.

Summary.

6. Solution Domain Analysis.

The "Other" Domain.

The C++ Solution Domain: An Overview.

Data.

Overloading.

Class Templates.

Function Templates.

Inheritance.

Virtual Functions.

Commonality Analysis and Polymorphism.

Preprocessor Directives.

Negative Variability.

A Summary of the C++ Solution Domain: A Family Table.

7. Simple Mixing of Paradigms.

Putting It All Together: An Overview of Multi-Paradigm Design.

Activities of Multi-Paradigm Design.

Example: A Simple Language Translator.

Design, Not Analysis.

Another Example: Automatic Differentiation.

Outboard Paradigms.

Management Issues.

Summary.

8. Weaving Paradigms Together.

Method and Design.

Commonality Analysis: What Dimension of Commonality?

Multiple Paradigms: Multiple Dimensions of Variability in One Set of Commonalities

Codependent Domains.

Design and Structure.

Another Example: A Finite-State Machine.

Pattern-Based Solution Strategies.

Summary.

9. Augmenting the Solution Domain with Patterns.

The Value of Idioms and Patterns.

Commonality and Variability in Common Patterns.

Patterns of Negative Variability.

Multi-Paradigm Tools as a Patterns Adjunct.

Summary.

References.

Index. 0201824671T04062001

Read More Show Less

Preface

I have rarely invested as much energy in any endeavor as in naming this book. As the manuscript evolved, its title evolved to emphasize one or two concepts at any given time from the set of basic elements Domain, Engineering, Multi-Paradigm, Analysis, Design, Programming, and C++. The publisher was afraid that the unfamiliar term "domain engineering" would fail to engage the target market. One of the reviewers, Tim Budd, was concerned about confusion between his use of "multi-paradigm" and the way the term is used in this book. I was concerned about using terms such as "analysis" because of my desire to put the book into the hands of everyday programmers, whose problems it strives to address. Tim Budd graciously offered that our discipline is diverse enough to accommodate a broad spectrum of definitions for "multi-paradigm," and I insisted on a title that emphasized the role of the programmer and not that of the methodologist. That led to a happy convergence on the current title, Multi-Paradigm Design for C++.

I never considered titles containing the words pattern, object, CORBA, component, or Java. Multi-paradigm design tries to dig deeper than any single technology or technique to address fundamental questions of software abstraction and design. What is a paradigm? What is the relationship between analysis, design, and implementation? These questions go to the foundations of abstraction that underlie the basic paradigms of programming.

One of the most basic questions is, what is abstraction? Abstraction is one of the key tools of software design; it is necessary for managing the immense and ever-growing complexity of computer systems. The common answer to this question usually has something to do with objects, thereby reflecting the large body of literature and tools that have emerged over the past decade or two to support object-oriented techniques. But this response ignores common design structures that programmers use every day and that are not object-oriented: templates, families of overloaded functions, modules, generic functions, and others. Such use is particularly common in the C++ community, though it is by no means unique to that community.

There are principles of abstraction common to all of these techniques. Each technique is a different way of grouping abstractions according to properties they share, including regularities in the way individual entities vary from each other. To some, commonality captures the recurring external properties of a system that are germane to its domain. To others, commonality helps regularize implicit structure that analysis uncovers in the recurring solutions for a domain. Multi-paradigm design honors both perspectives. For example, the technique called object-oriented design groups objects into classes that characterize the common structure and behaviors of those objects. It groups classes into hierarchies or graphs that reflect commonality in structure and behavior, while at the same time allowing for regular variations in structure and in the algorithms that implement a given behavior. One can describe templates using a different characterization of commonality and variation. Commonality and variation provide a broad, simple model of abstraction, broader than objects and classes and broad enough to handle most design and programming techniques.

Commonality and variation aren't new to software design models. Parnas's concept of software families Parnas1976 goes back at least two decades. Families are collections of software elements related by their commonalities, with individual family members differentiated by their variations. The design ideas that have emerged from software families have often found expression in widely accepted programming languages; good examples are modules, classes and objects, and generic constructs. The work of Lai and Weiss on environments for application-specific languages takes this idea to its limits Weiss1999. The so-called analysis activities that focus on the discovery of software families and the so-called coding activities that focus on how to express these abstractions have always been closely intertwined. Multi-paradigm design explicitly recognizes the close tie between language, design, and domain structure and the way they express commonality and variation.

We discover software families in an activity called domain analysis, which is another field with a long history Neighbors1980. Software reuse was the original goal of domain analysis, and this goal fits nicely with software families. Multi-paradigm design explicitly focuses on issues that are important for reuse. To help the designer think about adapting software to a spectrum of anticipated markets, multi-paradigm design explicitly separates commonalities--assumptions that don't change--from variabilities--assumptions that do change. We strive for domain analysis, not just analysis. We design families of abstractions, not just abstractions. Done well, this approach to design leads in the long term to easier maintenance (if we predict the variabilities well) and to a more resilient architecture (we don't have to dig up the foundations every time we make a change). Of course, multi-paradigm development is just one tool that helps support the technical end of reuse. Effective reuse can happen only in the larger context of organizational issues, marketing issues, and software economics.

We use these foundations of commonality and variation to formalize the concept of paradigm. A paradigm, as the term is popularly used in contemporary software design, is a way of organizing system abstractions around properties of commonality and variation. The object paradigm organizes systems around abstractions based on commonality in structure and behavior and variation in structure and algorithm. The template paradigm is based on structural commonality across family members, with variations explicitly factored out into template parameters. Overloaded functions form families whose members share the same name and semantics, and in which each family member is differentiated by its formal parameter types.

C++ is a programming language that supports multiple paradigms: classes, overloaded functions, templates, modules, ordinary procedural programming, and others. Bjarne Stroustrup, the creator of C++, intended it that way. Most programmers use the C++ features that go beyond objects (though some abuse them to excess and others force designs into an object-oriented mold when they should be using more natural expressions of design provided by other language features). The powerful template code of John Barton and Lee Nackman Barton1994 is perhaps the height of tasteful multi-paradigm design.

Even though Stroustrup designated C++ as a multi-paradigm language, there have been no serious attempts to create a design method suited to the richness of C++ features. And though C++ provides a particularly rich and crisp example of multi-paradigm programming, the opportunity for multi-paradigm development generalizes to other programming languages. There is a gap between the current design literature and the intended use of C++ features that is reflected in current practice. This book bridges that gap, using simple notations and vocabulary to help developers combine multiple paradigms instructively.

During a lecture I gave at DePaul University in September 1995, the department chair, Dr. Helmut Epp, suggested the term meta-design for this work because its first concern is to identify design techniques suitable to the domain for which software is being developed. That is a useful perspective on the approach taken in this book and in fact describes how most developers approach design. One must first decide what paradigms to use; then one can apply the rules and tools of each paradigm for the system partitions well-suited to their use. This concern is the domain not only of the system architect and designer, but also of the everyday programmer.

Deciding what paradigm to use is one matter; having tools to express the abstractions of a given paradigm is another. We can analyze the application domain using principles of commonality and variation to divide it into subdomains, each of which may be suitable for design under a specific paradigm. This partitioning occurs during a development phase commonly called analysis. However, it is better thought of as an early phase of design because it tries to create abstractions that the implementation technology can express. Not all implementation tools (programming languages and other tools such as application generators) can express all paradigms. For this reason, it's important to do a domain analysis not only of the application domain, but also of the solution domain. Multi-paradigm design makes this an explicit activity. Solution domain analysis is another facet of the "meta-design" nature of multi-paradigm design.

There are many things this book is not. It is not a comprehensive design method, software development life cycle model, or turn-the-crank approach to design. Most good new designs are variants of old designs that have worked; it's rare that we face completely new or unique software problems. It would be inappropriate and a waste of time to apply the notations and techniques of this book to every module in a new system. But we should be armed to face new problems when they arise so that we can discover the structure in them and carry that understanding into design and implementation. Furthermore, the notations and techniques of multi-paradigm design provide a uniform way to document designs that augment object-oriented techniques with other paradigms.

Multi-paradigm design is a craft that is neither fully an art nor fully a rigorous discipline. This book presents notations, diagrams, and design models to support the developer's thought process. As is true with all such formalisms, there is always the temptation to get caught up in them for their own sake. Multi-paradigm design is a collection of activities that produce an architecture, and architecture is about relationships between pieces. But architecture is also about utility and aesthetics--properties of good software that elude most methods. Good taste has a key place here, and I don't intend the techniques to fuel automated design or coding. Good taste comes in part from experience and in part from good insight. For that reason, this isn't an entry-level book, either. Readers should have a year or two of experience using C++ doing object-oriented (at least) programming in a substantial system.

Used with common sense, these techniques complement good human judgment and experience. If you find that by applying these techniques, you arrive at a design you neither like nor understand, then don't use the design. The techniques are a tool, not a mandate. But all readers should take one thing away from this book: The object paradigm, or any other paradigm, is just one set of useful paradigms, and design must express structures more broadly than any single paradigm can.

The Book's Organization

Each chapter builds on the ones before it to build new concepts and increase the reader's understanding of domain engineering and multi-paradigm techniques. Most readers will read chapters sequentially and return to specific chapters as reference material.

Chapter 1 through 7 are the foundational chapters that lay the groundwork for domain engineering.

  • Chapter 1 introduces vocabulary, motivates the need for multi-paradigm design, and lays high-level foundations for domain engineering.
  • Chapter 2 and Chapter 3 cover commonality and variability analysis, respectively. The two concepts are used together in application, but each is presented in its own right both for simplicity of presentation and to emphasize its language subtleties. Chapter 3 introduces the central concepts of positive and negative variability, themes that are important to clean designs and to understanding how domain engineering interacts with commonly used design patterns.
  • Chapter 4 explains how to use domain analysis to find abstractions in the application domain; it builds on the techniques of the preceding chapters.
  • Chapter 5 demonstrates how the principles of domain engineering can be used as a basis for the abstraction techniques of the object paradigm.
  • Chapter 6 is an important chapter, both because it applies "analysis" techniques in an unconventional way--to characterize the solution domain--and because it places C++ constructs in a formal framework that form the basis of commonality and variability analysis.
  • Chapter 7 ties together all of the preceding chapters into a coherent framework for thinking about design. It introduces a taxonomy of design problems that have varying degrees of structural complexity. It also presents a high-level set of activities that guide good design and that could be the basis for a method based on domain engineering and multi-paradigm design techniques. The chapter deals with the simple case in which each domain can be developed largely independently of others in a single paradigm.
  • Chapter 8 goes a step further, investigating structurally complex designs in which simple divide-and-conquer techniques don't prevail. It presents examples of such recursive, structurally complex designs and presents heuristics for "breaking the recursion."
  • Chapter 9 is an addendum that shows the relationship between popular design patterns and domain engineering. The parallels will surprise many readers, and provide new insights into both patterns and domain engineering, as well as the relationship between them. Though the chapter isn't central to understanding domain engineering, it is crucial to understanding contemporary design practices that incorporate patterns together with objects and other paradigms, with or without domain engineering.

Class diagrams in the book follow the Unified Modeling Language (UML) notation Fowler+1997.

Acknowledgments

Many thanks to all of those who, through their dialogues, comments, and feedback, improved the quality of the manuscript. Just van den Broecke, Frank Buschmann, Paul Chisholm, Russell Corfman, David Cuka, Cay Horstman, Andrew Klein, Andrew Koenig, Stan Lippman, Tom Lyons, Lee Nackman, Brett Schuchert, Larry Schutte, Herb Sutter, Steve Vinoski, and David Weiss all provided review comments at many levels, from the highest level of conceptual murkiness to the smallest C++ detail. I appreciate them very much for their efforts. I also want to thank my tireless and patient editor, Debbie Lafferty, who also worked with me on my first book. She has been a true joy to work with. Special thanks also go to Jacquelyn Young, my production editor; to Laura Michaels, the book's copy editor; and to Kim Arney, the book's compositor. Discussions with Lalita Jagadeesan inspired me to create useful examples. A special thanks to Tom Stone, the acquisition editor, for his early advice to me and his early enthusiasm about this book inside Addison-Wesley. A special thanks to Andrew Klein for help with the UML diagrams. And last, a special thanks to my Bell Labs management and colleagues, especially to David Weiss, for sharing their work with me and providing support and encouragement.

0201824671P04062001

Read More Show Less

Customer Reviews

Be the first to write a review
( 0 )
Rating Distribution

5 Star

(0)

4 Star

(0)

3 Star

(0)

2 Star

(0)

1 Star

(0)

Your Rating:

Your Name: Create a Pen Name or

Barnes & Noble.com Review Rules

Our reader reviews allow you to share your comments on titles you liked, or didn't, with others. By submitting an online review, you are representing to Barnes & Noble.com that all information contained in your review is original and accurate in all respects, and that the submission of such content by you and the posting of such content by Barnes & Noble.com does not and will not violate the rights of any third party. Please follow the rules below to help ensure that your review can be posted.

Reviews by Our Customers Under the Age of 13

We highly value and respect everyone's opinion concerning the titles we offer. However, we cannot allow persons under the age of 13 to have accounts at BN.com or to post customer reviews. Please see our Terms of Use for more details.

What to exclude from your review:

Please do not write about reviews, commentary, or information posted on the product page. If you see any errors in the information on the product page, please send us an email.

Reviews should not contain any of the following:

  • - HTML tags, profanity, obscenities, vulgarities, or comments that defame anyone
  • - Time-sensitive information such as tour dates, signings, lectures, etc.
  • - Single-word reviews. Other people will read your review to discover why you liked or didn't like the title. Be descriptive.
  • - Comments focusing on the author or that may ruin the ending for others
  • - Phone numbers, addresses, URLs
  • - Pricing and availability information or alternative ordering information
  • - Advertisements or commercial solicitation

Reminder:

  • - By submitting a review, you grant to Barnes & Noble.com and its sublicensees the royalty-free, perpetual, irrevocable right and license to use the review in accordance with the Barnes & Noble.com Terms of Use.
  • - Barnes & Noble.com reserves the right not to post any review -- particularly those that do not follow the terms and conditions of these Rules. Barnes & Noble.com also reserves the right to remove any review at any time without notice.
  • - See Terms of Use for other conditions and disclaimers.
Search for Products You'd Like to Recommend

Recommend other products that relate to your review. Just search for them below and share!

Create a Pen Name

Your Pen Name is your unique identity on BN.com. It will appear on the reviews you write and other website activities. Your Pen Name cannot be edited, changed or deleted once submitted.

 
Your Pen Name can be any combination of alphanumeric characters (plus - and _), and must be at least two characters long.

Continue Anonymously

    If you find inappropriate content, please report it to Barnes & Noble
    Why is this product inappropriate?
    Comments (optional)