Title: A Smalltalk Patterns Safari
1A Smalltalk Patterns Safari
- Brian Foote
- The Refactory, Inc.
2Why Patterns?
- Whats 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
3Alexander 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
4Why 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
5The Gang of FourThe 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
6Dr. 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...
7Your Guide
- Over Twenty Years in the Bush...
- Stalking Smalltalk since 81 or 85 Patterns?
- An long-time associate of Dr. Johnson...
8Field 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
9VisualWorksThe Image A Virtual Veldt
- The Cradle of Object-OrientedArchitecture
- An Olduvai Gorge Teeming with Patterns
10GoF Design Patterns
- Creational patterns
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Singleton
- Structural patterns
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Behavioral Patterns
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
11The Big Five
- Composite
- Proxy
- Strategy
- Observer
- Visitor
- Lion
- Leopard
- Elephant
- Buffalo
- Rhino
12Objects within Objects
13Composite
- 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
14Composite
Idea make abstract "component"
class. Alternative 1 every component has a
(possibly empty) set of components.
Component
Children
Paragraph
Chapter
...
Problem many components have no components
15Composite
Component
Container
Children
Composite
Leaf
Composite and Component have the exact same
interface. interface for enumerating children
Component implements Children() by returning
empty set interface for adding/removing
children?
16Composite Pattern
Component
Container
Children
Composite
Leaf
Composite and Component have the exact same
interface. interface for enumerating children
Component implements Children() by returning
empty set interface for adding/removing
children?
17Two 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.
18Component 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.
19Ensuring 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.
20Example Equipment
Equipment
weight
cost
CompositeEq.
FloppyDisk
...
- weight
- total
- total 0.
- self childrenDo each total total each
weight. - total
21 VisualComponentgtgtadd
22Composite Pattern in VisualWorks
VisualComponent
Children
VisualPart
ComposedText
Container
CompositePart
ListView
- Most operations in CompositePart simply iterate
over the children and repeat the operation on
them.
23CompositePart
- 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
24Summary of Composite
- Composite is a kind of Component
- Permits arbitrary hierarchies
- Add/remove Component from Composite
- Operations on Composite iterate over Components
25Template Method
- As plentiful as sawgrass...
- Often associated with scavengers
- e.g. printOn aString
26Factory Method
- Plentiful in the image...
- View defaultControllerClass
- UILookPolicy
- XxxClass methods
27Abstract Factory
28Builder
29Prototype
- This isnt Self, after all...
- VisualWorks TextAttributes
- Look for copy
- Thinglab, Morphic...
30Singleton
- All the Metaclasses...
- ProcessScheduler
- SourceFileManager
- true, false, nil
31Strategy
32Observer 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.
observer/dependent
Observer Update
Subject AddDependent RemoveDependent Changed
LineFigure Update
endPoint
RectangleFigure
33Iterator
- Provide a way to access the elements of an
aggregate object sequentially without exposing
its underlying implementation.
Iterator
Aggregate
First() Next() IsDone() CurrentItem()
CreateIterator()
ConcreteAggregate
ConcreteIterator
CreateIterator()
34Iterator 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
35Proxy
- 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
36Proxy
Subject
Client
request
...
realSubject
Proxy
RealSubject
request
request
realSubject request
37Proxy
- 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.
38 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.
39 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
40Terminology and Taxonomy
- Is this a Wildebeest?
- A Gnu?
- Class MammaliaOrder ArtiodactylaFamily
BovidaeGenus species Connochaetes (flowing
beard) taurinus (like a bull) albojubatus (white
mane)
41Decorator
- Object ()
- VisualComponent ()
- VisualPart ()
- Wrapper ()
- GeometricWrapper ()
- FillingWrapper ()
- StrokingWrapper ()
- GraphicsAttributesWrapper ()
- PassivityWrapper ('controlActive')
- ReversingWrapper ()
- StrikeOutWrapper ()
- ScalingWrapper ()
- TranslatingWrapper ()
- LayoutWrapper ()
- BoundedWrapper ()
- BorderedWrapper ()
- MenuBarWrapper ()
- BoundingWrapper ()
42Adaptor
- Aspect Adaptor
- Pluggable Adaptor
43Flyweight
44Chain of Responsibility
45Command
- MenuItem
- Blocks are often used instead in Smalltalk, so
this pattern is not as common in its pure form in
this environment...
46Interpreter
- The WindowSpec Walker
- Though its not clear how to classify this
- The simulator?
47Observer
48Parse Tree
49Visitor
- ProgramNodeEnumerator
- This class provides a framework for recursively
processing a program node tree. Program nodes of
type ltNodeTypegt should implement - nodeDo anEnumerator
- anEnumerator doltNodeTypegt self
...arguments... - by analogy with the ProgramNodeBuilder messages
- newltNodeTypegtarguments
- 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 ltargumentgt
- which is implemented by default as
- doNode aNode
- aNode nodeDo self
50Visitor
- ProgramNodeEnumerator
- Subclasses must implement the following messages
- enumerating-non-leaves
- doAssignmentvariablevalue
- doBlockargumentsbody
- doCascadereceivermessages
- doMessagereceiverselectorarguments
- doMethodselectorprimitiveblock
- doParametervariabletype
- doReturnvalue
- doSequencetemporariesstatements
- enumerating-leaves
- doLiteralvalue
- doVariablename
51ProgramNodeEnumerator
- 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.
52Facade
- Rarely seen in the image...
- Perhaps the Smalltalk Compiler itself qualifies
53Bridge
- Elusive Quarry
- Yellands paper from OOPSLA 96 discusses how
Bridges might improve the image...
54State
55Memento
- Nocturnal?
- Seen in applications, like the Refactoring
Browser - Difficult to find in the image...
56Mediator
- Case can be made for models...
57GoF Design Patterns
- Creational patterns
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Singleton
- Structural patterns
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Behavioral Patterns
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
58Bird on Patterns
- Learn the patterns and then forget em
- -- Charlie Parker
- http//www.hillside.net
59Conserving Infodiversity
- The Image A Cyberworld Heritage Site
60A Victory over Entropy
- A stunning collective achievement
- A temple to design
- Incubator for architecture
- A pattern hunters paradise
61Contact 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)
- foote_at_refactory.com