SOFTWARE DESIGN
What is? It’s a meaningful engineering representation of something that is to be built. There are four major concerns for design. They are Data, architecture, interface and components.
Who does it? Software engineers design computer-based systems, but skills required at each level of design work are different. Data and architectural level focus is on patterns. Interface is on human resource and component on programming approach.
Why is it important? For a blueprint. What are steps? Design begins with requirement model with four steps. The data structure, system architecture, interface representation and the component level.
What the work product ? The concerns. How I ensure that I have done it right? Reviewed at each steps for clarity, correctness, completeness and consistency.
Software Design is the first of three technical activities Software Design and Software Engineering Software Design is the first of three technical activities Design Code generation Test.
Design Levels Data Architecture Interface Components
Data Design Data design transforms the information domain model created during analysis into the data structure that will be required to implement the Software. Data objects and relationships are designed in this through E-R diagrams.
Architectural Design Defines the relationship between major structural elements of the software, the design patterns that can be used to achieve the requirements that have been defined for the system and the constrains that affect the way in which architectural design patterns can be applied. It is the framework of the computer-based system.
Interface Design Describes how the software communications within itself and with human who use it. Interface implements a flow of information and specific type of behavior. Data and control flow diagrams provide much of the information required for interface design.
Component level Design Transforms structural level of the software architecture into a procedural description of software components. During the design we make decisions that will ultimately affect the success of software construction and the case with which software can be maintained.
Design Guidelines In order to evaluate the quality of a design the criteria for a good design should be established. Such a design should: exhibit good architectural structure be modular contain distinct representations of data, architecture, interfaces, and components (modules) lead to data structures that are appropriate for the objects to be implemented and be drawn from recognizable design patterns
lead to components that exhibit independent functional characteristics lead to interfaces that reduce the complexity of connections between modules and with the external environment be derived using a reputable method that is driven by information obtained during software requirements analysis These criteria are not achieved by chance. The software design process encourages good design through the application of fundamental design principles, systematic methodology and through review.
Basic principles of Software Design 1) The design process should not suffer from tunnel vision. 2) The design should be traceable to the analysis model. 3) The design should not reinvent the wheel.
5) The design should exhibit uniformity and integration. 4) The design should minimize the intellectual distance between software and the problem, as it exists in the real world. 5) The design should exhibit uniformity and integration. 6) The design should be structured to accommodate change. 7) The design should be structured to degrade gently, even when aberrant data, events, or operating conditions are encountered.
8) The design is not coding , coding is not design. 9) The design should be assessed for quality as it is being created or not after the fact 10) The design should be reviewed to minimize conceptual (semantic) errors.
Fundamental Design Concepts Abstraction - allows designers to focus on solving a problem without being concerned about irrelevant lower level details A procedural abstraction is a named sequence of instructions that has a specific and limited function. A data abstraction is a named collection of data that describes a data object. The control abstraction implies a program control mechanism without specifying internal details.
Refinement - process of elaboration where the designer provides successively more detail for each design component. It is a top-down design strategy. A program is developed by successively refining levels of procedural detail. A hierarchy is developed by decomposing a macroscopic statement of function in a stepwise fashion until programming language statements are reached Abstraction and refinement are complementary concepts. Abstraction enables a designer to specify procedure and data. Refinement helps the designer to reveal low-level details as design progress.
Modularity - the degree to which software can be understood by examining its components independently of one another. Software is divided into separately named and addressable components called modules, that are integrated to satisfy problem requirements. The criteria for evaluating a design method with respect to its ability to define an effective modular system are Modular Decomposition Modular Composition Modular Understandability Modular Continuity Modular Protection
Software architecture - overall structure of the software components and the ways in which that structure provides conceptual integrity for a system. It is the hierarchical structure of program components, the manner in which these components interact and the structure of data that are used by the components. The basic properties that should be specified as part of architectural design are Structural Properties Extra-functional properties Families of related systems.
Control hierarchy or program structure - represents the module organization and implies a control hierarchy, but does not represent the procedural aspects of the software Different notations are used to represent control hierarchy for those architectural styles that are amenable to this representation. The most common is the tree like hierarchy. The control hierarchy also represent visibility (a set of program components that may be invoked by a given component) and connectivity (a set of components that are directly invoked by a given component).
Structural partitioning - horizontal partitioning defines three partitions (input, data transformations, and output); vertical partitioning (factoring) distributes control in a top-down manner (control decisions in top level modules and processing work in the lower level modules) In horizontal partitioning the control modules are used to co-ordinate communication between and execution of the functions. Partitioning this way provides the following benefits: i. Results in software that is easier to test and maintain ii. Results in fewer propagation side-effects iii. Results in software that is easier to extend This is because the major functions are ‘decoupled’ from each other. One disadvantage is that more data has to be passed across module interfaces. This can server to complicate the overall control flow of the program especially if processing requires rapid movement from one function to another.
In vertical partitioning the control (decision making) modules are located at the top, and work is distributed top-down in the program structure. That is, top level functions perform control functions and do little actual processing, while modules that are low in the structure perform all input, computation and output tasks. As changes to programs usually revolves around one of these three tasks there is less likelihood that changes made to the lower modules will propagate (upwards) making this partitioning strategy more maintainable. Note however, that changes to control modules will have a higher probability of propagating side-effects
Data structure - representation of the logical relationship among individual data elements (requires at least as much attention as algorithm design) Software procedure - precise specification of processing (event sequences, decision points, repetitive operations, data organization/structure) Information hiding - information (data and procedure) contained within a module is inaccessible to modules that have no need for such information
Effective Modular Design Modularity becomes an accepted approach in all engineering disciplines. A modular design reduces complexity, facilitate change and results in easier implementation by encouraging parallel development. Functional independence is achieved by developing modules with “single-mined” function and an “aversion” to excessive interaction with other modules. Functional independence is a key to good design and design is the key to software quality
Independence is measured using two criteria: Cohesion and Coupling. Cohesion - qualitative indication of the degree to which a module focuses on just one thing. Measure of the closeness of relationship between components Coupling - qualitative indication of the degree to which a module is connected to other modules and to the outside world. Indication of the strength of interconnections between the components