Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library •...

39
Please, feel free to interrupt me at any time.

Transcript of Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library •...

Page 1: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Please,feel free to interrupt me at any time.

Page 2: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Do you use:•Multiple Inheritance?•Mixins?

Page 3: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Traits

A Language Feature for PHP?

Stefan MarrPHP Unconference Hamburg

26‐27 April 2008

Page 4: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Agenda

1. Introduction to Traits

2. Traits Applied

3. Traits for PHP: Trait versus Graft

4. Roundup and Conclusion

4/26/2008 4Traits: A Language Feature for PHP?

Page 5: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Which problem is to be solved?

4/26/2008 1. Introduction to Traits

• Single inheritance

• Simple but not expressive enough

• Leads to

• Code duplication

• Inappropriate hierarchies

5

Vertebrates

Dinosaurs Mammal

fly()

Bat

fly()

Archaeoptrix

Page 6: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Traits

• Set of methods

• Possibly composed of other Traits

• Composition is unordered

• Composition operations– Sum– Exclusion– Aliasing

• Can be flattened away

4/26/2008 1. Introduction to Traits 6

TConflict

TTrait

TFoo

TBar

Page 7: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Whiteboard

4/26/2008 71. Introduction to Traits

a()Base

a()A

^'B'

^'A' a()T

a()Base

a()A

^'B'

^'A'

^'T'

a()Base

A

^'B'

a()T

a()Base

a()A

^'B'

^'T'

^'T'

a()Base

A

^'B'

a()T2

a()Base

a()A

^'B'

^'B'

^'T2'

a()T1

^'T1'

a()Base

A

^'B'

a()T2

a()Base

a()A

^'B'

^'T1'

^'T2'

a()T1

^'T1'

!a

a()Base

A

^'B'

a()T2

a()Base

a()b()

A

^'B'

^'B'^'T2'

^'T2'

a()T1

^'T1'

b→a

Page 8: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

TRAITS APPLIEDCase Studies Illustrating Benefits of Traits

4/26/2008 Stefan Marr 8

Page 9: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Use Case for Traits in a PHP Library

• ezcReflection enhances PHP Reflection API– Adds XDoclet like annotations for PHP– Enhances type hinting using PHPDoc type annotations

• Illustrates solution for code duplication problems

4/26/2008 92. Traits Applied

Page 10: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Refactoring ezcReflection with Traits

4/26/2008 102. Traits Applied

original with Traitsgreen parts are extracted to the Traits on the right‐hand side,

and will be removed from the classes

Page 11: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Case Study: java.io [6]

• Mature code base, in wide use

• java.io Library from Java 1.4.2

• 79 classes, 25000 lines of code

• Results– 12 classes changed– 30 duplicated methods removed

– 14 Traits introduces

4/26/2008 112. Traits Applied

Page 12: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Case Study:Smalltalk Collection Classes [10]

• Problem: code reuse vs. conceptual categorization– Unnecessary inheritance– Code duplication–Methods to high in hierarchy– Conceptual shortcomings

• Results for core collection classes– 23 classes changed, 12% less code, 19.4% less methods

4/26/2008 132. Traits Applied

Page 13: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Case Study:Smalltalk Collection Classes [10]

• Lessons Learned– Traits simplify refactoring

– Very fine‐grained traits– Tools are important

– Traits enable to defer design of class hierarchy• Improvements– Uniformity, understandability, reuse

4/26/2008 142. Traits Applied

Page 14: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Check for Limitations

• Code duplication

• Inappropriate hierarchies

• Diamond problem

• Fragile hierarchies

• Lack of composition control

4/26/2008 152. Traits Applied

Page 15: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

TRAITS FOR PHPTrait versus Graft

4/26/2008 Stefan Marr

Page 16: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

What is a Graft?

• Stateful, non‐breakable entity of reuse– Derived from the Traits notion

– Proposed with RFC: Non Breakable Traits for PHP• Why Graft?

4/26/2008 173. Traits for PHP: Trait versus Graft

From The Grafter's Handbook by R.J. Garner

Page 17: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

A Comparison

Traits

• Purpose, reuse of– behavior

• Features– Stateless

– Flattenable

– Explicit conflict resolution

– Highly composable

• Notion– Language‐base

Copy and Paste

Grafts

• Purpose, reuse of– modules smaller then classes

• Features– Stateful

– Hides complexity

– Conflict avoidiance

– Strong encapsulation

• Notion– Delegation with self‐

impersonation

4/26/2008 183. Traits for PHP: Trait versus Graft

Page 18: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Traits Syntax and Semanticstrait A {

public function small() { echo 'a'; }public function big()   { echo 'A'; }

abstract public function doBFoo();

public function doAFoo() {echo 'AFoo uses BFoo: ';$this‐>doBFoo();

}}

trait B {public function small() { echo 'b'; }public function big()   { echo 'B'; }

public function doBFoo() {echo 'B‐FOO';

}}

class Talker {use A, B {B::small instead A::small, A::big instead B::big,B::big as talk

}}

$talker = new Talker();$talker‐>small();  // b $talker‐>big();    // A$talker‐>talk();   // B

$talker‐>doAFoo(); // AFoo uses// BFoo: B‐FOO

$talker‐>doBFoo(); // B‐FOO

4/26/2008 193. Traits for PHP: Trait versus Graft

Page 19: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Grafts Syntax and Semanticsgraft Counter {

private $cnt = 0;public function inc() {

$this‐>cnt++;}public function reset() {

$this‐>cnt = ‐1;$this‐>inc();

}}graft DB {

private $db;public function connect() {

$this‐>db = new FooDB('param');}public function reset() {

$this‐>db‐>flush();$this‐>db = null;

}public function doFoo(){echo 'foo';}

}

class MyPage {include Counter {

public incCnt() as inc();public resetCnt() as reset();

}include DB {

public connect();public reset();

}public function inc() {

/* next page */}

}

$page = new MyPage();$page‐>connect();$page‐>incCnt();   //($Countercnt == 1)$page‐>resetCnt(); // $Countercnt = 0;$page‐>inc();      // goto next page$page‐>doFoo();    // FATAL ERROR

4/26/2008 203. Traits for PHP: Trait versus Graft

Page 20: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

My Mental Image

Traits Grafts

4/26/2008 213. Traits for PHP: Trait versus Graft

MyClass MyClass

Page 21: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

ROUNDUP AND CONCLUSIONTrait Support, Discussion, Resume

4/26/2008 Stefan Marr

Page 22: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Environments Supporting Traits

• Squeak: In standard distribution since 3.9 [11]

Trait named: #TDrawing uses: {}

draw

ˆself drawOn: World canvas in: bounds

boundsself requirement

Object subclass: #Circle

instanceVariableNames: ’’

traits: { TDrawing }

...

4/26/2008 234. Roundup and Conclusion

Page 23: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Environments Supporting Traits

• Scala: static‐typed language running on JVM [7]

trait TDrawing {

def draw() : Any =

drawOn(World.canvas(), bounds)

def bounds() : Any}

class Circle extends TDrawing {

...

}

4/26/2008 244. Roundup and Conclusion

Page 24: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Environments Supporting Traits

• Perl6: Flavor of Traits with states called Roles [12]

role TDrawing {method draw() { return drawOn(World.canvas(),bounds);

}}

class Circle does TDrawing {...

}

4/26/2008 254. Roundup and Conclusion

Page 25: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Environments Supporting Traits

• Approaches for plain Java– Using AspectJ [2]– Utilizing an Eclipse Plugin [8]

4/26/2008 264. Roundup and Conclusion

Page 26: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Environments Supporting Traits

• Approaches for plain Java– Using AspectJ [2]– Utilizing an Eclipse Plugin [8]

4/26/2008 274. Roundup and Conclusion

Page 27: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Environments Supporting Traits

• C#: Prototype Implementation for Rotor [9]

trait TDrawing {public Object draw() { return drawOn(World.canvas(),this.bounds);

}requires { public Object bounds(); }

}

class Circle {uses { TDrawing }...

}

4/26/2008 284. Roundup and Conclusion

Page 28: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Resume

• Traits are a appropriate language construct to:– Achive conceptual consistent class hierarchies– Avoid code duplication– Enhance class compositon capabilites

• Available for different languages

• Two different flavors proposed for PHP

4/26/2008 294. Roundup and Conclusion

Page 29: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Request for Comments

Traits for PHPVersion:  1.5Date:  2008‐03‐06Author:  Stefan MarrWiki: http://wiki.php.net/rfc/traitsreST: http://www.stefan‐marr.de/rfc‐traits‐for‐php.txtHTML: http://www.stefan‐marr.de/artikel/rfc‐traits‐for‐php.html

Non Breakable Traits for PHPVersion:  1.0Date:  2008‐02‐29Author:  Joshua ThompsonWiki:  http://wiki.php.net/rfc/nonbreakabletraits

4/26/2008 304. Roundup and Conclusion

Page 30: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Basic Literature

Main Article about Traits 

[3] S. DUCASSE, O. NIERSTRASZ, N. SCHÄRLI, R. WUYTS, AND A. P. BLACK, Traits: A Mechanism for Fine‐Grained Reuse, ACM Trans. Program. Lang. Syst., 28 (2006), pp. 331–388.

Traits Extensions[1] A. BERGEL, S. DUCASSE, O. NIERSTRASZ, AND R. WUYTS, Stateful Traits and their 

Formalization, Journal of Computer Languages, Systems and Structures, 34 (2007), pp. 83–108.

[4] S. DUCASSE, R. WUYTS, A. BERGEL, AND O. NIERSTRASZ, User‐Changeable Visibility: Resolving Unanticipated Name Clashes in Traits, SIGPLAN Not., 42 (2007), pp. 171–190.

4/26/2008 314. Roundup and Conclusion

Page 31: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Literature[1]A. BERGEL, S. DUCASSE, O. NIERSTRASZ, AND R. WUYTS, Stateful Traits and their 

Formalization, Journal of Computer Languages, Systems and Structures, 34 (2007), pp. 83–108.

[2]S. DENIER, Traits Programming with AspectJ, RSTI ‐ L'objet, 11 (2005), pp. 69–86.[3]S. DUCASSE, O. NIERSTRASZ, N. SCHÄRLI, R. WUYTS, AND A. P. BLACK, Traits: A Mechanism 

for Fine‐Grained Reuse, ACM Trans. Program. Lang. Syst., 28 (2006), pp. 331–388.[4]S. DUCASSE, R. WUYTS, A. BERGEL, AND O. NIERSTRASZ, User‐Changeable Visibility: 

Resolving Unanticipated Name Clashes in Traits, SIGPLAN Not., 42 (2007), pp. 171–190.

[5]S. MARR AND F. MENGE, ezcReflection, SVN Repository, eZ Components, January 2008. http://svn.ez.no/svn/ezcomponents/experimental/Reflection.

[6]E. R. MURPHY‐HILL, P. J. QUITSLUND, AND A. P. BLACK, Removing Duplication from java.io: a Case Study using Traits, in OOPSLA '05: Companion to the 20th annual ACM SIGPLAN conference on Object‐oriented programming, systems, languages, and applications, New York, NY, USA, 2005, ACM, pp. 282–291.

4/26/2008 324. Roundup and Conclusion

Page 32: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Literature[7] PROGRAMMING METHODS LABORATORY, Traits for Scala, Programming 

Language, Ecole Polytechnique Fédérale de Lausanne, 2006. http://www.scala‐lang.org/intro/traits.html.

[8] P. J. QUITSLUND, E. R. MURPHY‐HILL, AND A. P. BLACK, Supporting Java traits in Eclipse, in eclipse '04: Proceedings of the 2004 OOPSLA workshop on eclipse technology eXchange, New York, NY, USA, 2004, ACM, pp. 37–41.

[9] S. REICHHART, Traits in C#. Video of Talk at Microsoft Research, September 2005.

[10]N. SCHÄRLI, Traits — Composing Classes from Behavioral Building Blocks, PhD thesis, University of Berne, Feb. 2005.

[11] SOFTWARE COMPOSITION GROUP, Traits for Squeak, Smalltalk VM, University of Berne, December 2006. http://www.iam.unibe.ch/ scg/Research/Traits/index.html.

[12] L. WALL, Apocalypse 12: Class Composition with Roles, tech. report, The Perl Foundation, 2004. http://www.perl.com/pub/a/2004/04/16/a12.html?page=11.

4/26/2008 334. Roundup and Conclusion

Page 33: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Any questions?Discussion•What du you think?•Traits vs. Grafts

Page 34: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

TRAITS ENHANCEDUser‐Changeable Visibility and Stateful Traits

4/26/2008 Stefan Marr

Page 35: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

User‐Changeable Visibility

• Add flexibility to conflict handling

• Introduces “Trait private” methods

• Methods visibility changeable on composition

4/26/2008 36Addition: Traits Enhanced

Page 36: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Stateless Traits

• Problem: stateless Traits are incomplete, not self‐contained units of reuse– Required state accessors bloat the interfaces– Encapsulation is violated by public accessors– Reuse, composition is hampered

– State access introduces fragility

4/26/2008 37Addition: Traits Enhanced

Page 37: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Stateless Traits

4/26/2008 38Addition: Traits Enhanced

getNuts()setNuts()

nutsScrat

Squirrel Rat

collect()getNuts()setNuts()eat()

NutEater

getNuts()setNuts()

getNuts()setNuts()

nutsHamster

getNuts()setNuts()

nutsWildBoar

Page 38: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Stateful Traits

• Solution requirements:– Preserver faltening property–Minimal and general approach

– Language independed• Solution– State is private to the Traits scope– Client can request access under new private name

– Client can merge state

4/26/2008 39Addition: Traits Enhanced

Page 39: Please, feel free to interrupt me at any time. · Use Case for Traits in a PHP Library • ezcReflection enhances PHP Reflection API – Adds XDoclet like annotations for PHP –

Stateful Traits

4/26/2008 40Addition: Traits Enhanced

Scratcollect()eat()

nutsNutEater

Hamster

WildBoar

Squirrel Rat