Principles of Object-Oriented Software Development Software Engineering Perspectives

advertisement
Principles of Object-Oriented
Software Development
Software Engineering Perspectives
Software Engineering Perspectives
Introduction
Development methods
Identifying objects
Contracts
Towards a formal approach
Summary
Q/A
Literature
Software Engineering Perspectives
•
•
•
•
methods of development
the identification of objects
contracts -- refinement
validation -- a formal approach
Additional keywords and phrases: requirements, analysis,
implementation, design as transition, CRC cards,
responsibilities, heuristics, contractual obligations, validation
Development methods
Subsections:
Perspectives of modeling
Requirements engineering -- Fusion
Methods for analysis and design -- a comparative study
Methods
•
•
•
•
•
•
•
•
•
OOA/D -- incremental
[CY91b]
Objectory -- use-case analysis [Jacobs92]
OOSA -- model-driven
[Kurtz90]
OOSD -- structured
[Wasserman89]
CRC -- cards
[BC89]
RDD -- responsibility-driven
[Wirfs89]
OMT -- object modeling
[Rum91]
OOD -- development
[Booch91]
Fusion -- lifecycle
[Fusion]
Unified Modeling Language
standard notation
• class diagrams, object interaction,
packages, state and activity
UML
Structured methods
tools
•
•
•
•
•
•
•
structure chart
process specification
dataflow diagrams
hierarchy diagram
entity-relationship diagrams
data dictionary
state transition diagram
Perspectives of modeling
Modeling reality
vernacular
•
•
•
•
•
requirements -- use cases
analysis -- domain concepts
design -- system architecture
implementation -- language
support
Design model
-- system oriented
provides a justification of the architecture
Dimensions of modeling
OMT
• object model -- decomposition into objects
• dynamic model -- intra-object state changes
• functional model -- object interaction (dataflow)
Model of control
procedure-driven, event-driven, concurrent
Model criteria
formal approach
• unambiguous -- single meaning
• abstract -- no unnecessary detail
• consistent -- absence of conflict
Requirements engineering
Fusion
Analysis
Fusion
• Object Model -- concepts and relations
• LifeCycle Model -- sequences of operations
• Operation Model -- semantics of system operations
Design
data dictionary
• Object Interaction Graph -- functional
dependencies
• Visibility Graphs -- communication structure
• Class Descriptions -- attributes and methods
• Inheritance Graphs -- subtype refinement
Implementation
validation
• System Lifecycle -- state machines
• Class Descriptions -- coding, performance
Methods for analysis and design
a comparative study
Objectory
systematic process
• requirements -- use cases, domain object
model, user interface
• analysis -- subsystems
• design, implementation -- block model,
interaction diagrams
OMT
few rules for discovering inconsistencies
• analysis -- object model, dynamic model,
functional model
• design, implementation -- heuristics to
implement analysis models
Booch
descriptive
• diagrams -- class, object, timing, state,
module, process
CRC
exploratory
• analysis, design -- class, responsibilities,
collaborators
Formal methods
• operations -- pre- and post-conditions
Comparison
as a systematic approach
development
maintenance
structure
management
tool support
Objectory
OMT
+
+
++
+-
++
+++-
Booch
CRC
+
+
++-
x
+
-
Fusion
+
+
+
+
+
Identifying objects
Subsections:
Modeling heuristics
Assigning responsibilities
Object roles
Object-Oriented Design -- decomposition into objects
application/system/class oriented
Identifying objects -- responsibilities
data/procedure oriented
Layers of abstraction
components, subsystems, frameworks
Modeling heuristics
Objects -- crisp entities
object = an entity that suffers and requires actions
The method:
[1] Identify the objects and their attributes
[2] Identify operations suffered and required
[3,4] Establish visibility/interface
Heuristics
model of reality -- balance nouns (objects) and verbs (operations)
Associations
directed action -- drives, instructs
communication -- talks-to, tells, instructs
ownership -- has, part-of
resemblance -- like, is-a
others -- works-for, married-to
Candidate classes
•
•
•
•
•
•
•
•
ATM
account -- customer's account in the banks database
atm -- performs financial services for a customer
cardreader -- reads and validates a customer's card
cashdispenser -- gives cash to the customer
screen -- presents text and visual information
keypad -- the keys a customer can press
pin -- the authorization code
transaction -- performs financial services and
updates the database
Eliminating spurious classes
•
•
•
•
•
vague -- system, security-provision, record-keeping
attribute -- account-data, receipt, cash
redundant -- user
irrelevant -- cost
implementation -- transaction-log, communication
Good classes
our candidate classes
Assigning responsibilities
Object-Oriented Thinking
CRC
• Immerse the reader in the object-ness of the
material
• Give up global knowledge of control.
• Rely on the local knowledge of objects.
OO-Design with CRC cards
Class, Responsibility, Collaborators.
Banking model
ATM
Interaction classes
ATM
Object roles and interaction
• actor -- operates (suffers no operations)
• server -- suffers operations
• agent -- suffers and operates ( actor &
server)
analyze a little,
design a little,
implement a little,
test a little...
Contracts
Subsections:
Specifying contractual obligations
Refining a contract
Runtime consistency checking
Contractual obligations
pre-condition
post-condition
client
supplier
obligation
benefit
benefit
obligation
Specifying contractual obligations
Assertions
formal specification
• require -- method call pre-condition
• ensure, promise -- post-condition
• invariant -- object invariance
class account {
public:
account();
// assert( invariant() );
account
virtual float balance() { return _balance; }
void deposit(float x);
to deposit money
// require( x >= 0 );
// promise( balance() == old_balance + x && invariant() );
void withdraw(float x);
to withdraw money
// require( x <= balance() );
// promise( balance() == old_balance - x && invariant() );
bool invariant() { return balance() >= 0; }
protected:
float _balance;
};
System development
• violated pre-condition -- bug in client
• violated post-condition -- bug in supplier
A pre-condition limits the cases that
a supplier must handle!
class account {
public:
account() { _balance = 0; assert(invariant()); }
virtual float balance() { return _balance; }
account
void deposit(float x) {
require( x >= 0 );
check precondition
hold();
to save the old state
_balance += x;
promise( balance() == old_balance + x );
promise( invariant() );
}
void withdraw(float x) {
require( x <= _balance );
hold();
_balance -= x;
promise( balance() == old_balance - x );
promise( invariant() );
}
check precondition
to save the old state
virtual bool invariant() { return balance() >= 0; }
protected:
float _balance;
float old_balance;
additional variable
virtual void hold() { old_balance = _balance; }
};
Refining a contract
State responsibilities and obligations
• invariance -- respect the invariants of the base class
• methods -- services may be added or refined
Refining a method -- like improving a business contract
class C : public P {
virtual void m();
}
pre( m_C ) >= pre(m_P)
post( m_C ) <= post(m_P)
weaken pre-condition
strengthen post-condition
class credit_account : public account {
public:
credit_account(float x) { _maxcredit = x; _credit = 0; }
float balance() { return _balance + _credit; }
float credit(float x) {
require( x + _credit <= _maxcredit );
hold();
_credit += x;
promise( _credit = old_credit + x );
promise( _balance = old_balance);
promise( invariant() );
}
credit_account
void reduce(float x) {
require( 0 <= x && x <= _credit );
hold();
_credit -= x;
promise( _credit = old_credit - x );
promise( _balance = old_balance );
promise( invariant() );
}
bool invariant() {
return _credit <= _maxcredit && account::invariant();
}
protected:
float _maxcredit, _credit;
float old_credit;
void hold() { old_credit = _credit; account::hold(); }
};
Runtime consistency checking
Assertions -- side-effect free
contracts
require -- test on delivery
promise -- test during development
Object invariance -- exceptions
invariant -- verify when needed
Global properties -- requirements
interaction protocols -- formal
specification
Formal specification -- contracts
type specification -- local properties
relational specification -- structural properties, type relations
functional specification -- requirements
Verification -- as a design methodology
reasoning about program specification/code
Runtime consistency -- invariance
behavioral types specify test cases
invariants and assertions monitor consistency
Summary
1
Development methods
• Perspectives of modeling
• Requirements engineering -- Fusion
• Methods for analysis and design -- a
comparative study
2
Identifying objects
• object-oriented design -- decomposition into
objects
• object model -- objects suffer and require
• heuristics -- balance between nouns and verbs
• evaluation -- eliminating spurious classes
• class design -- class, responsibilities and
collaborations
3
Contracts
•
•
•
•
types -- as an organizing principle
contracts -- obligations and benefits
subtyping -- the substitutability requirement
partial types -- designed to have subtypes
4
Towards a formal approach
• contracts -- formal specification
• verification -- as a design methodology
• runtime consistency -- invariance
Questions
1.Describe the Fusion method. How does Fusion compare with other
methods of OO analysis and design?
2. How would you characterize the differences between functional and
object-oriented development methods?
3. Give an outline of the steps required in object-oriented design. What
heuristics can you think of for identifying objects?
4. What criteria may be used to eliminate spurious classes from an initial
object model?
5. Explain the methods of CRC cards. Give an example.
6. Explain how you may characterize the behavior of an object by means
of a contract.
7. What benefits may design by contract have for system developers?
And for users?
8. Give a detailed account of the issues that arise in refining a contract.
9. How may contracts be employed to test object behavior.
10. Discuss how a formal approach may contribute to OO software
development.
Further reading
[Fowler97] is not only a good introduction to UML, but contains
also many useful insights on the process of object-oriented
development. Additionally, [Fowler97a] may be read as a source
on analysis patterns, which are reusable elements of analysis and
design. For more information on Fusion, consult [Fusion]. As
earlier references on object-oriented methods, I recommend
[Booch94], [WWW90] and [Rum91]. Also worthwhile are
[Henderson93] and [Champeaux93]. An overview and comparative
study of design representation methods is given in [Webster].
[Meyer97] is the ultimate reference on contracts. A more
comprehensive article on design by contract is [Meyer92].
Download