Redesigning with Traits
-
Upload
esug -
Category
Technology
-
view
512 -
download
2
description
Transcript of 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
Outline
ContextTraitsProblemsStreams
NileImplementationResults
ConclusionFurther work
D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 2 / 19
Context
Outline
ContextTraitsProblemsStreams
NileImplementationResults
ConclusionFurther work
D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 3 / 19
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
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
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
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
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
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
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
Nile
Outline
ContextTraitsProblemsStreams
NileImplementationResults
ConclusionFurther work
D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 11 / 19
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
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
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
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
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
Conclusion
Outline
ContextTraitsProblemsStreams
NileImplementationResults
ConclusionFurther work
D. Cassou, S. Ducasse, R. Wuyts (Savoie, Bruxelles) Redesigning with Traits ESUG 2007 17 / 19
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
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