redesigning with traits

19
Redesigning with Traits The Nile Stream trait-based Library Damien Cassou 1 Stéphane Ducasse 1 Roel Wuyts 2 1 LISTIC, University of Savoie, France 2 IMEC, Leuven and Université Libre de Bruxelles European Smalltalk User Group, 2007

Upload: esug

Post on 12-Nov-2014

513 views

Category:

Technology


2 download

DESCRIPTION

Redesigning with Traits. The Nile Stream trait-based Library. Damien Cassou. ESUG 2007, Lugano

TRANSCRIPT

Page 1: Redesigning with Traits

Redesigning with TraitsThe Nile Stream trait-based Library

Damien Cassou1 Stéphane Ducasse1 Roel Wuyts2

1LISTIC, University of Savoie, France

2IMEC, Leuven and Université Libre de Bruxelles

European Smalltalk User Group, 2007

Page 2: Redesigning with Traits

Outline

ContextTraitsProblemsStreams

NileImplementationResults

ConclusionFurther work

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 2 / 19

Page 3: Redesigning with Traits

Context

Outline

ContextTraitsProblemsStreams

NileImplementationResults

ConclusionFurther work

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 3 / 19

Page 4: Redesigning with Traits

Context Traits

Traits Introduction

Traits

• group of reusable methods• implemented and required methods• conflict management• implemented in Perl 6, Fortress, Scala, Smalltalk

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 4 / 19

Page 5: Redesigning with Traits

Context Traits

Trait sample

>>=<=between:and:

<=

TMagnitude

<=...

String

<=...

Number

<=...

Date

• TMagnitude offers four methods and requires two• A class uses traits and implements required methods

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 5 / 19

Page 6: Redesigning with Traits

Context Problems

Problems

ObservationNever used to design framemorks/libraries from scratch

Questions

• ideal trait granularity?• how much code reuse?• trait or class?• limits, constraints, problems?

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 6 / 19

Page 7: Redesigning with Traits

Context Problems

Designing a New Trait-based Stream Library

Solution

• development of an adapted project• choosing the stream library

Needs

• compatibility with ANSI Smalltalk• compatibility with the current Squeak implementation• speed efficient

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 7 / 19

Page 8: Redesigning with Traits

Context Problems

StreamsStreamsStreams are used to read and write data sequentially in collections,files and network sockets.

Reading

• next• next:• peek

Writing

• nextPut:• nextPutAll:• next:put:

Positioning

• position:• reset• setToEnd

Why streams ?

• naturally modeled using multiple inheritance• existing implementations (some of them trait-based)• complex library

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 8 / 19

Page 9: Redesigning with Traits

Context Streams

Squeak Implementation

atEndclosecontentsdo:flushnextnext:next:put:nextPut:nextPutAll:upToEnd

Stream

atEndcontentsisEmptynext:peekpositionposition:resetsetToEndskip:upTo:upToEnd

collectionpositionreadLimit

PositionableStream

nextnext:nextPut:sizeupTo:upToEnd

ReadStream

contentsflushnextnextPut:nextPutAll:position:resetsizespacecr

writeLimitWriteStream

contentsnextnext:

ReadWriteStream

atEndcloseflushfullNamenextnext:nextPut:nextPutAll:peekpositionposition:resetsize

rwmodenamefileIDbuffer1

FileStream

• everything in the Stream class• methods disabled• reimplemented methods

• methods reactivated• files inherit from collections

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 9 / 19

Page 10: Redesigning with Traits

Context Streams

Schärli’s RefactoringOOPSLA 2003

flushclose

TStreamCommon

contents:lastoriginalContentsatEndisEmptyposition:resetresetContentssetToEndskip:

error:positionprivatePosition:collectioncollection:readLimitreadLimit:

TStreamPositionable

position:collectioncollection:readLimit:

TStreamReadWriteCommon

nextMatchFor:upToEnddo:next:

atEndnext

TStreamReadable

nextnext:peekpeekFor:sizeupTo:upToEnd

positioncollectionposition:readLimit:skip:

TStreamReadablePositionable nextPutAll: nextPut:

error:

TStreamWriteable

resetToStartnextPut:size

positionposition:skip:collectioncollection:readLimitreadLimit:writeLimitwriteLimit:

TStreamWriteablePositionable

StreamTop

collectionpositionreadLimit

StreamPositionableStream

StreamReadStream

closeclosedcontents

writeLimit

StreamReadWriteStream

-{#size}

writeLimitStreamWriteStream

Only a refactoring

• no positioningfor files

• peek dependson position andcollection

• . . .

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 10 / 19

Page 11: Redesigning with Traits

Nile

Outline

ContextTraitsProblemsStreams

NileImplementationResults

ConclusionFurther work

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 11 / 19

Page 12: Redesigning with Traits

Nile Implementation

Nile overview

Core

Collection-based Streams

File-based Streams

Character writing

Decoders

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 12 / 19

Page 13: Redesigning with Traits

Nile Implementation

Collection-based Streams

collectionposition

ReadableCollectionStream

collectionpositionwriteLimit

WriteableCollectionStream

collectionpositionwriteLimit

ReadWriteCollectionStream

do:nextMatchFor:next:peekFor:skip:skipTo:upTo:upToEndupToElementSatisfying:

atEndnextpeekoutputCollectionClass

TGettableStreamatEndatStartcloseisEmptyposition:resetsetToEnd

positionsetPosition:size

TPositionableStream

nextPutAll:next:put:print:flush

nextPut:TPuttableStream

contentssize

collectionsetCollection:

TCollectionStream

nextPut:size

writeLimitwriteLimit:

TWriteableCollectionStream

-{#size}

Core

nextpeekskip:outputCollectionClass

TReadableCollectionStream

• a trait per basic functionality• traits for collections and one class for each original Squeak class

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 13 / 19

Page 14: Redesigning with Traits

Nile Implementation

Other Implemented Libraries

Core

Collection-based Streams

File-based Streams

Character writing

Decoders

Other Implemented Libraries

Files file-based streamsRandom random number generator

SharedQueue queue concurrent accessDecoder pipe system to chain streams (compression,

multiplexing. . . )

and many others. . .

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 14 / 19

Page 15: Redesigning with Traits

Nile Results

New DesignGood Code Reuse

• good code reuse : 22 classes use TGettableStream• important gain : TCharacterWriting requires implementing one

method to gain 8

Better Implementation

• 18% fewer methods• 15% less byte-code• not forced to use unwanted behavior

Better Performance

• faster execution• traits don’t prevent optimization

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 15 / 19

Page 16: Redesigning with Traits

Nile Results

Trait-related Problems Discovered

• interface pollution• traits require accessors• sometimes an extra getter or setter

• IDE support for traits needs improvement• difficult to visualize and navigate

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 16 / 19

Page 17: Redesigning with Traits

Conclusion

Outline

ContextTraitsProblemsStreams

NileImplementationResults

ConclusionFurther work

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 17 / 19

Page 18: Redesigning with Traits

Conclusion Further work

Further Work

• Having an equivalent implementation?• much more entities (11 traits+classes compared to 4 classes in

Squeak)• simplify using only read/write access?• lot’s of ugly code in the original implementation

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 18 / 19

Page 19: Redesigning with Traits

Conclusion Further work

Conclusion

• Context• traits needed to be tested in a new project• a stream library is a good project example

• Realized work• existing implementation was analyzed• new design was created• efficient implementation• problem analysis

• really improves the design• needs further work

D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 19 / 19