0
Stéphane Ducasse 1
Stéphane Ducasse
stephane.ducasse@inria.fr
http://stephane.ducasse.free.fr/
Visitor
S.Ducasse 2
Intent: Represent an operation to be performed on
the elements of an object structure in a class
separate from...
S.Ducasse 3
Visitor Possible Structure
S.Ducasse 4
Whenever you have a number of items on which you
have to perform a number of actions
When you ‘decouple’ the a...
S.Ducasse 5
So all our problems are solved, no?
Well...
how to define it
when to use a visitor
control over item traversal...
S.Ducasse 6
Language to deal with arithmetic expressions.
It supports one kind of number, and has +, *, (, )
We want to ev...
S.Ducasse 7
Example
Evaluating
1 + 1
gives = 2
1 + (3 * 2)
gives 7
Printing
+1*32
S.Ducasse 8
Visitor Toy Example: ParseTree
S.Ducasse 9
Expressions creation
1
ENumber value: 1
(3 * 2)
Times left: (ENumber value: 3) right: (ENumber value: 2)
1 + (...
S.Ducasse 10
Two solutions:
add methods for evaluating, printing, ... on Expression and
its subclasses
create a Visitor, a...
S.Ducasse 11
Visitor Toy Example Solution 1
S.Ducasse 12
Expressions creation
(ENumber value: 1) evaluate
> 1
(Times left: (ENumber value: 3) right: (ENumber value: 2...
S.Ducasse 13
printing is not easy may need specific instance variables
adding it directly on Expression clutters Expressio...
S.Ducasse 14
Visitor Toy Example 2
S.Ducasse 15
Expressions creation
Evaluator evaluate: (ENumber value: 1)
> 1
Evaluator evaluate: (Times left: (ENumber val...
S.Ducasse 16
Evaluator
Evaluator>>visitNumber: aNumber
^ aNumber value
Evaluator>>visitPlus: anExpression
|l r|
l := anExp...
S.Ducasse 17
Printer
Visitor subclass: #Printer
iv:‘stream level’
Printer>>visitNumber: aNumber
stream nextPutAll: aNumber...
S.Ducasse 18
Smalltalk has class extensions:
method addition
method replacement
So ‘Decoupling’ actions from items can be ...
S.Ducasse 19
Somewhere in the visitor, items are traversed.
Different places where the traversal can be
implemented:
in th...
S.Ducasse 20
Traversal on the Visitor
S.Ducasse 21
Traversal on the Items
S.Ducasse 22
Sometimes you can represent contextual
information by having more specialized visit
methods
So visitors have ...
S.Ducasse 23
doNode: is invoked from doVariables: and
doSequence:temporaries:statements:
Granularity of Visit Methods
S.Ducasse 24
Here doTemporaryVariable: provides the context for
treating doVariable:
Refined Granularity
S.Ducasse 25
You can implement it as we have shown before.
But notice the general structure of the methods!
This can be ta...
S.Ducasse 26
Using #perform:
S.Ducasse 27
Use a Visitor:
when the operations on items change a lot.
Do not use a visitor:
when the items you want to vi...
Upcoming SlideShare
Loading in...5
×

Stoop 431-visitor

357

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
357
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Stoop 431-visitor"

  1. 1. Stéphane Ducasse 1 Stéphane Ducasse stephane.ducasse@inria.fr http://stephane.ducasse.free.fr/ Visitor
  2. 2. S.Ducasse 2 Intent: Represent an operation to be performed on the elements of an object structure in a class separate from the elements themselves. Visitor lets you define a new operation without changing the classes of the elements on which it operates. Visitor Intent
  3. 3. S.Ducasse 3 Visitor Possible Structure
  4. 4. S.Ducasse 4 Whenever you have a number of items on which you have to perform a number of actions When you ‘decouple’ the actions from the items. Examples: the parse tree (ProgramNode) uses a visitor for the compilation (emitting code on CodeStream) GraphicsContext is a visitor for VisualComponents, Geometrics, and some other ones (CharacterArray, ...) Rendering documents When to use a Visitor
  5. 5. S.Ducasse 5 So all our problems are solved, no? Well... how to define it when to use a visitor control over item traversal choosing the granularity of visitor methods implementation tricks Applying the Visitor
  6. 6. S.Ducasse 6 Language to deal with arithmetic expressions. It supports one kind of number, and has +, *, (, ) We want to evaluate expressions, and print them. Visitor Toy Example
  7. 7. S.Ducasse 7 Example Evaluating 1 + 1 gives = 2 1 + (3 * 2) gives 7 Printing +1*32
  8. 8. S.Ducasse 8 Visitor Toy Example: ParseTree
  9. 9. S.Ducasse 9 Expressions creation 1 ENumber value: 1 (3 * 2) Times left: (ENumber value: 3) right: (ENumber value: 2) 1 + (3 * 2) Plus left: (ENumber value: 1) right: (Times left: (ENumber value: 3) right: (ENumber value: 2)) Of course in Smalltalk we can just extend Number so no need of ENumber value:.....
  10. 10. S.Ducasse 10 Two solutions: add methods for evaluating, printing, ... on Expression and its subclasses create a Visitor, add the visit methods on Expression and its subclasses, and implement visitors for evaluation, printing, ... Implementing the Actions
  11. 11. S.Ducasse 11 Visitor Toy Example Solution 1
  12. 12. S.Ducasse 12 Expressions creation (ENumber value: 1) evaluate > 1 (Times left: (ENumber value: 3) right: (ENumber value: 2)) evaluate > 6 (Plus left: (ENumber value: 1) right: (Times left: (ENumber value: 3) right: (ENumber value: 2))) evaluate > 7
  13. 13. S.Ducasse 13 printing is not easy may need specific instance variables adding it directly on Expression clutters Expression may need to add instance variables that are not part of the tree behavior of the printer are mixed with expressions
  14. 14. S.Ducasse 14 Visitor Toy Example 2
  15. 15. S.Ducasse 15 Expressions creation Evaluator evaluate: (ENumber value: 1) > 1 Evaluator evaluate: (Times left: (ENumber value: 3) right: (ENumber value: 2)) > 6 Evaluator evaluate: (Plus left: (ENumber value: 1) right: (Times left: (ENumber value: 3) right: (ENumber value: 2))) > 7 Evaluator>>evaluate: anExpression ^ anExpression acceptVisitor: self
  16. 16. S.Ducasse 16 Evaluator Evaluator>>visitNumber: aNumber ^ aNumber value Evaluator>>visitPlus: anExpression |l r| l := anExpression left acceptVisitor: self. r := anExpression right acceptVisitor: self. ^ l + r Evaluator>>visitPlus: anExpression |l r| l := anExpression left acceptVisitor: self. r := anExpression right acceptVisitor: self. ^ l * r
  17. 17. S.Ducasse 17 Printer Visitor subclass: #Printer iv:‘stream level’ Printer>>visitNumber: aNumber stream nextPutAll: aNumber value asString Printer>>visitPlus: anExpression stream nextPutAll:‘+’. anExpression left acceptVisitor: self. anExpression right acceptVisitor: self. Printer>>visitPlus: anExpression stream nextPutAll:‘*’. anExpression left acceptVisitor: self. anExpression right acceptVisitor: self.
  18. 18. S.Ducasse 18 Smalltalk has class extensions: method addition method replacement So ‘Decoupling’ actions from items can be done: e.g., put all the printing methods together. take care: works only for methods makes it also really easy to package a visitor! Note: this is a static solution! Smalltalk’s class extensions
  19. 19. S.Ducasse 19 Somewhere in the visitor, items are traversed. Different places where the traversal can be implemented: in the visitor on the items hierarchy Controlling the traversal
  20. 20. S.Ducasse 20 Traversal on the Visitor
  21. 21. S.Ducasse 21 Traversal on the Items
  22. 22. S.Ducasse 22 Sometimes you can represent contextual information by having more specialized visit methods So visitors have more information for implementing their operations Granularity of Visit Methods
  23. 23. S.Ducasse 23 doNode: is invoked from doVariables: and doSequence:temporaries:statements: Granularity of Visit Methods
  24. 24. S.Ducasse 24 Here doTemporaryVariable: provides the context for treating doVariable: Refined Granularity
  25. 25. S.Ducasse 25 You can implement it as we have shown before. But notice the general structure of the methods! This can be taken as advantage: code can be generated for a visitor. the method can be performed/invoked But take care: only works when there is a full correspondence. can make the code hard to understand. Implementation Tricks
  26. 26. S.Ducasse 26 Using #perform:
  27. 27. S.Ducasse 27 Use a Visitor: when the operations on items change a lot. Do not use a visitor: when the items you want to visit change a lot. Question: But how do we know what to choose up- front? When to Use a Visitor
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×