What is software design?
Software design is the process of analyzing software requirements in order to produce a description of the software’s internal structure that will serve as the basis for its construction.
A software design (the result) describes the architecture—how software is decomposed
and organized into components—and the interfaces between those components. It should also describe the components at a level of detail that enables their construction.
What is architectural design?
Architectural design (aka highlevel design aka top-level design) describes how software is organized into components
What is detailed design?
Detailed design describes the desired behavior of components within an architectural design.
What is a software design priciple?
Software design principles are key notions that provide the basis for many different software design approaches and concepts.
Examples:
- abstraction
- coupling and cohesion
- decomposition and modularization
- encapsulation/information hiding
- separation of interface and implementation
- sufficiency, completeness, and primitiveness
- separation of concerns
What is abstraction?
A software design principle where “a view of an object that focuses on the information relevant to a particular purpose and ignores the remainder of the information”
What is coupling? What is cohesion?
Coupling is defined as “a measure of the interdependence among modules in a computer program.”
Cohesion is defined as “a measure of the
strength of association of the elements within
a module”.
What is decomposition and modularization?
Large software is divided into a number of smaller named components having well-defined
interfaces that describe component interactions. Usually the goal is to place different functionalities and responsibilities in different components.
What is encapsulation?
Encapsulation and information hiding means
grouping and packaging the internal details
of an abstraction and making those details
inaccessible to external entities.
What is separation of interface and implementation?
Separating interface and implementation
involves defining a component by specifying a public interface (known to the clients)
that is separate from the details of how the
component is realized (see encapsulation and
information hiding).
What is sufficiency, completeness, and primitiveness?
Achieving sufficiency and completeness
means ensuring that a software component
captures all the important characteristics of
an abstraction and nothing more.
Primitiveness means the design should be based on patterns that are easy to implement.
What is separation of concerns?
Separation of concerns. A concern is an
“area of interest with respect to a software
design” [8]. A design concern is an area of
design that is relevant to one or more of its
stakeholders. Each architecture view frames
one or more concerns. Separating concerns
by views allows interested stakeholders to
focus on a few things at a time and offers a
means of managing complexity [9].
What are architectural viewpoints? Give some examples.
“A view represents a partial aspect of a software architecture that shows specific properties of a software system” [14*].
Examples:
- logical view (satisfying the functional requirements)
- process view (concurrency issues)
- physical view (distribution issues)
- development view (how the design is broken down into implementation units with explicit representation of the dependencies among the units).
What is an architectural style? Give some examples.
An architectural style is “a specialization of element and relation types, together with a set of constraints on how they can be used” [14*].
An architectural style provides the software’s high-level organization.
Major architectural styles:
* General structures (for example, layers, pipes
and filters, blackboard)
* Distributed systems (for example, clientserver, three-tiers, broker)
* Interactive systems (for example, Model-ViewController, Presentation-Abstraction-Control)
* Adaptable systems (for example, microkernel, reflection)
* Others (for example, batch, interpreters, process control, rule-based).
What are some general user interface design principles?
What are some user interaction styles?