Designing Software  «Prev  Next»
Lesson 1

Introduction to Designing Software with Design Patterns

You have now explored five patterns in depth and looked at capsule summaries of quite a few more. This module discusses some general issues that arise in using patterns to develop software.
In this module, you will learn:
  1. How to choose the right pattern for the job
  2. How to modify documented patterns to fit your problem
  3. How to combine design patterns
  4. The pitfalls and limitations of patterns

Software design is the process by which an agent creates a specification of a software artifact, intended to accomplish goals, using a set of primitive components and subject to constraints. Software design may refer to either
  1. "all the activities involved in conceptualizing, framing, implementing, commissioning, and ultimately modifying complex systems" or
  2. "the activity following requirements specification and before programming, as in the style of a software engineering process."
Software design usually involves problem solving and planning a software solution. This includes both low-level component and algorithm design as well as high-level, architecture design.

The Goal of Patterns

Cost, customer satisfaction, productivity, and development interval reduction are among the holy grails of software development. Patterns contribute indirectly to many of these goals:
  1. Productivity. By providing domain expertise, patterns short-circuit the discovery interval for many important design structures.
    " Discovery" includes the activities of a designer to find out how the current system works as a basis for maintenance changes.
    More importantly, patterns avoid rework that comes from inexpert design decisions. As an example, programmers who do not understand idioms like the Counted Body Idiom either will spend a long time converging on the solution, or will employ solutions that are less maintainable or just plain wrong.
  2. Development Interval. Many software patterns are a form of design-level reuse. Patterns can reduce the amount of time required to build solution structures because they allow designers to use design chunks that are larger than functions or objects.
    Patterns also provide road maps to the structure of existing systems, making it easier for the inexpert designer to understand and navigate existing software. This can reduce discovery costs. Our studies suggest that as much as half of software development effort can be attributed to discovery.
  3. Cost. Cost reduction follows in a straightforward way from development interval reduction.
  4. Customer Satisfaction. Customer satisfaction is largely a result of the other factors.