The design process involves developing a conceptual view of the system, establishing system structure, identifying data streams and data stores, decomposing high level functions into sub functions, establishing relationships and interconnections among components, developing concrete data representations, and specifying algorithmic details. Software design is a creative activity.
As with all creative processes, the system is decomposed into subsystems and more consideration is given to specific issues. Backtracking is fundamental to top-down design. In the bottom – up approach to software design, the designer first attempts to identify a set of primitive objects, actions, and relationships that will provide a basis for problem solution.
Higher-level concepts are then formulated in terms of the primitives. The bottom-up strategy requires the designer to combine features provided by the implementation language into more sophisticated entities.
Stepwise Refinement: Stepwise refinement is a top-down technique for decomposing a system from high-level specifications into more elementary levels. Stepwise refinement involves the following activities:
Decomposing design decisions to elementary levels.
1. Isolating design aspects that are not truly interdependent.
2. Postponing decisions concerning representation details as long as possible.
3. Carefully demonstrating that each successive step in the refinement process is a faithful expansion of previous steps. The major benefits of stepwise refinement as a design technique are:
Incremental addition of detail
Postponement of design decisions
4. Continual verification of consistency.
Levels of Abstraction: Levels of abstraction was originally described by Dijkstra as a bottom-up design technique. In Dijkstra’s system each level of abstraction is composed of a group of related functions, some of which are externally visible and some of which are internal to the level. Internal functions are hidden from other levels; they can only be invoked by functions on the same level. The internal functions are used to perform tasks common to the work being performed on that level of abstraction. Each level of abstraction performs a set of services for the functions on the next higher level of abstraction.
Structured Design: Structured design was developed by Constantine as a top-down technique for architectural design of software system. The basic approach in structured design is systematic conversion of data flow diagrams into structure charts. Design heuristics such as coupling and cohesion are used to guide the design process.
The first step in structured design is review and refinement of the data flow diagram developed during requirements definition and external design. The second step is to determine whether the system is transform centered or transaction-driven, and to derive a high level structure chart based on this determination.
The third step in structured design is decomposition of each subsystem using guidelines such as coupling, cohesion, information hiding, and levels of abstraction, data abstraction, and the other decomposition criteria. The primary strength of structure design is provision of a systematic method for converting data flow diagrams into top-level structure charts.
Integrated Top-Down Development: Integrated top-down development integrates design, implementation, and testing. Using integrated top-down development, design precedes top-down from the highest-level routines; they have the primary function of coordinating and sequencing the lower-level routines.
Lower-level routines may be implementation of elementary functions or they may in turn invoke more primitive routines. There is thus a hierarchical structure to a top-down system in which routines can invoke lower-level routines but cannot invoke routines on a higher level.