Chapter 6
Designing the Modules
CSCI 3428: Software Engineering
Tami Meredith
Design
Not really any boundary between architecture and
module-level design
Generally done by senior developers
Refactoring is often done when a design becomes overly
complex
Opportunistic – both top-down (analysis) and bottomup (synthesis) is used
Tends to increase in importance with the size of the
project
Faking the Process (Parnas & Clements, 1986)
Applies to more than just design
We know that changes, unknowns, and other factors require
an iterative approach
But, if we TRY to follow a defined process:
1) It can provide guidance when we are unsure
2) It can help us get closer to a better result
3) It is easier to measure progress
Thus, even though we know we can't apply any process
perfectly, we should try our best to do so
Can use placeholders (ToDo's), Refactoring as necessary
Principles
1.
2.
3.
4.
5.
6.
Modularity
Interfaces
Information hiding
Incremental development
Abstraction
Generality
Modularity
We want to achieve Separation of Concerns
A module is any programming unit, e.g., library, package,
class, ADT, module, file
Modules should have a single, clearly defined, purpose
Measure modularity using
coupling: amount of interconnection and dependence between
modules
cohesion: amount of interconnection and dependence between
elements of a single module
Coupling
Strive for LOOSE coupling
Minimise the dependencies and interconnections between
modules
1. Uncoupled: Modules are unrelated [LEAST]
2. Data Coupling: Pass simple (primitive) data
3. Stamp Coupling: Pass complex data structures
4. Control Coupling: One module influences the behaviour
(i.e., control flow) of another
5. Common Coupling: Shared (common) data
6. Content Coupling: Module modifies another [MOST]
Cohesion
Strive for TIGHT cohesion
Want a module's components to be related and relevant to the module
Informational: Functional cohesion + data abstraction [MOST]
Functional:
1.
2.
All elements of a single behaviour are in the same module
All of the elements are essential for that behaviour
Communicational: Functions get/send/manage the same data (e.g., both
read same sensor)
Procedural: Functions show an execution sequence
Temporal: Functions execute at the same time (e.g., all the set-up code
for a program)
Logical: Use the same code differently
Coincidental: Functions not related [LEAST]
Interfaces
Defines the services offered by the module
Usually provides the definitions in terms of (type) signatures
for access functions
Try to keep as small as possible
Is the basis of the Design by Contract approach
Specification describes the externally visible properties
1.
2.
3.
4.
5.
Purpose (general description)
Preconditions (assumptions)
Protocols (usage restrictions etc.)
Postconditions (all external effects)
Quality attributes (performance etc.)
Information Hiding
Design decisions are hidden – i.e., module can be rewritten
without changing interface
Structuring using ADTs
Minimises coupling
Increases cohesion
Strive for self-containment
Incremental Development
Recursive cycles can require large amounts of code to be
produced before testing
Techniques such as sandwiching or dependency inversion can be
used to break cycles but lead to more complex design
Incremental development leads to higher programmer
morale
Aim to get a working product ASAP and keep it working as
its improved and/or extended
Gives us something we can show customer
Abstraction
We tend to break the system into a hierarchy of increasingly
detailed abstractions
Designs generally should support abstraction
Somewhat like layered architecture, but smaller scale
Generality
Try to make each module as general as possible to improve
reuse
E.g., a sort that works on any data type
Can lead to gold-plating
Helped by polymorphism
How:
Parameterise context-specific information
2. Remove preconditions
3. Simplify postconditions (simpler parts)
1.
6.3 Objects
Inheritance = implementation inheritance which need NOT
be linked to sub-type hierarchy
Polymorphism = inclusion (subtype) polymorphism which is
NOT parametric polymorphism (or ad-hoc polymorphism)
ADTs do not need objects to implement
OO Implementations are slower at runtime because of the
need for runtime type information to resolve over-riding
Can add unneeded complexity to designs
Works best for simulations
Using UML
Requirements:
1)
Use-Case diagrams, Activity diagrams
Architecture:
2)
Component diagrams, Deployment diagrams
Design:
3)
Sequence diagrams, Communication diagrams
Class, Object, & Package diagrams
Activity diagrams
State diagrams
UML in Action
Useful for formal settings
Not usually done by entry-level programmers
Generally linked to OO Implementations
Good support for some Transformational development
model
Considered a specialised type of software engineering (OO
SE)
Not as general-purpose as some advocates suggest
Did not solve the "Software Crisis"
5 Surveys
Famous Moments in Software Engineering
Robbins-Gioia (2001)
1.
Implementation of ERP (Enterprise Resource Planning) Package
232 Respondents: 36% had or were impl. ERP
51%: ERP Unsuccessful
46%: Did not think org. knew how to use it
56%: Had a program mgmt office in place (and of these 36%
considered the ERP unsuccessful)
KPMG Canada (1997)
2.
1450 Leading Public/Private Organisations (176 responses)
25 billion (CAD) spent
61% considered projects to have failed
75%+ blew schedule by 30% or more
3.
Conference Board Survey (2001)
117 Companies that attempted ERP
34% Very satisfied, 58% Somewhat satisfied, 8% Unhappy
40% Failed to achieve business goals in 1 year
For those who achieved goals, took 6 months longer than expected
25% over budget, Support costs 20% too low
4.
Chaos Report (1995)
31% of projects cancelled before they are finished
52% of projects will cost over 189% of estimate
81 billion USD spent on 80K cancelled projects (1995)
16.2% completed on time and on budget (but only 9% for large
companies)
Only 42% of the proposed features implemented (large companies)
and 74% (small companies)
48% of IT executives believe the failure rate is rising
5.
OASIG (1995)
45 Expert consultants/professors
20 years avg. experience (900 total)
14k projects considered
7 out of 10 IT projects fail in some way
Success rate < 30%