Escape from the Spaghetti Code Jungle

Download Report

Transcript Escape from the Spaghetti Code Jungle

A Smalltalk Patterns Safari
Brian Foote
The Refactory, Inc.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 1
Why Patterns?
What’s New Here is that Nothing is New
Here
• Patterns are about what works
• Patterns give us a way to talk about
what works
• Patterns distill experience
• Patterns give us a pithy design
vocabulary
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 2
Alexander on Patterns
Patterns in solutions come from patterns in problems.
"A pattern is a solution to a problem in a context."
"Each pattern describes a problem which occurs over
and over again in our environment, and then
describes the core of the solution to that problem, in
such a way that you can use this solution a million
times over, without ever doing it the same way twice."
Christopher Alexander -- A Pattern Language
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 3
Why Patterns in the Wild?
•
•
•
•
•
Learn where to look
Learn how to spot ‘em and recognize ‘em
See how they evolve
Appreciate their history, and our history
Understand their ecosystem and
interdependence
• Helps us discern and discover new ones
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 4
The Gang of Four:
The Essential Field Guide
Design Patterns: Elements of
Reusable Object-Oriented
Software
Erich Gamma, Richard Helm, Ralph
Johnson, and John Vlissides
Addison Wesley, 1995
A landmark book that changed the way
programmers think about building
object-oriented programs
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 5
Dr. Johnson, I presume?
Great explorers, like Livingstone and Johnson
neither necessarily create nor invent, nor, do
they even always “discover”
Often, their greatest skill is communication...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 6
Your Guide
• Over Twenty Years in the Bush...
• Stalking Smalltalk since ‘81… or ‘85…
Patterns?
• An long-time associate of Dr. Johnson...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 7
Field Guides (cont.)
The Design Patterns Smalltalk Companion
Alpert, Brown, and Woolf
Addison Wesley, 1998
Pattern-Oriented Software Architecture
Buschmann, Meunier, Rohnert, Sommerlad, and Stahl
Wiley, 1996
The Pattern Languages of Program Design Series
Volumes 1-4
Addison Wesley, 1995-2000
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 8
VisualWorks*
The Image: A Virtual Veldt
The Cradle of Object-Oriented
Architecture
An Olduvai Gorge Teeming with Patterns
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 9
Creational patterns
GoF Design
Patterns
•
Abstract Factory
•
Builder
•
Factory Method
•
Prototype
•
Singleton
Structural patterns
•
Adapter
•
Bridge
•
Composite
•
Decorator
•
Facade
•
Flyweight
•
Proxy
7/20/2015 (C) Brian Foote 1999
Behavioral Patterns
•
Chain of Responsibility
•
Command
•
Interpreter
•
Iterator
•
Mediator
•
Memento
•
Observer
•
State
•
Strategy
•
Template Method
•
Visitor
Smalltalk Patterns Safari
Slide -- 10
The Big Five
•
•
•
•
•
Lion
Leopard
Elephant
Buffalo
Rhino
7/20/2015 (C) Brian Foote 1999
•
•
•
•
•
Composite
Proxy
Strategy
Observer
Visitor
Smalltalk Patterns Safari
Slide -- 11
Objects within Objects
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 12
Composite
Context:
• Developing OO software
Problem:
• Complex part-whole hierarchy has lots of similar classes.
– Example: document, chapter, section, paragraph.
Forces
• • simplicity -- treat composition of parts like a part
• • power -- create new kind of part by composing existing ones
• • safety -- no special cases, treat everything the same
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 13
Composite
Idea: make abstract "component" class.
Alternative 1: every component has a
(possibly empty) set of components.
Component
Children
Chapter
...
Paragraph
Problem: many components have no components
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 14
Composite
Component
Container
Children
Leaf
Composite
Composite and Component have the exact same interface.
• interface for enumerating children
• Component implements Children() by returning empty set
• interface for adding/removing children?
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 15
Composite Pattern
Component
Container
Children
Leaf
Composite
Composite and Component have the exact same interface.
• interface for enumerating children
• Component implements Children() by returning empty set
• interface for adding/removing children?
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 16
Two Design Alternatives
Component does not know what it is a part of.
Component can be in many composite.
Component can be accessed only through
composite.
Component knows what it is a part of.
Component can be in only one
composite.
Component can be accessed directly.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 17
Component Knows its Composite
Rules when component knows its single
composite.
• A is a part of B if and only if B is the
composite of A.
Duplicating information is dangerous!
Problem: how to ensure that pointers from
components to composite and composite to
components are consistent.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 18
Ensuring Consistency
The public operations on components and composites are:
• • Composite can enumerate components.
• • Component knows its container.
• • Add/remove a component to/from the composite.
The operation to add a component to a composite updates
the container of the component. There should be no
other way to change the container of a component.
Smalltalk does not enforce private methods.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 19
Example: Equipment
Equipment
weight
cost
FloppyDisk
...
CompositeEq.
weight
| total |
total := 0.
self childrenDo: [:each | total := total + each weight].
^total
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 20
VisualComponent>>add:
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 21
Composite Pattern in VisualWorks
VisualComponent
Children
ComposedText
ListView
VisualPart
Container
CompositePart
Most operations in CompositePart simply
iterate over the children and repeat the
operation on them.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 22
CompositePart
addComponent: aVisualComponent
self isOpen
ifTrue: [ ... ]
ifFalse: [components addLast: aVisualComponent.
–
aVisualComponent container: self]
displayOn: aGraphicsContext
"Display each of the receiver's components."
| clipBox |
clipBox := aGraphicsContext clippingBounds.
components do:
[:component |
(component intersects: clipBox)
ifTrue: [component displayOn: aGraphicsContext copy]]
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 23
Summary of Composite
Composite is a kind of Component
Permits arbitrary hierarchies
Add/remove Component from Composite
Operations on Composite iterate over
Components
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 24
Template Method
As plentiful as
sawgrass...
Often associated with
scavengers
e.g. printOn: aString
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 25
Factory Method
Plentiful in the image...
• View defaultControllerClass
• UILookPolicy
• XxxClass methods
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 26
Abstract Factory
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 27
Builder
ClassBuilder
UI Builders
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 28
Prototype
This isn’t Self, after all...
• VisualWorks TextAttributes
• Look for copy
• Thinglab, Morphic...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 29
Singleton
•
•
•
•
All the Metaclasses...
ProcessScheduler
SourceFileManager
true, false, nil
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 30
Strategy
• Sundry Policies...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 31
Observer Pattern
Intent: Define a one-to-many dependency between objects so
that when one object changes state, all its dependents are
notified and updated automatically.
Subject
observer/dependent Observer
Update
AddDependent
RemoveDependent
Changed
RectangleFigure
7/20/2015 (C) Brian Foote 1999
endPoint
LineFigure
Update
Smalltalk Patterns Safari
Slide -- 32
Iterator
Provide a way to access the elements of an aggregate
object sequentially without exposing its underlying
implementation.
Iterator
Aggregate
CreateIterator()
ConcreteAggregate
CreateIterator()
7/20/2015 (C) Brian Foote 1999
First()
Next()
IsDone()
CurrentItem()
ConcreteIterator
Smalltalk Patterns Safari
Slide -- 33
Iterator in Smalltalk
1) Internal iterator - iterate inside the Iterator
• easy to use, not as powerful as external iterator
• works well because of blocks
employees do: [:each | each name printOn: aStream]
2) Combine Next() and CurrentItem() (Smalltalk Stream)
employeeStream := GeneralMotors employeeStream.
[employeeStream atEnd]
whileFalse:
[employeeStream next name printOn: aStream]
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 34
Proxy
• Provide a surrogate or placeholder for another object to
control access to it
– represent an object in a remote address space
– create expensive objects on demand
– check access rights
• Proxy has same interface as “real subject”, and forwards
operations to it
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 35
Proxy
Subject
Client
request
...
realSubject
RealSubject
Proxy
request
request
realSubject request
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 36
Proxy
Remote proxy - first package arguments, then make remote
procedure call.
Virtual proxy - compute objects, then forward request.
Protection proxy - check access rights, then forward request.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 37
Creating an Orphan
nil subclass: #Future
instanceVariableNames: ‘semaphore '
classVariableNames: ‘ '
poolDictionaries: ' '
category: ‘Reflection-Examples’
In VisualWorks, ClassBuilder does the rest. Default
implementations of doesNotUnderstand: and class are
provided.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 38
Locating Orphans
allBehaviorsDo: aBlock
"Evaluate the argument, aBlock, for each kind of Behavior in the
system (that is, Object and its subclasses,
plus other classes that have no superclass)."
Class rootsOfTheWorld do:
[:cls |
aBlock value: cls.
cls allSubclassesDo: aBlock]
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 39
Terminology and Taxonomy
Is this a
Wildebeest?
A Gnu?
Class: Mammalia
Order: Artiodactyla
Family: Bovidae
Genus species:
Connochaetes (flowing beard)
taurinus (like a bull)
albojubatus (white mane)
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 40
Decorator
Object ()
VisualComponent ()
VisualPart ()
Wrapper ()
GeometricWrapper ()
FillingWrapper ()
StrokingWrapper ()
GraphicsAttributesWrapper ()
PassivityWrapper ('controlActive')
ReversingWrapper ()
StrikeOutWrapper ()
ScalingWrapper ()
TranslatingWrapper ()
LayoutWrapper ()
BoundedWrapper ()
BorderedWrapper ()
MenuBarWrapper ()
BoundingWrapper ()
ScrollWrapper ()
DataSetScrollWrapper ()
SlaveScrollWrapper ()
WidgetStateWrapper ()
WidgetWrapper ()
SpecWrapper ()
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 41
Adaptor
• Aspect Adaptor
• Pluggable Adaptor
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 42
Flyweight
• Character
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 43
Chain of Responsibility
• VisualPart
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 44
Command
• MenuItem
Blocks are often used instead in Smalltalk, so this
pattern is not as common in its pure form in this
environment...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 45
Interpreter
• The WindowSpec Walker
Though it’s not clear how to classify this…
The simulator?
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 46
Observer
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 47
Parse Tree
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 48
Visitor
• ProgramNodeEnumerator
This class provides a framework for recursively processing a program node tree. Program nodes of type
<NodeType> should implement
nodeDo: anEnumerator
^anEnumerator do<NodeType>: self ...arguments...
by analogy with the ProgramNodeBuilder messages
new<NodeType>[arguments]
The old node is the first argument, so that enumerators can preserve the comment and source information if they
wish.
To rebuild each non-leaf node, the enumerator sends the message
self doNode: <argument>
which is implemented by default as
doNode: aNode
^aNode nodeDo: self
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 49
Visitor
• ProgramNodeEnumerator
Subclasses must implement the following messages:
enumerating-non-leaves
doAssignment:variable:value:
doBlock:arguments:body:
doCascade:receiver:messages:
doMessage:receiver:selector:arguments:
doMethod:selector:primitive:block:
doParameter:variable:type:
doReturn:value:
doSequence:temporaries:statements:
enumerating-leaves
doLiteral:value:
doVariable:name:
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 50
ProgramNodeEnumerator
ProgramNodeEnumerator is a visitor for the Smalltalk-80 compiler.
Smalltalk compiler parse tree hierachy rarely changes.
There are lots of potential programs that need to traverse trees:
• • consistency checkers
• • program transformation
• • metrics
It makes sense to keep these applications out of the parse tree.
Easy to make minor variations on tree walking applications.
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 51
Facade
Rarely seen in the image...
Perhaps the Smalltalk Compiler itself qualifies…
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 52
Bridge
Elusive Quarry
Yelland’s paper from OOPSLA ‘96 discusses how
Bridges might improve the image...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 53
State
Have you seen one?
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 54
Memento
Nocturnal?
Seen in applications, like the Refactoring
Browser
Difficult to find in the image...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 55
Mediator
• Case can be made for models...
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 56
Creational patterns
GoF Design
Patterns
•
Abstract Factory
•
Builder
•
Factory Method
•
Prototype
•
Singleton
Structural patterns
•
Adapter
•
Bridge
•
Composite
•
Decorator
•
Facade
•
Flyweight
•
Proxy
7/20/2015 (C) Brian Foote 1999
Behavioral Patterns
•
Chain of Responsibility
•
Command
•
Interpreter
•
Iterator
•
Mediator
•
Memento
•
Observer
•
State
•
Strategy
•
Template Method
•
Visitor
Smalltalk Patterns Safari
Slide -- 57
Bird on Patterns
Learn the
patterns and
then forget ‘em
-- Charlie
Parker
http://www.hillside.net
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 58
Conserving Infodiversity
The Image: A Cyberworld Heritage Site
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 59
A Victory over Entropy
• A stunning collective
achievement
• A temple to design
• Incubator for
architecture
• A pattern hunter’s
paradise
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 60
Contact Information
Brian Foote
The Refactory, Inc.
209 W. Iowa
Urbana, IL 61801
(217) 328-3523
http://www.laputan.org (H)
http://www.refactory.com (O)
[email protected]
7/20/2015 (C) Brian Foote 1999
Smalltalk Patterns Safari
Slide -- 61