Chair of Software Engineering 1 Introduction to Programming Bertrand Meyer Exercise Session 13 10....
-
Upload
stella-wigg -
Category
Documents
-
view
218 -
download
0
Transcript of Chair of Software Engineering 1 Introduction to Programming Bertrand Meyer Exercise Session 13 10....
Chair of Software Engineering
1
Introduction to Programming
Bertrand Meyer
Exercise Session 13
10. November 2008
2
Chair of Software Engineering
This week
Inheritance: Deferred classes & features Redefinition, renaming Observer Pattern
Genericity Hint for Assignment
3
Chair of Software Engineering
Let's play Lego!
BRICK
LEGO_BRICK
LEGO_BRICK_WITH_HOLE LEGO_BRICK_SLANTED
Inheritance Relation
of Lego bricks
4
Chair of Software Engineering
class BRICK
deferred class
BRICK
feature -- Access
width: INTEGER
depth: INTEGER
height: INTEGER
color: COLOR
volume: INTEGER
deferred
end
end
5
Chair of Software Engineering
Class LEGO_BRICK
class LEGO_BRICK
inherit BRICK
feature -- Access
number_of_nubs: INTEGER do Result := ... end volume: INTEGER do Result := ... endend
Inherit all features of class BRICK
New feature, calculateall nubs
Implementation of`volume'
6
Chair of Software Engineering
Class LEGO_BRICK_SLANTED
Feature `volume' is going to be redefined (=changed).
`volume' comes from LEGO_BRICK
class LEGO_BRICK_SLANTED
inherit LEGO_BRICK redefine volume end
feature -- Access
volume: INTEGER do Result := ... end end
7
Chair of Software Engineering
Class LEGO_BRICK_WITH_HOLE
class LEGO_BRICK_WITH_HOLE
inherit LEGO_BRICK redefine volume end
feature -- Access
volume: INTEGER do Result := ... end end
Feature `volume' is going to be redefined (=changed).
`volume' comes from LEGO_BRICK
8
Chair of Software Engineering
Notation
volume++
Notation:
Deferred *
Effective +
Redefinition ++
BRICK
LEGO_BRICK
LEGO_BRICK_WITH_HOLE LEGO_BRICK_SLANTED
+
++
volume*
volume+
*
volume++
9
Chair of Software Engineering
Deferred & effective
Deferred Deferred classes can possess deferred features A class with at least one deferred feature must be declared
as deferred A deferred feature does not have an implementation yet Attributes can't be deferred (because they don't need a
feature body anyways) Deferred classes cannot be instantiated and hence cannot
contain a create clause
Effective Effective classes do not possess deferred features (the
“standard case”) Effective features have an implementation of their feature
body (“do .. end”)
10
Chair of Software Engineering
Precursor
If a feature was redefined, but you still wish to call the old one, use the precursor keyword
volume: INTEGER do Result := Precursor - ... end
11
Chair of Software Engineering
Types in the source code
Expressions have a static type
For attributes and functions it is denoted after the declaration ':'
name: STRING
list: LINKED_LIST [INTEGER]
A class is the static part of a program, which contains only static types
12
Chair of Software Engineering
Type of an object
The type of an object is set upon creation
local
lego: LEGO_BRICK
brick: BRICK
create {LEGO_BRICK} brick -- explicit
-- same as
--create lego; brick := lego
create lego -- implicit Objects belong to the dynamic part of a program -
>dynamic types
13
Chair of Software Engineering
Dynamic types
local
a_bag: SOME_BAG
do
create {MONEY_BAG} a_bag.put (10)
What is the static type of `a_bag'?
What's the dynamic type of the object denoted by `a_bag'?
Hands-On
SOME_BAG
MONEY_BAG
Chair of Software Engineering
The Observer Pattern
PUBLISHER*
GUI_CLASS
subscribedattachdetachtrigger
OBSERVER*
APP_CLASS
Deferred (abstract)
Effective (implemented)
*+
Inherits fromClient (uses)
update*subscribe
update+
Chair of Software Engineering
Observer pattern
Publisher keeps a list of observers:
subscribed: LINKED_LIST [OBSERVER]
To register itself, an observer may execute
subscribe (some_publisher)
where subscribe is defined in OBSERVER:
subscribe (p: PUBLISHER)-- Make current object observe p.
requirepublisher_exists: p /= Void
dop.attach (Current)
end
Chair of Software Engineering
Attaching an observer
In class PUBLISHER:
attach (s: OBSERVER)-- Register s as subscriber to current publisher.
requiresubscriber_exists: s /= Void
do
subscribed.extend (s)
end
The invariant of PUBLISHER includes the clause
subscribed /= Void
(List subscribed is created by creation procedures of PUBLISHER)
Chair of Software Engineering
trigger -- Ask all observers to -- react to current event.
do from subscribed.start until subscribed.after loop subscribed.item. subscribed.forth end
end
Each descendant of OBSERVER defines its own versionof update
Triggering an event
update
PUBLISHER*
GUI_CLASS
attachdetach
OBSERVER*
APP_CLASS
update*
update+
Chair of Software Engineering
Changing the implementation of the pattern
How would the implementation of the Observer pattern change if:
each observer subscribes not itself, but one of its routines to the publisher
when the event occurs, the publisher must call these subscribed routines with information about the event
Hands-On
Chair of Software Engineering
Exercise: a news agency
Consider you must create an application which allows a news agency to dispatch news to various papers, radio and TV stations, etc.
How would you design and implement this application?
Hands-On
Chair of Software Engineering
Genericity
But what if a certain box should only contain Lego bricks, i.e. all kinds of them (slanted, 2x4, etc.)?
classBOX [G]
featurewipe_out is
...
put (v: G) is...
end
Chair of Software Engineering
For Assignment 7
Vector Geometry
21
Chair of Software Engineering
End exercise session 15