13. Traits
Selected literature
> Cook. Interfaces and Specifications for the
Smalltalk-80 Collection Classes. OOPSLA 1992
> Taivalsaa...
© Oscar Nierstrasz
ST — Smalltalk Basics
2.3
Roadmap
> Why traits?
> Traits in a Nutshell
> Case study — Streams
> Traits ...
© Oscar Nierstrasz
ST — Smalltalk Basics
2.4
Roadmap
> Why traits?
> Traits in a Nutshell
> Case study — Streams
> Traits ...
Problem: how to share behaviour across
class hierarchies?
© Oscar Nierstrasz
Traits
5
There are hundreds of methods we wou...
The trouble with Single Inheritance
> Where to put the shared behaviour?
— Sharing too high inappropriate methods must be ...
The trouble with Multiple Inheritance
> Conflicts must be resolved
— Implicit resolution leads to
fragility when refactori...
Mixins extend single inheritance with
features that can be mixed into a class
© Oscar Nierstrasz
Traits
8
The trouble with Mixins
> Mixins are composed linearly to resolve conflicts
— Conflict resolution is sensitive to mixin co...
© Oscar Nierstrasz
ST — Smalltalk Basics
2.10
Roadmap
> Why traits?
> Traits in a Nutshell
> Case study — Streams
> Traits...
Traits are parameterized behaviours
> A trait
— provides a set of methods
— requires a set of methods
— may be composed of...
Class = superclass + state + traits + glue
© Oscar Nierstrasz
Traits
12
The class retains full control of the composition
Both traits and classes can be composed
of traits
© Oscar Nierstrasz
Traits
13
Trait named: #NSTPuttablePositionableStream...
Trait composition rules
1. Class methods take precedence over trait
methods
2. Conflicts are resolved explicitly
3. Traits...
Class methods take precedence over trait
methods
© Oscar Nierstrasz
Traits
15
RectangleMorph>>printOn:
prevails over Morph...
Trait composition rules
1. Class methods take precedence over trait methods
2. Conflicts are resolved explicitly
3. Traits...
Conflicts are resolved explicitly
© Oscar Nierstrasz
Traits
17
RectangleMorph subclass: #Morph
uses: TRectangle @ {#rectan...
Trait composition rules
1. Class methods take precedence over trait methods
2. Conflicts are resolved explicitly
3. Traits...
Traits can be flattened away
© Oscar Nierstrasz
Traits
19
A class using traits is
equivalent to class
that defines those
t...
© Oscar Nierstrasz
ST — Smalltalk Basics
2.20
Roadmap
> Why traits?
> Traits in a Nutshell
> Case study — Streams
> Traits...
The trouble with Streams
© Oscar Nierstrasz
Traits
21
unused state
methods too high
copying
canceling
reimplementation
The Nile core
© Oscar Nierstrasz
Traits
22
Nile Stream classes
© Oscar Nierstrasz
Traits
23
no methods too high
no copying
no unused state
no reimplementation
limite...
Other Nile Stream classes
© Oscar Nierstrasz
Traits
24
Assessment
> High reuse achieved
— 40% less code in Stream hierarchy
> More general abstractions
— Streams on any Collecti...
© Oscar Nierstrasz
ST — Smalltalk Basics
2.26
Roadmap
> Why traits?
> Traits in a Nutshell
> Case study — Streams
> Traits...
© Oscar Nierstrasz
ST — Understanding Classes and Metaclasses
12.27
Traits in Pharo
> Language Extension
— Extended the la...
© Oscar Nierstrasz
ST — Understanding Classes and Metaclasses
12.28
Traits in Pharo 1.0
Object subclass: #Behavior
uses: T...
OmniBrowser supports trait browsing and
navigation
© Oscar Nierstrasz
Traits
29
navigation browsing required methods
Traits can be manipulated from the browser
© Oscar Nierstrasz
Traits
30
Traits and Classes share common
behaviour
Traits
31
Can classes share compiled methods from
traits?
© Oscar Nierstrasz
Traits
32
Two problems:
1.super is statically bound
2.c...
© Oscar Nierstrasz
ST — Smalltalk Basics
2.33
Roadmap
> Why traits?
> Traits in a Nutshell
> Case study — Streams
> Traits...
The future of Traits
> Stateful traits
— some experimental solutions …
> Tool support
— limited browser support in Pharo
>...
© Oscar Nierstrasz
Traits
1.35
Attribution-ShareAlike 3.0 Unported
You are free:
to Share — to copy, distribute and transm...
Upcoming SlideShare
Loading in...5
×

13 traits

2,387

Published on

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,387
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
21
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Warning — toy example!
    Some real case study examples appear later.
  • Better would be:
    = aRectangle
    ^ self species = aRectangle species
    and: [self origin = aRectangle origin]
    and: [self corner = aRectangle corner]
  • NB: TRectangle only uses accessors to access state. The original Rectangle code may need to be adapted.
    Glue is needed to fulfil trait requirements, here implemented by accessors
  • See NSCollectionStream for a real example
  • 13 traits

    1. 1. 13. Traits
    2. 2. Selected literature > Cook. Interfaces and Specifications for the Smalltalk-80 Collection Classes. OOPSLA 1992 > Taivalsaari. On the Notion of Inheritance. ACM Computing Surveys, September 1996. > Black, et al. Applying Traits to the Smalltalk Collection Hierarchy. OOPSLA 2003 > Ducasse, et al. Traits: A Mechanism for fine- grained Reuse. ACM TOPLAS, March 2006. > Cassou, et al. Traits at Work: the design of a new trait-based stream library. JCLSS 2009 © Oscar Nierstrasz Traits 2 http://scg.unibe.ch/scgbib?query=stlit-traits
    3. 3. © Oscar Nierstrasz ST — Smalltalk Basics 2.3 Roadmap > Why traits? > Traits in a Nutshell > Case study — Streams > Traits in Pharo > Future of Traits
    4. 4. © Oscar Nierstrasz ST — Smalltalk Basics 2.4 Roadmap > Why traits? > Traits in a Nutshell > Case study — Streams > Traits in Pharo > Future of Traits
    5. 5. Problem: how to share behaviour across class hierarchies? © Oscar Nierstrasz Traits 5 There are hundreds of methods we would like RectangleMorph to inherit from both Rectangle and Morph
    6. 6. The trouble with Single Inheritance > Where to put the shared behaviour? — Sharing too high inappropriate methods must be “cancelled”⇒ > Duplicating code — Impacts maintenance > Delegate — Ugly boilerplate delegation code © Oscar Nierstrasz Traits 6
    7. 7. The trouble with Multiple Inheritance > Conflicts must be resolved — Implicit resolution leads to fragility when refactoring > No unique super class — Must explicitly name super methods to compose them > Diamond problem — What to do about features inherited along two paths? © Oscar Nierstrasz Traits 7 an IdentitySet(#topRight #align:with: #right: #leftCenter #bottom #center #height #right #topCenter #extent #bottomCenter #topLeft #width #printOn: #containsPoint: #left #top #intersects: #bottomLeft #bottom: #bottomRight #top: #left: #rightCenter) an IdentitySet(#topRight #align:with: #right: #leftCenter #bottom #center #height #right #topCenter #extent #bottomCenter #topLeft #width #printOn: #containsPoint: #left #top #intersects: #bottomLeft #bottom: #bottomRight #top: #left: #rightCenter) Rectangle selectors select: [:s | Morph selectors includes: s] Rectangle selectors select: [:s | Morph selectors includes: s]
    8. 8. Mixins extend single inheritance with features that can be mixed into a class © Oscar Nierstrasz Traits 8
    9. 9. The trouble with Mixins > Mixins are composed linearly to resolve conflicts — Conflict resolution is sensitive to mixin composition order — Composing entity has no control! > Fragile hierarchy — Changes may impact distant classes © Oscar Nierstrasz Traits 9
    10. 10. © Oscar Nierstrasz ST — Smalltalk Basics 2.10 Roadmap > Why traits? > Traits in a Nutshell > Case study — Streams > Traits in Pharo > Future of Traits
    11. 11. Traits are parameterized behaviours > A trait — provides a set of methods — requires a set of methods — may be composed of other traits > Traits do not specify any state! © Oscar Nierstrasz Traits 11 = aRectangle ^ self species = aRectangle species and: [self origin = aRectangle origin] and: [self corner = aRectangle corner] = aRectangle ^ self species = aRectangle species and: [self origin = aRectangle origin] and: [self corner = aRectangle corner]
    12. 12. Class = superclass + state + traits + glue © Oscar Nierstrasz Traits 12 The class retains full control of the composition
    13. 13. Both traits and classes can be composed of traits © Oscar Nierstrasz Traits 13 Trait named: #NSTPuttablePositionableStream uses: NSTPuttableStream + NSTPositionableStream category: 'Nile-Base-Traits' Trait named: #NSTPuttablePositionableStream uses: NSTPuttableStream + NSTPositionableStream category: 'Nile-Base-Traits' Object subclass: #NSTextStream uses: NSTPuttablePositionableStream + NSTCharacterWriting instanceVariableNames: 'collection position writeLimit readLimit' classVariableNames: '' poolDictionaries: '' category: 'Nile-Clients-TextStream' Object subclass: #NSTextStream uses: NSTPuttablePositionableStream + NSTCharacterWriting instanceVariableNames: 'collection position writeLimit readLimit' classVariableNames: '' poolDictionaries: '' category: 'Nile-Clients-TextStream'
    14. 14. Trait composition rules 1. Class methods take precedence over trait methods 2. Conflicts are resolved explicitly 3. Traits can be flattened away © Oscar Nierstrasz Traits 14
    15. 15. Class methods take precedence over trait methods © Oscar Nierstrasz Traits 15 RectangleMorph>>printOn: prevails over Morph>>printOn:
    16. 16. Trait composition rules 1. Class methods take precedence over trait methods 2. Conflicts are resolved explicitly 3. Traits can be flattened away © Oscar Nierstrasz Traits 16
    17. 17. Conflicts are resolved explicitly © Oscar Nierstrasz Traits 17 RectangleMorph subclass: #Morph uses: TRectangle @ {#rectanglePrintOn: -> #printOn:} – {#align:with: . #topRight . … } instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Morphic-TraitsDemo' RectangleMorph subclass: #Morph uses: TRectangle @ {#rectanglePrintOn: -> #printOn:} – {#align:with: . #topRight . … } instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Morphic-TraitsDemo' Aliasing introduces an additional name for a method Exclusion removes a method from a trait
    18. 18. Trait composition rules 1. Class methods take precedence over trait methods 2. Conflicts are resolved explicitly 3. Traits can be flattened away © Oscar Nierstrasz Traits 18
    19. 19. Traits can be flattened away © Oscar Nierstrasz Traits 19 A class using traits is equivalent to class that defines those traits locally
    20. 20. © Oscar Nierstrasz ST — Smalltalk Basics 2.20 Roadmap > Why traits? > Traits in a Nutshell > Case study — Streams > Traits in Pharo > Future of Traits Cassou, et al. Traits at Work: the design of a new trait-based stream library. JCLSS 2009.
    21. 21. The trouble with Streams © Oscar Nierstrasz Traits 21 unused state methods too high copying canceling reimplementation
    22. 22. The Nile core © Oscar Nierstrasz Traits 22
    23. 23. Nile Stream classes © Oscar Nierstrasz Traits 23 no methods too high no copying no unused state no reimplementation limited canceling
    24. 24. Other Nile Stream classes © Oscar Nierstrasz Traits 24
    25. 25. Assessment > High reuse achieved — 40% less code in Stream hierarchy > More general abstractions — Streams on any Collection — With equal or better performance > Design traits around abstractions, not reuse — Avoid too fine-grained traits > Traits or classes? — Prefer classes — use traits to resolve design conflicts © Oscar Nierstrasz Traits 25
    26. 26. © Oscar Nierstrasz ST — Smalltalk Basics 2.26 Roadmap > Why traits? > Traits in a Nutshell > Case study — Streams > Traits in Pharo > Future of Traits
    27. 27. © Oscar Nierstrasz ST — Understanding Classes and Metaclasses 12.27 Traits in Pharo > Language Extension — Extended the language kernel to represent traits — Modified the compilation process for classes built from traits > No changes to the VM — Essentially no runtime performance penalty — Except indirect instance variable access — But: This is common practice anyway > No duplication of source code — Only byte-code duplication when installing methods
    28. 28. © Oscar Nierstrasz ST — Understanding Classes and Metaclasses 12.28 Traits in Pharo 1.0 Object subclass: #Behavior uses: TPureBehavior @ { #basicAddTraitSelector:withMethod: -> #addTraitSelector:withMethod: } instanceVariableNames: 'superclass methodDict format traitComposition localSelectors' classVariableNames: 'ObsoleteSubclasses' poolDictionaries: '' category: 'Kernel-Classes'
    29. 29. OmniBrowser supports trait browsing and navigation © Oscar Nierstrasz Traits 29 navigation browsing required methods
    30. 30. Traits can be manipulated from the browser © Oscar Nierstrasz Traits 30
    31. 31. Traits and Classes share common behaviour Traits 31
    32. 32. Can classes share compiled methods from traits? © Oscar Nierstrasz Traits 32 Two problems: 1.super is statically bound 2.compiled methods know their class ⇒methods are copied to method dictionaries when they are installed
    33. 33. © Oscar Nierstrasz ST — Smalltalk Basics 2.33 Roadmap > Why traits? > Traits in a Nutshell > Case study — Streams > Traits in Pharo > Future of Traits
    34. 34. The future of Traits > Stateful traits — some experimental solutions … > Tool support — limited browser support in Pharo > Automatic refactoring — some experiments with formal concept analysis > Pure trait-based language — can traits and classes be unified? > Traits in other languages — Perl, Scala, Fortress, … © Oscar Nierstrasz Traits 34
    35. 35. © Oscar Nierstrasz Traits 1.35 Attribution-ShareAlike 3.0 Unported You are free: to Share — to copy, distribute and transmit the work to Remix — to adapt the work Under the following conditions: Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license. For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page. Any of the above conditions can be waived if you get permission from the copyright holder. Nothing in this license impairs or restricts the author's moral rights. License http://creativecommons.org/licenses/by-sa/3.0/
    1. A particular slide catching your eye?

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

    ×