Redesigning with Traits

Post on 12-Nov-2014

512 views 2 download

Tags:

description

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

transcript

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