Chapter 12 Design Phase*
*This chapter is constructed based on “Software Engineering: a Practitioner’s Approach” (chap 13, 14, 21) [Pressman, 1997]
Design: the process of applying various techniques and principles for the purpose of defining a device, a process, or a system in sufficient detail to permit its physical realization
1. Design Model
1.1 Classical Design model:
- Data design: transform the information domain model created during analysis into the data structure
- Architectural design: define the relationship among major structural elements of the program.
- Interface design: describe how the software communicates within itself, to systems that interoperate with it, and with humans who use it.
- Procedural design: transforms structural elements of the program architecture into a procedural description of software components.
1.2 Design for Object-Oriented Systems:
Subsystem? A subset of all classes collaborate among themselves to accomplish a set of cohesive responsbilities.[ Wirfs-Brock et al, 1990]
- The subsystem layer: contains a representation of each of the subsystems that enable the software to achieve its customer defined requirements and to implement the technical infrastructure that supports customer requirements.
- The class and object layer: contains the class hierarchies that enable the system to be created using generalizations and increasingly more targeted specializations. This layer also contains design representations of each object.
- The message layer: contains the details that enable each object to communicate with its collaborators. This layer establishes the external and internal interfaces for the system.
- The responsibility layer: contains the data structure and algorithmic design for all attributes for all attributes and operations for each other.
2. The Design Process
2.1 Design Quality:
- Implement all of the explicit requirements contained in the analysis model
- A readable, understandable guide for those who generate code and for those who test and subsequently maintain the software
- Provide a complete picture of the software (data, functional, behavior domains)
- Exhibit a hierarchical organization that makes intelligent use of control among elements of software
- Lead to modular: logically partitioned into elements that perform specific functions and subfunctions.
- Contain both data and procedural abstractions
- Lead to interfaces that reduce the complexity of connections between modules and with the external environment
2.2 Design Principles:
- The design process should not suffer from tunnel vision (consider alternative approaches)
- The design should be traceable to the analysis model
- The design should not reinvent the wheel
- The design should minimize the intellectual distance between software and the problems in the real world.
- The design should exhibit uniformity and integration.
2.3 Design concepts
- What criteria can be used to partition software into individual components?
- How is function or data structure detail separated from a conceptual representation of the software?
- Are there uniform criteria that define the technical quality of a software design?
Abstraction, Refinement, Modularity
- Each step in the software engineering process is a refinement in the level of abstraction of the software solution.
- Refinement causes the designer to elaborate on the solution statement, providing more and more detail as each successive refinement occurs.
- Software is divided into separately named and addressable components (modules) that are integrated to satisfy problem requirements.
How do we define an appropriate module of a given size? [Meyer, 88]
- Decomposability: decompose a large problem into subproblems that are easier to solve
- Composability: A design method enables existing design components to be assembled into a new system,
- Understandability: the easy with which a program component can be understood without reference to other.
- Continuity: the ability to make small change in a program and have these changes manifest themselves with corresponding changes in one or very few modules.
- Protection: reduce the propagation of side effects of an error.
2.4 Effective Modular Design
- Functional independence: a direct outgrowth of modularity and the concepts of abstraction and information hiding (effective modularity)
- Cohesion: a measure of the relative functional strength of a module.
- Coupling: a measure of the relative interdependence among modules
2.4.1 Design heuristics for effective modularity
- Evaluate the first iteration of the program structure to reduce coupling and improve cohesion.
- Attempt to minimize structures with high fan-out
- Keep scope of effect of a module within the scope of control of that module
- Evaluate module interfaces to reduce complexity and redundancy and improve consistency
- Define modules whose function is predictable, but avoid modules that are overly restrictive.
- Strive for controlled entry modules, avoiding pathological connections.
- Package software based on design and portability requirements.
2.5 Software Architecture
The overall structure of the software and the ways in which that structure provides conceptual integrity for a system. [Shaw and Garlan, 95] (a structure is composed of components and connectors)
- Structural properties
- Non-functional properties
- Families of related systems
2.6 Control Hierarchy
- Represents the organization of program components and implies a hierarchy of control.
- A module that controls another module is said to be superordinate to it; a module controlled by another is said to be subordinate to the controller.
- Visibility indicates the set of program components that may be invoked or used as data by a given component, even when this is accomplished indirectly.
- Connectivity indicates the set of components that are directly invoked or used as data by a given component.
2.7 Structural Partitioning
- Horizontal partitioning: separate branches of the modular hierarchy for each major program function; input/data transformation/output.
- Vertical partitioning: control and work should be distributed top-down in the program architecture (controller-at-top, worker-at-bottom)
- Benefits:
- Results in software that is easier to test
- Leads to software that is easier to maintain
- Results in propagation of fewer side effects
- Results in software that is easier to extend
2.8 Data Structure
A representation of the logical relationship among individual elements (organization, methods of access, degree of associativity, processing alternatives for information)
3. Classical Model: Design Methods
3.1 Data design
- The systematic analysis principles applied to function and behavior should also be applied to data.
- All data structures and the operations to be performed on each should be identified.
- A data dictionary should be established and used to defined both data and program design
- Low-level data design decisions should be deferred until late in the design process.
- The representation of data structures should be known only to those modules that must make direct use of the data contained within the structure.
- A library of useful data structure and the operations that may be applied to them should be developed.
- A software design and programming language should support the specification and realization of abstract data type.
3.2 Architectural design
3.2.1 Data flow-oriented design: a convenient transition from the analysis model to a design description of program structure.
Design Steps:
- The type of information flow is established
- Flow boundary are indicated
- The DFD is mapped into program structure
- Control hierarchy is defined by factoring
- A top-down distribution of controls:
- Top-level modules: decision making
- Middle-level modules: some control and moderate amounts of work
- Low-level modules: performs most input, computational, and output work.
- Mapping individual transforms of a DFD into appropriate modules within the program structure.
- The resultant structure is refined using design measures and heuristics
3.2.2 Design Postprocessing
- Processing narrative must be developed for each module
- An interface description is provided for each module
- Local and global data structures are defined
- All design restrictions/limitations are noted.
- A design review is conducted: Optimization (time, space, etc) is considered.
3.3 Interface design
- The design of interface between software modules
- The design of interface between the software and other external entities
- The design of the interface between a human and a computer
- Design model: data, architecture, interface, procedural representations
- User model: novices, knowledgeable, intermittent users, knowledgeable, frequent users
- Interface design guidelines
- General interaction
- Information display
- Data input
3.4. Procedural design
- Structured programming
- Graphical design notation
- Program design language
4. Object-Oriented Design Process
- Problem domain: the subsystems that are responsible for implementing customer requirements directly.
- Human interaction: the subsystems that implement the user interface
- Task management: the subsystems that are responsible for controlling and coordinating concurrent tasks that may be packaged within a subsystem or among different subsystems.
- Data management: the subsystem that is responsible for the storage and retrieval of objects.
- Partitioning the Analysis Model
- A well-defined interface through which all communication with the rest of the system occurs.
- With the exception of a small number of communication classes, the classes within a subsystem should collaborate only with other classes within the subsystem.
- The number of subsystems should be kept small.
- Subsystems can be partitioned internally to help reduce complexity.
- Concurrency and Subsystem Allocation
- Allocate each subsystem to an independent processor
- Allocate the subsystems to the same processor and provide concurrency support through operating system features
- The Task Management Component
- The characteristics of the task are determined
- A coordinator task and associated objects are defined
- The coordinator and other tasks are integrated (task name, description, priority, services, coordinates by, communicates via)
- The Data Management Component
- The design of the attributes and operations required to manage objects.
- The Resource Management Component
- External entities (disk drive, processor, communication channel, etc) and abstractions (database, objects)
- The Human-computer Interface Component
- Intersubsystem communication
- List each request that can be made by collaborators of the subsystems.
- For each contract, note the operations that are required to implement the responsibilities implied by the contract
- For each contract, define type, collaborator, class, operation
- A subsystem collaboration graph or table can be constructed for complex system.
4.8 Object Design Process
4.8.1 Object Descriptions
- A protocol description: establish the interface of an object by defining each message that the object can receive and the related operation that the object performs when it receives the message.
- An implementation description: show implementation details for each operation implied by a message that is passed to an object.
- A specification of the object’s name and reference to class
- Specification of private data structures with indication of data items and types
- A procedural description of each operation
- Designing algorithms and data structure
- The system design provides a specification for all operations and attributes.
- Algorithm is created to implement the specification for each operation.
- Since operations invariably manipulate the attributes of a class, the design of the data structures that best reflect the attributes will have a strong bearingon the algorithm design of the corresponding operations.
4.8.3Program components and interfaces
- An important aspect of software design quality is modularity- specification of program component (module)
- Modules are combined to form a complete program
- OO approach: defines the object as a program component that is linked to other components.
- During design, the interface that exist between objects and the overall structure of the objects must be identified (step-wised refinement)