Design Concepts
Design Concepts
Introduction: Software design encompasses the set of principles, concepts, and practices that
lead to the development of a high-quality system or product. Design principles establish an
overriding philosophy that guides you in the design work you must perform. Design is pivotal to
successful software engineering
The goal of design is to produce a model or representation that exhibits firmness,
commodity, and delight Software design changes continually as new methods, better analysis,
and broader understanding evolve
DESIGN WITHIN THE CONTEXT OF SOFTWARE ENGINEERING
Software design sits at the technical kernel of software engineering and is applied
regardless of the software process model that is used. Beginning once software requirements
have been analyzed and modeled, software design is the last software engineering action within
the modeling activity and sets the stage for construction (code generation and testing).
Each of the elements of the requirements model provides information that is necessary to
create the four design models required for a complete specification of design. The flow of
information during software design is illustrated in following figure.
The requirements model, manifested by scenario-based, class-based, flow-oriented,
and behavioral elements, feed the design task.
The data/class design transforms class models into design class realizations and the
requisite data structures required to implement the software.
The architectural design defines the relationship between major structural elements of
the software, the architectural styles and design patterns that can be used to achieve the
requirements defined for the system, and the constraints that affect the way in which architecture
can be implemented. The architectural design representation—the framework of a computer-
based system—is derived from the requirements model.
The interface design describes how the software communicates with systems that
interoperate with it, and with humans who use it. An interface implies a flow of information
(e.g., data and/or control) and a specific type of behavior. Therefore, usage scenarios and
behavioral models provide much of the information required for interface design.
The component-level design transforms structural elements of the software architecture
into a procedural description of software components. Information obtained from the class-based
models, flow models, and behavioral models serve as the basis for component design.
The importance of software design can be stated with a single word—quality. Design is
the place where quality is fostered in software engineering. Design provides you with
representations of software that can be assessed for quality. Design is the only way that you can
accurately translate stakeholder’s requirements into a finished software product or system.
Software design serves as the foundation for all the software engineering and software support
activities that follow.
THE DESIGN PROCESS
Software design is an iterative process through which requirements are translated into a
“blueprint” for constructing the software. Initially, the blueprint depicts a holistic view of
software. That is, the design is represented at a high level of abstraction
Software Quality Guidelines and Attributes
McGlaughlin suggests three characteristics that serve as a guide for the evaluation of a good
design:
• The design must implement all of the explicit requirements contained in the
requirements model, and it must accommodate all of the implicit requirements desired by
stakeholders.
• The design must be a readable, understandable guide for those who generate code and
for those who test and subsequently support the software.
• The design should provide a complete picture of the software, addressing the data,
functional, and behavioral domains from an implementation perspective.
Quality Guidelines. In order to evaluate the quality of a design representation, consider the
following guidelines:
1. A design should exhibit an architecture that (1) has been created using recognizable
architectural styles or patterns, (2) is composed of components that exhibit good design
characteristics and (3) can be implemented in an evolutionary fashion,2 thereby
facilitating implementation and testing.
2. A design should be modular; that is, the software should be logically partitioned into
elements or subsystems.
3. A design should contain distinct representations of data, architecture, interfaces, and
components.
4. A design should lead to data structures that are appropriate for the classes to be
implemented and are drawn from recognizable data patterns.
5. A design should lead to components that exhibit independent functional characteristics.
6. A design should lead to interfaces that reduce the complexity of connections between
components and with the external environment.
7. A design should be derived using a repeatable method that is driven by information
obtained during software requirements analysis.
8. A design should be represented using a notation that effectively communicates its
meaning.
Quality Attributes. Hewlett-Packard developed a set of software quality attributes that has been
given the acronym FURPS—functionality, usability, reliability, performance, and
supportability. The FURPS quality attributes represent a target for all software design:
• Functionality is assessed by evaluating the feature set and capabilities of the program,
the generality of the functions that are delivered, and the security of the overall system..
• Usability is assessed by considering human factors, overall aesthetics, consistency, and
documentation.
• Reliability is evaluated by measuring the frequency and severity of failure, the accuracy
of output results, the mean-time-to-failure (MTTF), the ability to recover from failure,
and the predictability of the program.
• Performance is measured by considering processing speed, response time, resource
consumption, throughput, and efficiency.
• Supportability combines the ability to extend the program (extensibility), adaptability,
serviceability—these three attributes represent a more common term, maintainability—
and in addition, testability, compatibility, configurability, the ease with which a system
can be installed, and the ease with which problems can be localized.
The Evolution of Software Design
The evolution of software design is a continuing process that has now spanned almost six
decades. Early design work concentrated on criteria for the development of modular programs
and methods for refining software structures in a top down manner. Procedural aspects of design
definition evolved into a philosophy called structured programming.
A number of design methods, growing out of the work just noted, are being applied
throughout the industry. All of these methods have a number of common characteristics: (1) a
mechanism for the translation of the requirements model into a design representation, (2) a
notation for representing functional components and their interfaces, (3) heuristics for refinement
and partitioning, and (4) guidelines for quality assessment.
DESIGN CONCEPTS
A set of fundamental software design concepts has evolved over the history of software
engineering. Each provides the software designer with a foundation from which more
sophisticated design methods can be applied. Each helps you answer the following questions:
• 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?
• What uniform criteria define the technical quality of a software design?
The following brief overview of important software design concepts that span both traditional
and object-oriented software development.
Abstraction
Abstraction is the act of representing essential features without including the background
details or explanations. the abstraction is used to reduce complexity and allow efficient design
and implementation of complex software systems. Many levels of abstraction can be posed. At
the highest level of abstraction, a solution is stated in broad terms using the language of the
problem environment. At lower levels of abstraction, a more detailed description of the solution
is provided.
As different levels of abstraction are developed, you work to create both procedural and
data abstractions.
A procedural abstraction refers to a sequence of instructions that have a specific and
limited function. The name of a procedural abstraction implies these functions, but specific
details are suppressed.
A data abstraction is a named collection of data that describes a data object.
Architecture
Software architecture alludes to “the overall structure of the software and the ways in
which that structure provides conceptual integrity for a system” Architecture is the structure or
organization of program components (modules), the manner in which these components interact,
and the structure of data that are used by the components.
Shaw and Garlan describe a set of properties that should be specified as part of an architectural
design:
Structural properties. This aspect of the architectural design representation defines the
components of a system (e.g., modules, objects, filters) and the manner in which those
components are packaged and interact with one another.
Extra-functional properties. The architectural design description should address how
the design architecture achieves requirements for performance, capacity, reliability,
security, adaptability, and other system characteristics.
Families of related systems. The architectural design should draw upon repeatable
patterns that are commonly encountered in the design of families of similar systems. In
essence, the design should have the ability to reuse architectural building blocks.
The architectural design can be represented using one or more of a number of different models.
Structural models: Represent architecture as an organized collection of program components.
Framework models: Increase the level of design abstraction by attempting to identify repeatable
architectural design frameworks that are encountered in similar types of applications.
Dynamic models : Address the behavioral aspects of the program architecture, indicating how
the structure or system configuration may change as a function of external events.
Process models :Focus on the design of the business or technical process that the system must
accommodate.
Functional models can be used to represent the functional hierarchy of a system.
A number of different architectural description languages (ADLs) have been developed
to represent these models.
Patterns
Brad Appleton defines a design pattern in the following manner: “A pattern conveys the
essence of a proven solution to a recurring problem within a certain context amidst competing
concerns”
A design pattern describes a design structure that solves a particular design problem
within a specific context and amid “forces” that may have an impact on the manner in which the
pattern is applied and used.
The intent of each design pattern is to provide a description that enables a designer to
determine (1) whether the pattern is applicable to the current work, (2) whether the pattern can
be reused (hence, saving design time), and (3) whether the pattern can serve as a guide for
developing a similar, but functionally or structurally different pattern.
Separation of Concerns
Separation of concerns is a design concept that suggests that any complex problem can
be more easily handled if it is subdivided into pieces that can each be solved and/or optimized
independently. A concern is a feature or behavior that is specified as part of the requirements
model for the software.
By separating concerns into smaller, and therefore more manageable pieces, a problem
takes less effort and time to solve.
Modularity
Modularity is the most common manifestation of separation of concerns. Software is
divided into separately named and addressable components, sometimes called module.
Modularity is the single attribute of software that allows a program to be intellectually
manageable
The design model can be viewed in two different dimensions. The process dimension
indicates the evolution of the design model as design tasks are executed as part of the software
process. The abstraction dimension represents the level of detail as each element of the analysis
model is transformed into a design equivalent and then refined iteratively. The design model has
four major elements: data, architecture, components, and interface.