diff options
| author | fukachan <fukachan> | 2001-01-29 16:50:21 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2001-01-29 16:50:21 +0000 |
| commit | efa7bfa8fadad5d1ce42055a1ec573b7eabc3e04 (patch) | |
| tree | 9ae830981ac2cc6bebc1dec0623c0b2f2071ef7e /doc | |
| parent | 1a739f4283da2aaa9e4a649652a60ec94eb5bf7d (diff) | |
| download | fml8-efa7bfa8fadad5d1ce42055a1ec573b7eabc3e04.tar.gz fml8-efa7bfa8fadad5d1ce42055a1ec573b7eabc3e04.tar.bz2 fml8-efa7bfa8fadad5d1ce42055a1ec573b7eabc3e04.zip | |
move design memo to devel/
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/design/opdyke-thesis.ps | 20107 | ||||
| -rw-r--r-- | doc/memo/00modlist.long.txt | 3481 | ||||
| -rw-r--r-- | doc/memo/01_good_modules | 1401 | ||||
| -rw-r--r-- | doc/memo/99modlist.txt | 3481 | ||||
| -rw-r--r-- | doc/memo/TODO | 2 |
5 files changed, 0 insertions, 28472 deletions
diff --git a/doc/design/opdyke-thesis.ps b/doc/design/opdyke-thesis.ps deleted file mode 100644 index 7e4c0bb9..00000000 --- a/doc/design/opdyke-thesis.ps +++ /dev/null @@ -1,20107 +0,0 @@ -%! -/GlSave save def /TeXDict 200 dict def TeXDict begin /Resolution 300 def /Inch -{Resolution mul}def /Mtrx 6 array def /@letter{letter initmatrix 72 Resolution -div dup neg scale 310 -3005 translate Mtrx currentmatrix pop}def /@copies{ -/#copies exch def}def /@restore /restore load def /restore{vmstatus pop dup -@VMused lt{pop @VMused}if exch pop exch @restore /@VMused exch def}def /@pri{ -( )print( )cvs print}def /@FontMatrix[1 -0 0 -1 0 0]def /@FontBBox[0 0 1 1]def /dmystr(ZZf@@)def /newname{dmystr cvn} -def /df{/fontname exch def dmystr 2 fontname cvx(@@@)cvs putinterval newname 7 -dict def newname load begin /FontType 3 def /FontMatrix @FontMatrix def -/FontBBox @FontBBox def /BitMaps 128 array def /BuildChar{CharBuilder}def -/Encoding 128 array def 0 1 127{Encoding exch /.undef put}for end newname -newname load definefont setfont fontname{/foo setfont}2 array copy cvx def -fontname load 0 dmystr 5 string copy cvn cvx put}def /ch-image{ch-data 0 get} -def /ch-width{ch-data 1 get}def /ch-height{ch-data 2 get}def /ch-xoff{ch-data -3 get}def /ch-yoff{ch-data 4 get}def /ch-tfmw{ch-data 5 get}def /CharBuilder{ -save 3 1 roll exch /BitMaps get exch get /ch-data exch def ch-data null ne{ -ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub -setcachedevice ch-width ch-height true[1 0 0 1 ch-xoff ch-yoff]{ch-image} -imagemask}if restore}def /dc{/ch-code exch def dup 0 get length 2 lt{pop[<00> -1 1 0 0 8.00]}if /ch-data exch def currentfont /BitMaps get ch-code ch-data -put currentfont /Encoding get ch-code dup( )cvs cvn put}def /bop{erasepage -initgraphics Mtrx setmatrix /SaveImage save def 0 0 moveto}def /eop{showpage -SaveImage restore}def /@start{@letter vmstatus pop /@VMused exch def pop}def -/@end{(VM used: )print @VMused @pri(. Unused: )print vmstatus @VMused sub @pri -pop pop(\n)print flush end GlSave restore}def /p{show}def /v{/dy exch neg def -/dx exch def /x1 currentpoint /y1 exch def def newpath x1 y1 moveto dx 0 -rlineto 0 dy rlineto dx neg 0 rlineto closepath fill x1 y1 moveto}def /li{ -lineto}def /rl{rlineto}def /rc{rcurveto}def /np{/SaveX currentpoint /SaveY -exch def def newpath}def /st{stroke SaveX SaveY moveto}def /fi{fill SaveX -SaveY moveto}def /ellipse{/endangle exch def /startangle exch def /yrad exch -def /xrad exch def /y exch def /x exch def /savematrix matrix currentmatrix -def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix -setmatrix}def /a{moveto}def /delta 0 def /b{exch p dup /delta exch def 0 -rmoveto}def /c{p delta 4 sub dup /delta exch def 0 rmoveto}def /d{p delta 3 -sub dup /delta exch def 0 rmoveto}def /e{p delta 2 sub dup /delta exch def 0 -rmoveto}def /f{p delta 1 sub dup /delta exch def 0 rmoveto}def /g{p delta 0 -rmoveto}def /h{p delta 1 add dup /delta exch def 0 rmoveto}def /i{p delta 2 -add dup /delta exch def 0 rmoveto}def /j{p delta 3 add dup /delta exch def 0 -rmoveto}def /k{p delta 4 add dup /delta exch def 0 rmoveto}def /l{p -4 0 -rmoveto}def /m{p -3 0 rmoveto}def /n{p -2 0 rmoveto}def /o{p -1 0 rmoveto}def -/q{p 1 0 rmoveto}def /r{p 2 0 rmoveto}def /s{p 3 0 rmoveto}def /t{p 4 0 -rmoveto}def /w{0 rmoveto}def /x{0 exch rmoveto}def /y{3 -1 roll p moveto}def -/bos{/section save def}def /eos{section restore}def /@MacSetUp{userdict /md -known{userdict /md get type /dicttype eq{md begin /letter{}def /note{}def -/legal{}def /od{txpose 1 0 mtx defaultmatrix dtransform exch atan/pa exch def -newpath clippath mark{transform{itransform moveto}}{transform{itransform -lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{ -itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{ -closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put -10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}def /txpose{pxs pys -scale ppr aload pop por{noflips{pop exch neg exch translate pop 1 -1 scale}if -xflip yflip and{pop exch neg exch translate 180 rotate 1 -1 scale ppr 3 get -ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if xflip yflip -not and{pop exch neg exch translate pop 180 rotate ppr 3 get ppr 1 get neg sub -neg 0 translate}if yflip xflip not and{ppr 1 get neg ppr 0 get neg translate} -if}{noflips{translate pop pop 270 rotate 1 -1 scale}if xflip yflip and{ -translate pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 -get ppr 0 get neg sub neg translate}if xflip yflip not and{translate pop pop -90 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{ -translate pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 exch translate} -if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 -copy translate .96 dup scale neg exch neg exch translate}if}def /cp{pop pop -showpage pm restore}def end}if}if}def /psf$TeXscale{65536 div}def -/DocumentInitState[matrix currentmatrix currentlinewidth currentlinecap -currentlinejoin currentdash currentgray currentmiterlimit]cvx def /startTexFig -{/psf$SavedState save def userdict maxlength dict begin currentpoint transform -DocumentInitState setmiterlimit setgray setdash setlinejoin setlinecap -setlinewidth setmatrix itransform moveto /psf$ury exch psf$TeXscale def -/psf$urx exch psf$TeXscale def /psf$lly exch psf$TeXscale def /psf$llx exch -psf$TeXscale def /psf$y exch psf$TeXscale def /psf$x exch psf$TeXscale def -currentpoint /psf$cy exch def /psf$cx exch def /psf$sx psf$x psf$urx psf$llx -sub div def /psf$sy psf$y psf$ury psf$lly sub div def psf$sx psf$sy scale -psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub translate -/DefFigCTM matrix currentmatrix def /initmatrix{DefFigCTM setmatrix}def -/defaultmatrix{DefFigCTM exch copy}def /initgraphics{DocumentInitState -setmiterlimit setgray setdash setlinejoin setlinecap setlinewidth setmatrix -DefFigCTM setmatrix}def /showpage{initgraphics}def @MacSetUp}def /doclip{ -currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll exch lineto -exch lineto exch lineto closepath clip newpath moveto}def /endTexFig{end -psf$SavedState restore}def end statusdict /waittimeout 300 put -TeXDict begin @start bos /fa df[<001FE000007FF80001FFFE0007E01F800F8007C01E00 -01E01C0000E038000070380000707000003870000038E000001CE000001CE000001CE000001CE0 -00001CE000001CE000001CE000001CE000001CE000001CE000001CE000001CE000001CE000001C -E000001CE000001CE000001CE000001CE000001CE000001CE000001CE000001CE000001CE00000 -1CE000001CE000001CE000001CE000001CE000001CE000001CE000001C>30 42 -2 42 35]83 -dc[<0000FF8000000007FFF00000001FFFFC0000007F007F000000F8000F800003E00003E00007 -C00001F0000700000070000E00000038001E0000003C001C0000001C00380000000E0038000000 -0E00700000000700700000000700700000000700E00000000380E00000000380E00000000380E0 -0000000380E00000000380E00000000380E00000000380E00000000380E00000000380E0000000 -0380E00000000380E00000000380E00000000380E00000000380E00000000380E00000000380E0 -0000000380E00000000380E00000000380E00000000380E00000000380E00000000380E0000000 -0380E00000000380E00000000380E00000000380E00000000380E00000000380E00000000380E0 -0000000380E00000000380E00000000380E00000000380E00000000380E00000000380E0000000 -0380E00000000380E00000000380E00000000380E00000000380E00000000380E00000000380> -41 58 -2 58 46]91 dc /fb df[<0000FFF0000000FFE000000FFFFF00000FFFFC00007FFFFF -C0007FFFFF0000FFFFFFF001FFFFFFC003FFFFFFFC07FFFFFFE007FFF01FFF1FFFF01FF00FFFC0 -01FFFFFF8007F81FFF80003FFFFE0001F83FFF00000FFFFC0000FC3FFE000007FFF000007C7FFE -00000FFFE000007E7FFC00001FFFC000003EFFFC00003FFF8000003EFFFC00007FFFC0000000FF -FC0000FFFFE0000000FFF80001FFFFF0000000FFF80003FFF9F8000000FFF80007FFF0FC000000 -FFF8000FFFE07C0000007FF8001FFFC07E0000007FF8003FFF803F0000007FF8007FFF001F8000 -003FF8007FFF000FC000001FF800FFFE0007C000000FFC01FFFC0007E0000007FC01FFF80003F0 -000003FC03FFF00001F8000001FE07FFF00000F8000000FE07FFE00000FC0000007F0FFFC00000 -7E0000001F0FFF8000003E0000000F9FFF8000003F00000007FFFF0000001F80000003FFFF0000 -000F80000001FFFE0000000FC0000000FFFC00000007E00000007FFC00000003E0000000FFF800 -000003F0000000FFF800000001F8000000FFF800000000F8000001FFF000000000FC000001FFF8 -00000001FF000001FFFC0000007FFFFF0001FFFE0000007FFFFF0003FFFF0000007FFFFF0003FF -CF8000007FFFFF0003FFC7C000007FFFFF0003FFC3E000000000000003FF81F000000000000007 -FF80F800000000000007FF807C00000000000007FF807C00000000000007FF803E000000000000 -07FF001F00000000000007FF001F00000000000007FF000F80000000000007FF000F8000000000 -0007FF0007C0000000000007FF0007C0000000000007FF0007C0000000000003FF0007C0000000 -000003FF0007C0000000000003FF0007C0000000000001FF0007C0000000000001FF800FC00000 -00000000FF800F800000000000007FC00F800000000000007FC01F000000000000003FE01F0000 -00000000001FF87E0000000000000007FFFC0000000000000003FFF80000000000000000FFF000 -000000000000001FC00000000000>80 74 -5 1 92]38 dc[<0C00001E00001F00000F800007C0 -0003E00001F00000F00000F800007800003C00003C00001E00001E00000F00000F00000F00000F -0000078000078007E7801FFF803FFF807FFF807FFF80FFFF80FFFF80FFFF80FFFF00FFFF00FFFE -007FFE007FFC003FFC001FF00007C000>17 36 -8 20 33]44 dc[<FFFFFFFEFFFFFFFEFFFFFF -FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFE>31 10 -1 -18 40]45 -dc[<07E00FF03FFC3FFC7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE3FFC3FFC0FF007E00000000000 -000000000000000000000000000000000000000000000007E00FF03FFC3FFC7FFEFFFFFFFFFFFF -FFFFFFFFFFFF7FFE3FFC3FFC0FF007E0>16 46 -8 0 33]58 dc[<FFFFFFC00007FFFFFFFF80FF -FFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFFC00007FF -FFFFFF80007FC000000001FFFC0000001F0000000003FFFC0000001F8000000003FFFC0000000F -8000000003FFF80000000FC000000007FFF800000007C000000007FFF000000007C00000000FFF -F000000007E00000000FFFF000000003E00000000FFFE000000003F00000001FFFE000000001F0 -0000001FFFC000000001F00000003FFFC000000001F80000003FFFC000000000F80000003FFF80 -00000000FC0000007FFF80000000007FFFFFFFFFFF00000000007FFFFFFFFFFF00000000007FFF -FFFFFFFF00000000003FFFFFFFFFFE00000000003FFFFFFFFFFE00000000001F000001FFFC0000 -0000001F800003FFFC00000000000F800003FFF800000000000F800007FFF800000000000FC000 -07FFF8000000000007C00007FFF0000000000007E0000FFFF0000000000003E0000FFFE0000000 -000003E0001FFFE0000000000003F0001FFFE0000000000001F0001FFFC0000000000001F8003F -FFC0000000000000F8003FFF80000000000000F8007FFF80000000000000FC007FFF8000000000 -00007C007FFF000000000000007E00FFFF000000000000003E00FFFE000000000000003F01FFFE -000000000000001F01FFFC000000000000001F03FFFC000000000000001F83FFFC000000000000 -000F83FFF8000000000000000FC7FFF80000000000000007C7FFF00000000000000007CFFFF000 -00000000000007EFFFF00000000000000003EFFFE00000000000000003FFFFE000000000000000 -01FFFFC00000000000000001FFFFC00000000000000001FFFFC00000000000000000FFFF800000 -000000000000FFFF8000000000000000007FFF0000000000000000007FFF000000000000000000 -7FFF0000000000000000003FFE0000000000000000003FFE0000000000000000001FFC00000000 -00000000001FFC0000000000000000000FF80000000000000000000FF80000000000000000000F -F800000000000000000007F000000000000000000007F000000000000000000003E00000000000 ->81 72 -4 0 90]65 dc[<FFFFFFFFFFFFF80000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFF000FF -FFFFFFFFFFFFFC00FFFFFFFFFFFFFFFF00001FFF800001FFFF80001FFF8000003FFFE0001FFF80 -00001FFFE0001FFF80000007FFF0001FFF80000007FFF8001FFF80000003FFFC001FFF80000001 -FFFC001FFF80000001FFFE001FFF80000000FFFE001FFF80000000FFFE001FFF80000000FFFF00 -1FFF80000000FFFF001FFF80000000FFFF001FFF800000007FFF001FFF800000007FFF001FFF80 -0000007FFF001FFF800000007FFF001FFF80000000FFFF001FFF80000000FFFE001FFF80000000 -FFFE001FFF80000000FFFE001FFF80000000FFFC001FFF80000001FFFC001FFF80000001FFF800 -1FFF80000003FFF8001FFF80000003FFF0001FFF80000007FFE0001FFF8000000FFFC0001FFF80 -00003FFF00001FFF800000FFFC00001FFFFFFFFFFFF000001FFFFFFFFFFF8000001FFFFFFFFFFE -0000001FFFFFFFFFFFC000001FFF800007FFF000001FFF800001FFFC00001FFF8000007FFE0000 -1FFF8000003FFF00001FFF8000001FFF80001FFF8000000FFFC0001FFF8000000FFFE0001FFF80 -000007FFE0001FFF80000007FFF0001FFF80000003FFF0001FFF80000003FFF8001FFF80000003 -FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF800 -1FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF0001FFF80000007FFF0001FFF80 -000007FFF0001FFF80000007FFE0001FFF8000000FFFC0001FFF8000001FFFC0001FFF8000003F -FF80001FFF8000007FFF00001FFF800001FFFE00FFFFFFFFFFFFFFF800FFFFFFFFFFFFFFF000FF -FFFFFFFFFFFFC000FFFFFFFFFFFFFE0000FFFFFFFFFFFFE00000>72 71 -4 0 84]66 dc[<0000 -00003FFE0000000000000FFFFFE000000000007FFFFFFC0000000003FFFFFFFF000000000FFFFF -FFFFC00000003FFFF8007FF0000000FFFF80000FF8000001FFFC000001FC000007FFF0000000FE -00000FFFC00000003F00001FFF800000001F80003FFF000000000FC0007FFE0000000007E000FF -FC0000000003E001FFF80000000001F003FFF00000000001F803FFF00000000000F807FFE00000 -000000F807FFE000000000007C0FFFC000000000007C0FFFC000000000007C1FFFC00000000000 -3E1FFF8000000000003E3FFF8000000000003E3FFF8000000000003E3FFF8000000000003E7FFF -8000000000003E7FFF000000000000007FFF000000000000007FFF00000000000000FFFF000000 -00000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF000000000000 -00FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF -00000000000000FFFF00000000000000FFFF00000000000000FFFF000000000000007FFF000000 -000000007FFF000000000000007FFF0000000000003E7FFF8000000000003E3FFF800000000000 -3E3FFF8000000000003E3FFF8000000000007E1FFF8000000000007E1FFFC000000000007E0FFF -C000000000007E0FFFC00000000000FE07FFE00000000000FE07FFE00000000001FE03FFF00000 -000001FE03FFF00000000003FE01FFF80000000007FE00FFFC0000000007FE007FFE000000000F -FE003FFF000000001FFE001FFF800000003FFE000FFFC00000007FFE0007FFF0000001FFFE0001 -FFFC000003FFFE0000FFFF80000FF7FE00003FFFF800FFC3FE00000FFFFFFFFF81FE000003FFFF -FFFE00FE0000007FFFFFF8003E0000000FFFFFC0001E000000003FFE00000E>71 73 -7 1 86] -67 dc[<FFFFFFFFFFFFC0000000FFFFFFFFFFFFFE000000FFFFFFFFFFFFFFC00000FFFFFFFFFF -FFFFF80000FFFFFFFFFFFFFFFE0000001FFF800003FFFF0000001FFF8000007FFFC000001FFF80 -00000FFFE000001FFF80000003FFF000001FFF80000001FFF800001FFF800000007FFC00001FFF -800000003FFE00001FFF800000003FFF00001FFF800000001FFF80001FFF800000000FFF80001F -FF800000000FFFC0001FFF8000000007FFE0001FFF8000000007FFE0001FFF8000000003FFF000 -1FFF8000000003FFF0001FFF8000000003FFF0001FFF8000000001FFF8001FFF8000000001FFF8 -001FFF8000000001FFF8001FFF8000000001FFFC001FFF8000000001FFFC001FFF8000000001FF -FC001FFF8000000001FFFC001FFF8000000001FFFE001FFF8000000000FFFE001FFF8000000000 -FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF80000000 -00FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF800000 -0000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000001FFFE001FFF8000 -000001FFFC001FFF8000000001FFFC001FFF8000000001FFFC001FFF8000000001FFFC001FFF80 -00000001FFFC001FFF8000000001FFF8001FFF8000000001FFF8001FFF8000000003FFF8001FFF -8000000003FFF0001FFF8000000003FFF0001FFF8000000003FFE0001FFF8000000007FFE0001F -FF8000000007FFC0001FFF800000000FFFC0001FFF800000000FFF80001FFF800000001FFF0000 -1FFF800000003FFF00001FFF800000007FFE00001FFF80000000FFFC00001FFF80000001FFF800 -001FFF80000007FFF000001FFF8000000FFFE000001FFF8000007FFF8000001FFF800007FFFF00 -00FFFFFFFFFFFFFFFC0000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFC00000FFFFFFFFFFFFFE00 -0000FFFFFFFFFFFFC0000000>79 71 -4 0 91]68 dc[<FFFFFFFFFFFFFFFF80FFFFFFFFFFFFFF -FF80FFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFC0001FFFC00000FFFFC000 -1FFFC000000FFFC0001FFFC0000003FFC0001FFFC0000000FFE0001FFFC00000007FE0001FFFC0 -0000003FE0001FFFC00000001FE0001FFFC00000000FE0001FFFC000000007E0001FFFC0000000 -07F0001FFFC000000003F0001FFFC000000003F0001FFFC000000001F0001FFFC000000001F000 -1FFFC000000001F0001FFFC000000001F8001FFFC000000000F8001FFFC0007C0000F8001FFFC0 -007C0000F8001FFFC0007C0000F8001FFFC0007C00007C001FFFC0007C00007C001FFFC0007C00 -007C001FFFC000FC000000001FFFC000FC000000001FFFC000FC000000001FFFC001FC00000000 -1FFFC003FC000000001FFFC01FFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFFF -FFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFC01FFC000000001FFFC003FC00 -0000001FFFC001FC000000001FFFC000FC000000001FFFC000FC000000001FFFC000FC00000000 -1FFFC0007C0007C0001FFFC0007C0007C0001FFFC0007C0007C0001FFFC0007C0007C0001FFFC0 -007C000F80001FFFC0007C000F80001FFFC00000000F80001FFFC00000000F80001FFFC0000000 -1F80001FFFC00000001F80001FFFC00000001F80001FFFC00000003F80001FFFC00000003F0000 -1FFFC00000007F00001FFFC00000007F00001FFFC0000000FF00001FFFC0000003FF00001FFFC0 -000007FF00001FFFC000001FFF00001FFFC00001FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF -FE00FFFFFFFFFFFFFFFE00FFFFFFFFFFFFFFFE00FFFFFFFFFFFFFFFE00>70 70 -4 0 78]69 dc -[<FFFFFFFFFF00000000FFFFFFFFFF00000000FFFFFFFFFF00000000FFFFFFFFFF00000000FFFF -FFFFFF00000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000 -00000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000000000 -00001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001F -FFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000 -7C000000001FFFC0007C000000001FFFC0007C000000001FFFC0007C000000001FFFC0007C0000 -00001FFFC0007C000000001FFFC000FC000000001FFFC000FC000000001FFFC000FC000000001F -FFC001FC000000001FFFC003FC000000001FFFC01FFC000000001FFFFFFFFC000000001FFFFFFF -FC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFC01FFC0000 -00001FFFC003FC000000001FFFC001FC000000001FFFC000FC000000001FFFC000FC000000001F -FFC000FC000000001FFFC0007C000000001FFFC0007C000F80001FFFC0007C000F80001FFFC000 -7C000F80001FFFC0007C000F80001FFFC0007C001F00001FFFC00000001F00001FFFC00000001F -00001FFFC00000001F00001FFFC00000001F00001FFFC00000003F00001FFFC00000003F00001F -FFC00000007F00001FFFC00000007E00001FFFC0000000FE00001FFFC0000000FE00001FFFC000 -0001FE00001FFFC0000003FE00001FFFC000000FFE00001FFFC000003FFE00001FFFC00003FFFE -00FFFFFFFFFFFFFFFE00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFC00FFFF -FFFFFFFFFFFC00>65 70 -4 0 75]70 dc[<000000003FFE000000000000000FFFFFE0000E0000 -00007FFFFFF8003E00000003FFFFFFFE00FE0000000FFFFFFFFF83FE0000003FFFFC00FFC7FE00 -0000FFFF80001FFFFE000001FFFC000007FFFE000007FFF0000003FFFE00000FFFE0000001FFFE -00001FFF80000000FFFE00003FFF00000000FFFE00007FFE00000000FFFE0000FFFC00000000FF -FE0001FFF800000000FFFE0003FFF800000000FFFE0003FFF000000000FFFE0007FFE000000000 -FFFE0007FFE000000000FFFE000FFFC000000000FFFE000FFFC000000000FFFE001FFFC0000000 -00FFFE001FFF8000000000FFFE003FFF8000000000FFFE003FFF8000000000FFFE003FFF800000 -0000FFFE007FFF8000007FFFFFFFFE7FFF8000007FFFFFFFFE7FFF0000007FFFFFFFFE7FFF0000 -007FFFFFFFFEFFFF0000007FFFFFFFFEFFFF0000000000000000FFFF0000000000000000FFFF00 -00000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF -0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FF -FF0000000000000000FFFF00000000000000007FFF00000000000000007FFF0000000000000000 -7FFF0000000000003E007FFF8000000000003E003FFF8000000000003E003FFF8000000000003E -003FFF8000000000007E001FFF8000000000007E001FFFC000000000007E000FFFC00000000000 -7E000FFFC00000000000FE0007FFE00000000000FE0007FFE00000000001FE0003FFF000000000 -01FE0003FFF00000000003FE0001FFF80000000007FE0000FFFC0000000007FE00007FFE000000 -000FFE00003FFF000000001FFE00001FFF800000003FFE00000FFFC00000007FFE000007FFF000 -0001FFFE000001FFFC000003FFFE000000FFFF80000FF7FE0000003FFFF800FFC3FE0000000FFF -FFFFFF81FE00000003FFFFFFFE00FE000000007FFFFFF8003E000000000FFFFFC0001E00000000 -003FFE00000E00>79 73 -7 1 93]71 dc[<FFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFF -FFFFFFFE000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000 -000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0 -00000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFF -E000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000F -FFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE00000 -0FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000 -000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0 -00000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000FFFFFF -FFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE>39 71 -3 0 45]73 dc[<FFFFFFFFFFFF -FFC0FFFFFFFFFFFFFFC0FFFFFFFFFFFFFFC0FFFFFFFFFFFFFFC0FFFFFFFFFFFFFFC0001FFFC000 -7FFFE0001FFFC0000FFFE0001FFFC00003FFE0001FFFC00000FFE0001FFFC000007FE0001FFFC0 -00003FE0001FFFC000001FE0001FFFC000001FE0001FFFC000000FE0001FFFC0000007F0001FFF -C0000007F0001FFFC0000003F0001FFFC0000003F0001FFFC0000003F0001FFFC0000001F0001F -FFC0000001F0001FFFC0000001F0001FFFC0000001F0001FFFC0000001F0001FFFC0000000F800 -1FFFC0000000F8001FFFC0000000F8001FFFC0000000F8001FFFC000000000001FFFC000000000 -001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC0000000 -00001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC00000 -0000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000 -000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC0 -00000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFF -C000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001F -FFC000000000001FFFC000000000001FFFC000000000001FFFC000000000001FFFC00000000000 -1FFFC000000000001FFFC000000000FFFFFFFFFF000000FFFFFFFFFF000000FFFFFFFFFF000000 -FFFFFFFFFF000000FFFFFFFFFF000000>61 71 -4 0 71]76 dc[<FFFFFFF00003C00007FFFFFF -FFFFFFFFF00007E00007FFFFFFFFFFFFFFF00007E00007FFFFFFFFFFFFFFF0000FF00007FFFFFF -FFFFFFFFF0000FF00007FFFFFFFF007FE000000FF0000000FFF800001F8000001FF8000000FFF8 -00001F8000001FF8000000FFF800001F8000003FFC000000FFF800001F8000003FFC000000FFF8 -00001F8000007FFE000000FFF800001F8000007FFE000000FFF800001F800000FFFF000000FFF8 -00001F800000FFFF000000FFF800001F800001FFF7800000FFF800001F800001FFF7800000FFF8 -00001F800001FFF7800000FFF800001F800003FFE3C00000FFF800001F800003FFE3C00000FFF8 -00001F800007FFC1E00000FFF800001F800007FFC1E00000FFF800001F80000FFF80F00000FFF8 -00001F80000FFF80F00000FFF800001F80001FFF00780000FFF800001F80001FFF00780000FFF8 -00001F80001FFF00780000FFF800001F80003FFE003C0000FFF800001F80003FFE003C0000FFF8 -00001F80007FFC001E0000FFF800001F80007FFC001E0000FFF800001F8000FFF8000F0000FFF8 -00001F8000FFF8000F0000FFF800001F8001FFF000078000FFF800001F8001FFF000078000FFF8 -00001F8003FFE00003C000FFF800001F8003FFE00003C000FFF800001F8003FFE00003C000FFF8 -00001F8007FFC00001E000FFF800001F8007FFC00001E000FFF800001F800FFF800000F000FFF8 -00001F800FFF800000F000FFF800001F801FFF0000007800FFF800001F801FFF0000007800FFF8 -00001F803FFE0000003C00FFF800001F803FFE0000003C00FFF800001F807FFC0000001E00FFF8 -00001F807FFC0000001E00FFF800001F807FFC0000001E00FFF800001F80FFF80000000F00FFF8 -00001F80FFF80000000F00FFF800001F81FFF00000000780FFF800001F81FFF00000000780FFF8 -00001F83FFE000000003C0FFF800001F83FFE000000003C0FFF800001F87FFC000000001E0FFF8 -00001F87FFC000000001E0FFF800001F87FFC000000001E0FFF800001F8FFF8000000000F0FFF8 -00001F8FFF8000000000F0FFF800001F9FFF000000000078FFF800001F9FFF000000000078FFF8 -00001FBFFE00000000003CFFF800001FBFFE00000000003CFFF800001FFFFC00000000001EFFF8 -00001FFFFC00000000001EFFF800001FFFF800000000000FFFF800FFFFFFF800000000000FFFFF -FFFFFFFFF800000000000FFFFFFFFFFFFFF0000000000007FFFFFFFFFFFFF0000000000007FFFF -FFFFFFFFE0000000000003FFFFFF>104 71 -4 0 113]77 dc[<FFFFFFFFF800000000FFFFFFFF -F800000000FFFFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF800000000001FFFC0000000 -0000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000000000 -1FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0 -0000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000 -0000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000000000 -1FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0 -0000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000 -0000001FFFFFFFFFF00000001FFFFFFFFFFE0000001FFFFFFFFFFFC000001FFFFFFFFFFFF00000 -1FFF80000FFFF800001FFF800001FFFE00001FFF8000007FFF00001FFF8000003FFF80001FFF80 -00001FFF80001FFF8000000FFFC0001FFF8000000FFFE0001FFF8000000FFFE0001FFF80000007 -FFF0001FFF80000007FFF0001FFF80000007FFF0001FFF80000007FFF8001FFF80000007FFF800 -1FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80 -000007FFF8001FFF80000007FFF8001FFF80000007FFF0001FFF80000007FFF0001FFF80000007 -FFF0001FFF8000000FFFE0001FFF8000000FFFE0001FFF8000000FFFC0001FFF8000001FFFC000 -1FFF8000003FFF80001FFF8000007FFF00001FFF800001FFFE00001FFF80000FFFFC00FFFFFFFF -FFFFFFF000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFC0000FFFFFFFFFFFF80 -0000>69 71 -4 0 81]80 dc[<0000000000000000FFF000FFFFFFFFF000001FFFFC00FFFFFFFF -F000007FFFFE00FFFFFFFFF00001FFFFFF00FFFFFFFFF00003FFFC1F80FFFFFFFFF00007FFF007 -C0001FFF8000000FFFE007E0001FFF8000001FFFE003E0001FFF8000003FFFC003F0001FFF8000 -003FFFC001F0001FFF8000007FFFC001F0001FFF8000007FFFC001F0001FFF8000007FFF8001F0 -001FFF8000007FFF8000E0001FFF8000007FFF800000001FFF8000007FFF800000001FFF800000 -7FFF800000001FFF8000007FFF800000001FFF8000007FFF800000001FFF8000007FFF00000000 -1FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007F -FF000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFE000000001F -FF800000FFFE000000001FFF800000FFFE000000001FFF800001FFFC000000001FFF800001FFF8 -000000001FFF800003FFF0000000001FFF800007FFE0000000001FFF80001FFFC0000000001FFF -80007FFF80000000001FFFFFFFFFFE00000000001FFFFFFFFFF800000000001FFFFFFFFFFE0000 -0000001FFFFFFFFFFFC0000000001FFF80001FFFF0000000001FFF800003FFF8000000001FFF80 -0000FFFE000000001FFF8000003FFF000000001FFF8000001FFF800000001FFF8000000FFFC000 -00001FFF8000000FFFE00000001FFF8000000FFFE00000001FFF80000007FFF00000001FFF8000 -0007FFF00000001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000 -001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000001FFF800000 -07FFF80000001FFF80000007FFF80000001FFF80000007FFF00000001FFF80000007FFF0000000 -1FFF8000000FFFE00000001FFF8000000FFFE00000001FFF8000000FFFC00000001FFF8000001F -FF800000001FFF8000003FFF800000001FFF8000007FFF000000001FFF800001FFFC000000001F -FF80001FFFF8000000FFFFFFFFFFFFFFE0000000FFFFFFFFFFFFFF80000000FFFFFFFFFFFFFE00 -000000FFFFFFFFFFFFF000000000FFFFFFFFFFFC0000000000>84 72 -4 1 89]82 dc[<E00003 -FFC00000F0007FFFF80000F803FFFFFF0000FC0FFFFFFF8000FE3FFFFFFFE000FFFFFC007FF000 -FFFF80000FF800FFFE000007FC00FFF8000003FE00FFE0000001FE00FFC0000000FF00FF800000 -00FF80FF00000000FF80FE000000007F80FE000000007FC0FC000000007FC0FC000000007FC0FC -000000007FE0F8000000007FE0F8000000007FE0F8000000007FE0F800000000FFE0F800000000 -FFE07800000001FFE00000000003FFE00000000007FFE0000000000FFFE0000000001FFFC00000 -0000FFFFC00000000FFFFFC0000001FFFFFF8000003FFFFFFF800001FFFFFFFF00000FFFFFFFFF -00003FFFFFFFFE00007FFFFFFFFE0000FFFFFFFFFC0003FFFFFFFFF80007FFFFFFFFF00007FFFF -FFFFE0000FFFFFFFFFC0001FFFFFFFFF00001FFFFFFFFC00003FFFFFFFF000003FFFFFFF000000 -7FFFFFE00000007FFFFE000000007FFFC000000000FFFF0000000000FFFC0000001F00FFF80000 -001F00FFF00000001F00FFE00000001F00FFE00000003F00FFC00000003F00FFC00000003F00FF -C00000003F007FC00000007F007FC00000007F007FC0000000FF003FC0000001FF003FE0000001 -FF001FE0000003FF001FF0000007FF000FF000001FFF0007FC00003FFF0007FE0000FFFF0003FF -C00FFEFF0000FFFFFFFC7F00007FFFFFF03F00001FFFFFC01F000007FFFF000F0000007FF00007 -00>51 73 -7 1 66]83 dc[<0003FFFFFFFFFFF800000003FFFFFFFFFFF800000003FFFFFFFFFF -F800000003FFFFFFFFFFF800000003FFFFFFFFFFF8000000000003FFF80000000000000003FFF8 -0000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FF -F80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003 -FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000000000 -03FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000000000 -0003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000 -000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000 -00000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000 -0000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80000 -000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800 -00000000000003FFF80000000000000003FFF80000000000000003FFF800000000F8000003FFF8 -000007C0F8000003FFF8000007C0F8000003FFF8000007C0F8000003FFF8000007C0F8000003FF -F8000007C0FC000003FFF800000FC07C000003FFF800000F807C000003FFF800000F807C000003 -FFF800000F807C000003FFF800000F807E000003FFF800000F807E000003FFF800001F807E0000 -03FFF800001F807F000003FFF800003F807F000003FFF800003F807F800003FFF800007F807FC0 -0003FFF80000FF807FE00003FFF80001FF807FF80003FFF80007FF803FFF0003FFF8003FFF003F -FFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF00 -3FFFFFFFFFFFFFFFFF00>74 70 -4 0 83]84 dc[<0000000001F000000000000000000003F800 -000000000000000003F800000000000000000007FC00000000000000000007FC00000000000000 -00000FFE0000000000000000000FFE0000000000000000001FFF0000000000000000001FFF0000 -000000000000001FFF0000000000000000003FFF8000000000000000003FFF8000000000000000 -007FFFC000000000000000007FFFC00000000000000000FFFFE00000000000000000FFFFE00000 -000000000001FFFFF00000000000000001FFFFF00000000000000001FFFDF00000000000000003 -FFFDF80000000000000003FFF8F80000000000000007FFF8FC0000000000000007FFF87C000000 -000000000FFFF07E000000000000000FFFF03E000000000000000FFFE03E000000000000001FFF -E03F000000000000001FFFC01F000000000000003FFFC01F800000000000003FFFC00F80000000 -0000007FFF800FC00000000000007FFF8007C0000000000000FFFF0007E0000000000000FFFF00 -03E0000000000000FFFE0003E0000000000001FFFE0003F0000000000001FFFC0001F000000000 -0003FFFC0001F8000000000003FFFC0000F8000000000007FFF80000FC000000000007FFF80000 -7C00000000000FFFF000007E00000000000FFFF000007E00000000000FFFE000003E0000000000 -1FFFE000003F00000000001FFFC000001F00000000003FFFC000001F80000000003FFFC000000F -80000000007FFF8000000FC0000000007FFF80000007C0000000007FFF00000007C000000000FF -FF00000007E000000000FFFE00000003E000000001FFFE00000003F000000001FFFE00000001F0 -00000003FFFC00000001F800000003FFFC00000000F800000007FFF800000000FC00000007FFF8 -000000007C00000007FFF0000000007C0000000FFFF0000000007E0000000FFFE0000000003E00 -00001FFFE0000000003F0000001FFFE0000000001F0000003FFFC0000000001F8000003FFFC000 -0000000F8000007FFF80000000003FE000FFFFFFFFE000001FFFFFE0FFFFFFFFE000001FFFFFE0 -FFFFFFFFE000001FFFFFE0FFFFFFFFE000001FFFFFE0FFFFFFFFE000001FFFFFE0>83 72 -3 1 -90]86 dc[<0003FF80007FF8007FFFF001FFFC01FFFFFC03FFFC07FFFFFF07FFFC0FFFC03F8FFF -F83FFF0007CFFF003FFC0003EFFC007FF80001EFFC007FF80000FFFC00FFF000007FFC00FFF000 -003FFC00FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF000003FFC007FF800003FFC00 -7FF800003FFC003FFC00003FFC001FFE00003FFC000FFF00003FFC0007FFC0003FFC0003FFF000 -3FFC0000FFFE003FFC00003FFFE03FFC000007FFFFFFFC000000FFFFFFFC00000007FFFFFC0000 -0000003FFC00000000003FFC00000000003FFC00000000003FFC0000F800003FFC0003FE00003F -FC0007FF00003FFC0007FF00003FFC000FFF80007FF8000FFF80007FF8000FFF80007FF0000FFF -8000FFF0000FFF8001FFE00007FF0003FFC00007FE001FFF000003FFFFFFFE000001FFFFFFF800 -00007FFFFFC000000007FFFC000000>54 46 -3 0 58]97 dc[<01F0001FF800000001F800FFFF -80000001FC03FFFFF0000001FE0FFFFFFC000001FF1FE01FFE000001FFBF0007FF800001FFFE00 -01FFC00001FFFC0000FFE00001FFF800007FF00001FFF000003FF80001FFE000003FF80001FFE0 -00001FFC0001FFE000001FFC0001FFE000001FFE0001FFE000001FFE0001FFE000000FFF0001FF -E000000FFF0001FFE000000FFF0001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001 -FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF80 -01FFE000000FFF8001FFE000000FFF8001FFE000000FFF0001FFE000000FFF0001FFE000000FFF -0001FFE000000FFF0001FFE000001FFE0001FFE000001FFE0001FFE000001FFC0001FFE000001F -FC0001FFE000003FF80001FFF000007FF00001FFF800007FE00001FFFE0001FFC00001FFFF8003 -FF800001FFDFF00FFF000001FFCFFFFFFC000001FFC3FFFFF0000001FFC07FFFC0000001FFC00F -FC00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0 -000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FF -C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001 -FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000000000 -03FFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC000000000 -00FFFFC00000000000007FC00000000000>57 72 -4 0 66]98 dc[<00001FFE00000000FFFFE0 -000007FFFFF800001FFFFFFE00007FFE00FF0000FFF0001F8001FFE0000FC003FFC00007E007FF -800003F00FFF000001F00FFE000000F81FFE000000F81FFC000000F83FFC000000003FFC000000 -007FFC000000007FF8000000007FF800000000FFF800000000FFF800000000FFF800000000FFF8 -00000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8000000 -007FF8000000007FF8000000007FF8000000003FFC00003E003FFC0000FF801FFC0001FFC01FFC -0001FFC00FFE0003FFE00FFE0003FFE007FF0003FFE003FF8003FFE001FFC003FFE000FFE001FF -C0007FFC00FFC0001FFFFFFF800007FFFFFE000000FFFFF80000001FFFC000>45 46 -4 0 53] -99 dc[<00001FF803FFFF800001FFFF03FFFF800007FFFFC3FFFF80001FFFFFF3FFFF80007FF8 -07FBFFFF8000FFE000FFFFE00001FFC0003FFFC00003FF00001FFFC00007FF00000FFFC0000FFE -000007FFC0001FFC000003FFC0001FFC000003FFC0003FFC000003FFC0003FFC000003FFC0003F -F8000003FFC0007FF8000003FFC0007FF8000003FFC0007FF8000003FFC000FFF8000003FFC000 -FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC0 -00FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC0007FF8000003FF -C0007FF8000003FFC0007FF8000003FFC0003FFC000003FFC0003FFC000003FFC0001FFC000003 -FFC0001FFC000003FFC0000FFE000003FFC0000FFE000003FFC00007FF000007FFC00003FF8000 -0FFFC00001FFC0001FFFC00000FFF0007FFFC000007FFC03FFFFC000001FFFFFF9FFC0000007FF -FFE1FFC0000000FFFF81FFC00000000FFC01FFC0000000000001FFC0000000000001FFC0000000 -000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000 -00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000 -0000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0 -000000000001FFC0000000000001FFC0000000000003FFC00000000000FFFFC00000000000FFFF -C00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000007FC000>57 72 -4 -0 66]100 dc[<00000FFF80000000FFFFF8000007FFFFFE00001FFFFFFF80003FFE00FFC0007F -F0001FE001FFC00003F003FF800001F807FF000000FC07FF0000007E0FFE0000003E1FFE000000 -3E3FFC0000001C3FFC000000003FFC000000007FFC000000007FF8000000007FF800000000FFF8 -00000000FFF800000000FFF800000000FFF800000000FFFFFFFFFFFCFFFFFFFFFFFEFFFFFFFFFF -FEFFFFFFFFFFFEFFF8000007FEFFF8000007FE7FF8000007FE7FF8000007FE7FF8000007FC7FFC -000007FC3FFC000007FC3FFC00000FFC1FFC00000FF81FFE00000FF80FFE00001FF007FF00003F -F003FF80003FE001FFC0007FC000FFE001FF80007FFC07FF00001FFFFFFE000007FFFFF8000001 -FFFFE00000001FFE0000>47 46 -3 0 54]101 dc[<3FFFFFF800003FFFFFF800003FFFFFF800 -003FFFFFF800003FFFFFF80000007FF0000000007FF0000000007FF0000000007FF0000000007F -F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000 -00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007F -F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000 -00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007F -F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000FFFFFFFE00 -00FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000007FE0000000007FE0000000007F -E0000000007FE0000000007FE0000000007FE0000000007FE0000000007FE0000000007FE00000 -00007FE0000000007FE0003800007FE000FE00007FE001FF00007FE003FF80003FE003FF80003F -F007FFC0003FF007FFC0001FF807FFC0000FF807FFC0000FFC03FF800007FF03FF800001FFC1FF -000000FFFFFF0000003FFFFC00000007FFF800000000FFC000>42 72 -3 0 36]102 dc[<0000 -3FFFC000000007FFFFFE0000003FFFFFFFC00000FFFFFFFFF00003FFF000FFFC000FFF00000FFF -001FFC000003FF803FF0000000FFC03FE00000007FC07FC00000003FE07FC00000003FE0FF8000 -00001FF0FF800000001FF0FF800000001FF0FF800000001FF0FF800000001FF07FC00000003FF0 -7FC00000007FF03FE0000001FFE01FF800001FFFE00FFFFFFFFFFFC003FFFFFFFFFFC0007FFFFF -FFFF8000FFFFFFFFFF8001FFFFFFFFFF0001FFFFFFFFFE0003FFFFFFFFF80003FFFFFFFFE00007 -FFFFFFFF000007FFFFFFF0000007F8000000000007F0000000000007E0000000000007C0000000 -000007C0000000000007C0000000000007C0000000000003C07FF000000003C7FFFF00000001DF -FFFFC0000001FFFFFFF0000000FFE03FF8000001FF800FFC000003FF0007FE000007FE0003FF00 -0007FE0003FF00000FFC0001FF80000FFC0001FF80000FFC0001FF80001FFC0001FFC0001FFC00 -01FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0000FFC0001FF8000 -0FFC0001FF80000FFC0001FF81C007FE0003FF07F007FE0003FF07F003FF0007FE0FF801FF800F -FC0FF800FFE03FFE0FF8007FFFFFFFC7F8001FFFFFC7FFF00007FFFF03FFF000007FF000FFE000 -000000001F80>53 68 -3 21 59]103 dc[<FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07F -FFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE001FFE00000FFF00001FFE00000FFF00001FFE000 -00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE0 -0000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FF -E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001 -FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 -01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFF00000FFF0 -0001FFF00000FFF00001FFF00000FFF00001FFF80000FFF00001FFFC0000FFF00001FFDC0000FF -E00001FFDE0000FFE00001FFCF0001FFE00001FFC7C001FFC00001FFC3E003FFC00001FFC1FC07 -FF800001FFC0FFFFFF000001FFC03FFFFE000001FFC00FFFF8000001FFC001FFC0000001FFC000 -0000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0 -000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FF -C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001 -FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000003FFC00000000000 -FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC000000000 -00007FC00000000000>59 72 -4 0 66]104 dc[<FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01FFC0 -01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 -01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 -01FFC001FFC001FFC001FFC001FFC001FFC001FFC003FFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0 -007FC000000000000000000000000000000000000000000000000000000000000000000000FC00 -01FF0003FF8007FFC00FFFC01FFFE01FFFE01FFFE01FFFE01FFFE01FFFE00FFFC007FFC003FF80 -01FF0000FC00>24 73 -4 0 32]105 dc[<FFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFF -FFFFFF807FFFFFFFFFFF807FFFFF01FFC0000FFFC001FFC0000FFF8001FFC0000FFF0001FFC000 -1FFE0001FFC0003FFC0001FFC0007FFC0001FFC000FFF80001FFC001FFF00001FFC001FFE00001 -FFC003FFC00001FFC007FFC00001FFC00FFF800001FFC01FFF000001FFC01FFE000001FFE03FFC -000001FFF87FFC000001FFFCFFF8000001FFFFFFF0000001FFFFFFE0000001FFFFFFC0000001FF -DFFFC0000001FFCFFF80000001FFC3FF00000001FFC1FE00000001FFC0FF00000001FFC03F8000 -0001FFC01FC0000001FFC00FF0000001FFC007F8000001FFC001FC000001FFC000FE000001FFC0 -007F800001FFC0003FC00001FFC0000FE00001FFC00007F00001FFC0000FFE0001FFC0007FFFF8 -01FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC00000000001FFC000 -00000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 -FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000 -000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF -C00000000003FFC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC0000000 -00FFFFC000000000007FC000000000>56 72 -4 0 63]107 dc[<FFFFFF80FFFFFF80FFFFFF80 -FFFFFF80FFFFFF8001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 -0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF -C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 -FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 -01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 -0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF -C00001FFC00001FFC00001FFC00003FFC000FFFFC000FFFFC000FFFFC000FFFFC000FFFFC00000 -7FC000>25 72 -4 0 32]108 dc[<FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0 -FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF001FFE0 -0000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FF -F000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF00000 -7FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF800 -01FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE0 -0000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FF -F000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF00000 -7FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF800 -01FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFF0 -0000FFF800007FF80001FFF00000FFF800007FF80001FFF00000FFF800007FF80001FFF80000FF -FC00007FF80001FFFC0000FFFE00007FF80001FFDC0000FFEE00007FF00001FFDE0000FFEF0000 -7FF00001FFCF0001FFE78000FFF00003FFC7C001FFC3E000FFE000FFFFC3E003FFC1F001FFE000 -FFFFC1FC07FF80FE03FFC000FFFFC0FFFFFF007FFFFF8000FFFFC03FFFFE001FFFFF0000FFFFC0 -0FFFF80007FFFC0000007FC001FFC00000FFE00000>92 46 -4 0 99]109 dc[<FFFFFFC07FFF -FFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE001FFE00000 -FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE000 -00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE0 -0000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FF -E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001 -FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 -01FFE00000FFF00001FFF00000FFF00001FFF00000FFF00001FFF00000FFF00001FFF80000FFF0 -0001FFFC0000FFF00001FFDC0000FFE00001FFDE0000FFE00001FFCF0001FFE00003FFC7C001FF -C000FFFFC3E003FFC000FFFFC1FC07FF8000FFFFC0FFFFFF0000FFFFC03FFFFE0000FFFFC00FFF -F80000007FC001FFC00000>59 46 -4 0 66]110 dc[<00000FFF0000000000FFFFF000000007 -FFFFFE0000001FFFFFFF8000007FFC03FFE00000FFE0007FF00001FFC0003FF80003FF80001FFC -0007FF00000FFE000FFE000007FF001FFE000007FF801FFC000003FF803FFC000003FFC03FFC00 -0003FFC07FF8000001FFE07FF8000001FFE07FF8000001FFE07FF8000001FFE0FFF8000001FFF0 -FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF80000 -01FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF07FF8000001FFE07FF8000001FFE07F -F8000001FFE03FF8000001FFC03FF8000001FFC03FFC000003FFC01FFC000003FF800FFC000003 -FF000FFE000007FF0007FE000007FE0003FF00000FFC0001FF80001FF80000FFE0007FF000003F -FC03FFC000001FFFFFFF80000007FFFFFE00000000FFFFF0000000000FFF000000>52 46 -3 0 -59]111 dc[<FFFFFFC000000000FFFFFFC000000000FFFFFFC000000000FFFFFFC000000000FF -FFFFC00000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE00000000000 -01FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE000000000 -0001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000 -000001FFE0000000000001FFE01FF800000001FFE0FFFF80000001FFE3FFFFF0000001FFEFFFFF -FC000001FFFFE03FFE000001FFFF0007FF800001FFFE0003FFC00001FFFC0001FFE00001FFF800 -00FFF00001FFF000007FF80001FFE000007FF80001FFE000003FFC0001FFE000003FFC0001FFE0 -00001FFE0001FFE000001FFE0001FFE000001FFF0001FFE000001FFF0001FFE000000FFF0001FF -E000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001 -FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF80 -01FFE000000FFF0001FFE000001FFF0001FFE000001FFF0001FFE000001FFF0001FFE000001FFE -0001FFE000003FFE0001FFE000003FFC0001FFE000003FFC0001FFE000007FF80001FFF00000FF -F00001FFF80000FFE00003FFFE0001FFC000FFFFFF8007FF8000FFFFDFF01FFF0000FFFFCFFFFF -FC0000FFFFC3FFFFF00000FFFFC07FFFC00000007FC00FFC000000>57 66 -4 20 66]112 dc[< -FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE0000001FFC000000001FFC0 -00000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000 -01FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0 -00000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000 -01FFC000000001FFC000000001FFC000000001FFE000000001FFE000000001FFE000F80001FFE0 -03FE0001FFF007FF0001FFF007FF0001FFF00FFF8001FFF80FFF8001FFB80FFF8001FFBC0FFF80 -03FF9E0FFF80FFFF8F07FF00FFFF8FC3FF00FFFF87FFFE00FFFF83FFFC00FFFF80FFF00000FF80 -3F8000>41 46 -4 0 49]114 dc[<E003FF8000F81FFFF800FC7FFFFE00FFFFFFFF80FFFC00FF -C0FFF0001FE0FFC0000FF0FF800007F0FF000003F8FE000003F8FE000003F8FC000003FCFC0000 -03FCF8000003FCF8000007FC7800000FFC0000001FFC000000FFFC00001FFFF80003FFFFF8003F -FFFFF000FFFFFFF003FFFFFFE007FFFFFFC00FFFFFFF801FFFFFFF003FFFFFFC007FFFFFF0007F -FFFFC000FFFFF80000FFFE000000FFF0000000FFC0000000FF800003E0FF000003E0FF000003E0 -7F000003E07F000003E03F000007E03F80000FE01FC0001FE00FF800FFE007FFFFFFE001FFFFFF -E0007FFFF3E0000FFF00E0>38 46 -4 0 47]115 dc[<00001FF0000001FFFC000007FFFE0000 -0FFFFF80001FFE0F80003FFC07C0003FF803E0007FF803E0007FF001E000FFF001F000FFF001F0 -00FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF000 -0000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0 -000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FF -F0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF00000FFFFFFFFC0FF -FFFFFFC0FFFFFFFFC0FFFFFFFFC00FFFFFFFC003FFF0000001FFF00000007FF00000003FF00000 -003FF00000001FF00000000FF00000000FF000000007F000000007F000000007F000000003F000 -000003F000000003F000000001F000000001F000000001F000000001F000000001F000000001F0 -0000>36 66 -2 0 46]116 dc[<00003FFE007FFFE00001FFFF807FFFE00007FFFFE07FFFE000 -1FFFFFF87FFFE0003FFC00FC7FFFE0007FF0003E7FF800007FE0001F7FF00000FFE0000F7FF000 -00FFE00007FFF00001FFE00003FFF00001FFE00001FFF00001FFE00001FFF00001FFE00001FFF0 -0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF -F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000 -FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE000 -00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE0 -0000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FF -E00000FFF00001FFE00000FFF00003FFE00001FFF000FFFFE0007FFFF000FFFFE0007FFFF000FF -FFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF000007FE000003FF000>59 46 -4 0 66] -117 dc[<0000003C0000000000007E000000000000FF000000000000FF000000000001FF800000 -000001FF800000000003FFC00000000003FFC00000000007FFE00000000007FFE0000000000FFF -F0000000000FFFF0000000001FFFF8000000001FFFF8000000001FFEF8000000003FFEFC000000 -003FFC7C000000007FFC7E000000007FF83E00000000FFF83F00000000FFF01F00000001FFF01F -80000001FFE00F80000003FFE00FC0000003FFE007C0000007FFC007E0000007FFC007E0000007 -FF8003E000000FFF8003F000000FFF0001F000001FFF0001F800001FFE0000F800003FFE0000FC -00003FFC00007C00007FFC00007E00007FF800003E0000FFF800003F0000FFF800001F0001FFF0 -00001F8001FFF000001F8001FFE000001FC0FFFFFF8001FFFFFFFFFF8001FFFFFFFFFF8001FFFF -FFFFFF8001FFFFFFFFFF8001FFFF>56 46 -3 0 63]118 dc[<000001E000000F000000000003 -F000001F800000000007F800003FC00000000007F800003FC0000000000FF800003FE000000000 -0FFC00007FE0000000000FFC00007FE0000000001FFE0000FFF0000000001FFE0000FFF0000000 -003FFE0000FFF8000000003FFF0001FFF8000000003FFF0001FFF8000000007FFF8003FFFC0000 -00007FFF8003FF7C00000000FFFF8003FF7E00000000FFFFC007FF3E00000000FFF7C007FE3E00 -000001FFE7E00FFE3F00000001FFE3E00FFC1F00000003FFE3E00FFC1F80000003FFC3F01FFC0F -80000003FFC1F01FF80F80000007FF81F83FF80FC0000007FF80F83FF007C000000FFF80F83FF0 -07E000000FFF00FC7FF003E000000FFF007C7FE003E000001FFE007EFFE003F000001FFE003EFF -C001F000003FFE003EFFC001F800003FFC003FFFC000F800003FFC001FFF8000F800007FF8001F -FF80007C00007FF8000FFF00007C0000FFF8000FFF00007E0000FFF0000FFF00003E0001FFF000 -07FE00003F0001FFE0000FFE00001F0001FFE0000FFC00001F0003FFE0000FFC00001F8003FFC0 -001FFC00003FC0FFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFF -FF07FFFFE007FFFEFFFFFF07FFFFE007FFFE>79 46 -3 0 86]119 dc[<FFFFF8003FFFFFC0FF -FFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC000FF800007FFC000 -003F800007FF8000001FC0000FFF0000000FE0001FFF00000007F0003FFE00000003F0007FFC00 -000001F8007FF800000001FC00FFF000000000FE01FFE0000000007F03FFE0000000003F87FFC0 -000000001FCFFF80000000000FEFFF000000000007FFFE000000000003FFFE000000000003FFFC -000000000001FFF8000000000001FFF0000000000001FFE0000000000003FFC0000000000007FF -C000000000000FFFC000000000001FFFE000000000003FFFF000000000003FFFF800000000007F -F9FC0000000000FFF8FE0000000001FFF07F0000000003FFE03F8000000003FFC01F8000000007 -FF800FC00000000FFF0007E00000001FFF0007F00000003FFE0003F80000007FFC0001FC000000 -7FF80001FF00007FFFFF801FFFFF007FFFFF801FFFFF007FFFFF801FFFFF007FFFFF801FFFFF00 -7FFFFF801FFFFF00>58 46 -2 0 63]120 dc[<01FE00000000000007FFC000000000001FFFF0 -00000000003FFFF800000000007F43FE00000000007FE07F0000000000FFF03F8000000000FFF0 -1F8000000000FFF00FC000000000FFF007E000000000FFF003E000000000FFF003F0000000007F -E001F0000000003FC001F8000000001F8000F800000000000000FC000000000000007C00000000 -0000007E000000000000003E000000000000003F000000000000003F000000000000003F000000 -000000007F800000000000007F80000000000000FFC0000000000000FFC0000000000001FFE000 -0000000001FFE0000000000003FFF0000000000003FFF0000000000007FFF8000000000007FFF8 -00000000000FFFFC00000000000FFFFC00000000000FFF7C00000000001FFF7E00000000001FFE -3E00000000003FFE3F00000000003FFC1F00000000007FFC1F80000000007FF80F8000000000FF -F80FC000000000FFF007C000000001FFF007E000000001FFF003E000000003FFE003F000000003 -FFE003F000000003FFC001F000000007FFC001F800000007FF8000F80000000FFF8000FC000000 -0FFF00007C0000001FFF00007E0000001FFE00003E0000003FFE00003F0000003FFC00001F0000 -007FFC00001F8000007FFC00000F800000FFF800000FC00000FFF800000FC00000FFF000000FE0 -007FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FF -FF80>57 66 -2 20 63]121 dc[<7FFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC07F -FE0007FFC03FFF0000FFE01FFF00003FE01FFF80001FE00FFFC0000FE007FFE0000FE003FFE000 -07E003FFF00007E001FFF80003E000FFFC0003E0007FFC0003E0007FFE0003E0003FFF0003F000 -1FFF8001F0000FFF8001F0000FFFC001F00007FFE001F00003FFF000000001FFF800000001FFF8 -00000000FFFC000000007FFE000000003FFF000000001FFF00003E001FFF80003E000FFFC0003E -0007FFE0003E0003FFE0003E0003FFF0003F0001FFF8003F0000FFFC003F00007FFC003F80007F -FE001F80003FFF001FC0001FFF801FE0000FFF801FF0000FFFC01FFE0007FFE01FFFFFFFFFF01F -FFFFFFFFF01FFFFFFFFFF01FFFFFFFFFE0>44 46 -3 0 53]122 dc /fc df[<0001FF8000000F -FFF000003FFFFC0000FF81FF0001FE007F8003FC003FC007F8001FE00FF8001FF00FF0000FF01F -F0000FF81FF0000FF83FF0000FFC3FF0000FFC3FE00007FC7FE00007FE7FE00007FE7FE00007FE -7FE00007FE7FE00007FEFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007 -FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE000 -07FFFFE00007FFFFE00007FFFFE00007FFFFE00007FFFFE00007FF7FE00007FE7FE00007FE7FE0 -0007FE7FE00007FE7FE00007FE3FE00007FC3FE00007FC3FF0000FFC1FF0000FF81FF0000FF80F -F0000FF00FF8001FF007F8001FE003FC003FC001FE007F8000FF81FF00003FFFFC00000FFFF000 -0001FF8000>40 57 -4 1 49]48 dc[<7FFFFFFFC07FFFFFFFC07FFFFFFFC07FFFFFFFC0000FFE -0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000F -FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000000 -0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000 -000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00 -00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE -0000000FFE0000000FFE0000000FFE0000FFCFFE0000FFFFFE0000FFFFFE0000FFFFFE0000003F -FE00000003FE00000000FE000000003E000000001E0000>34 56 -7 0 49]49 dc[<FFFFFFFFE0 -FFFFFFFFE0FFFFFFFFE0FFFFFFFFF07FFFFFFFF03FFFFFFFF01FFFFFFFF00FFFFFFFF007FFFFFF -F003FFFFFFF001FFFFFFF800F00000F800780000F8003C000078001E000078000F0000780007C0 -003C0003E0003C0001F0003C0001F800000000FC000000007F000000003F800000001FC0000000 -0FF000000007F800000007FC00000003FE00000001FF00000001FF80000000FFC0000000FFE000 -00007FF00000007FF00000007FF80000003FF80000003FFC1F80003FFC3FC0003FFC7FE0003FFC -FFF0003FFCFFF0003FFCFFF0003FFCFFF0003FFCFFF0003FF8FFE0007FF87FC0007FF07F8000FF -F03E0000FFE01F0001FFC00F8007FF8007F01FFF0003FFFFFE0001FFFFF800007FFFE0000007FE -0000>38 56 -5 0 49]50 dc[<0007FF8000003FFFF00001FFFFFE0003FFFFFF0007FC03FFC01F -E000FFE01F80007FF03FC0003FF87FE0003FFC7FF0003FFCFFF0001FFEFFF8001FFEFFF8001FFE -FFF8001FFFFFF8001FFF7FF0001FFF7FF0001FFF3FE0001FFF1FC0001FFF0200001FFF0000001F -FE0000001FFE0000001FFC0000003FFC0000003FF80000003FF00000007FE0000000FF80000003 -FE00000FFFF800000FFF8000000FFFC00000001FF000000007FC00000003FE00000001FF000000 -01FF80000000FFC0000000FFE003F0007FF007F8007FF00FFC007FF01FFE007FF81FFE007FF81F -FE007FF81FFE007FF81FFE007FF81FFC007FF80FF8007FF00FF0007FF00780007FE003C000FFC0 -01F000FF8000FE03FF00007FFFFE00001FFFF0000003FF8000>40 57 -4 1 49]51 dc[<0007FF -FFFFC00007FFFFFFC00007FFFFFFC00007FFFFFFC0000001FFC000000001FFC000000001FFC000 -000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001 -FFC000FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0F80000FFC0007C0000FFC000 -3C0000FFC0001E0000FFC0000F0000FFC0000F8000FFC00007C000FFC00003C000FFC00001E000 -FFC00000F000FFC00000F800FFC000007C00FFC000003C00FFC000001E00FFC000000F00FFC000 -000F80FFC0000007C0FFC0000003C0FFC0000001E0FFC0000000F0FFC0000000F8FFC00000007C -FFC00000003CFFC00000001EFFC00000000FFFC00000000FFFC000000007FFC000000003FFC000 -000001FFC000000000FFC000000000FFC0000000007FC0000000003FC0000000001FC000000000 -0FC0000000000FC00000000007C000>42 55 -3 0 49]52 dc[<000FFC0000007FFFC00001FFFF -F00003FFFFFC0007F00FFE000FC003FF001F0000FF803E0000FFC03C00007FE07F00007FF07FC0 -007FF0FFE0003FF8FFE0003FF8FFF0003FF8FFF0003FFCFFF0003FFCFFE0003FFC7FE0003FFC3F -C0003FFC1F80003FFC0600003FFC0000003FFC0000003FFC0000003FF80000003FF80000003FF8 -0000003FF00700007FF00F00007FE00F80007FC00FC000FF800FF000FF000FFE03FE000FBFFFF8 -000F8FFFE0000F81FF00000F800000000F800000000F800000000F800000000F800000000F8000 -00000F800000000F800000000FFFF800000FFFFE00000FFFFF80000FFFFFE0000FFFFFF0000FFF -FFF8000FFFFFFC000FFFFFFE000FFFFFFF000FFFFFFF800FF8007FC00F800007C004000000C0> -38 57 -5 1 49]53 dc[<0000FFC0000007FFF800001FFFFE00007FFFFF0000FF80FFC001FE00 -3FE003FC001FF007FC001FF00FF8001FF80FF8000FFC1FF8000FFC1FF0000FFE3FF0000FFE3FF0 -000FFE3FF0000FFF7FF0000FFF7FF0000FFF7FF0000FFF7FF0000FFF7FF0000FFFFFF0000FFFFF -F0000FFFFFF0000FFFFFF0000FFEFFF8000FFEFFF8000FFEFFF8000FFCFFF8000FFCFFFC000FF8 -FFFC001FF0FFFE001FF0FFF6003FE0FFF3807F80FFF1F7FF00FFF0FFFE007FF07FF0007FF00000 -007FF00000007FF00000003FF00000003FF00000003FF80007C01FF8000FE01FF8001FF00FF800 -3FF80FFC003FF807FC003FF803FC003FF801FE001FF800FF000FF0007F0007F0003FC001F0001F -E001E0000FFC07C00003FFFF8000007FFF0000000FF800>40 57 -4 1 49]54 dc[<0003E00000 -000007F0000000000FF8000000001FFC000000001FFC000000001FFC000000001FFC000000001F -FC000000001FFC000000001FFC000000001FFC000000001FFC000000000FFC000000000FFC0000 -00000FFC000000000FFC000000000FFC0000000007FC0000000007FC0000000007FC0000000003 -FE0000000003FE0000000003FE0000000001FE0000000001FE0000000000FE0000000000FF0000 -0000007F00000000007F00000000003F00000000003F80000000001F80000000000F8000000000 -0FC00000000007E00000000003E00000000003F00000F00001F80000F00000FC0000F000007E00 -007800003E00007800001F00007800001F80007C00000FC0007C000007E0007FFFFFFFF0003FFF -FFFFF0003FFFFFFFF8003FFFFFFFFC003FFFFFFFFE003FFFFFFFFF003FFFFFFFFF803FFFFFFFFF -C01FFFFFFFFFC01FFFFFFFFFC01FFFFFFFFFC01FF0000000001F00000000001E0000000000>42 -59 -5 1 49]55 dc[<0003FF8000003FFFF80000FFFFFE0003FFFFFF8007FE007FC00FF00007E0 -1FE00003F03FC00001F83F800000FC7F000000FC7F0000007EFE0000007EFE0000007EFE000000 -7FFE0000007FFE000000FFFE000000FFFE000001FFFE000003FF7F00000FFF7F00003FFF3F8000 -FFFE3F8001FFFE1FC007FFFC0FE01FFFFC07F07FFFF801FDFFFFF000FFFFFFF0003FFFFFE0003F -FFFF80007FFFFF0000FFFFFE0001FFFFF80003FFFFFC0007FFFFFF0007FFFE3F800FFFFC1FC00F -FFF00FE01FFFC007E01FFF0007F01FFC0007F01FF80003F81FF00003F81FE00003F81FC00003F8 -1FC00003F80FC00003F80FC00003F807C00007F007C00007F003E0000FE001F0000FC000F8003F -80007F00FF00003FFFFE00000FFFF8000001FF8000>40 57 -4 1 49]56 dc[<000FF80000007F -FF000001FFFFC00003FFFFF00007F01FFC0007C003FE000FE001FF000FF000FF801FF8007FC01F -FC003FC01FFC003FE01FFC003FF01FFC001FF00FF8001FF807F0001FF803E0001FFC0000000FFC -0000000FFC0000000FFE0000000FFE0000000FFE000FFE0FFE007FFF0FFF00FFEF8FFF01FE01CF -FF03FC006FFF07F8007FFF0FF8003FFF1FF0003FFF3FF0001FFF3FF0001FFF7FF0001FFF7FF000 -1FFF7FF0000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF0000FFEFFF0000FFEFFF0000FFEFFF0 -000FFEFFF0000FFEFFF0000FFCFFF0000FFC7FF0000FFC7FF0000FF83FF0000FF83FF0001FF01F -F8001FF00FF8001FE00FF8003FC007FC003F8001FE007F0000FF81FE00007FFFFC00001FFFF000 -0001FF8000>40 57 -4 1 49]57 dc[<0000001FFF000000000001FFFFF0000000000FFFFFFC00 -0000007FFFFFFF00000001FFFE003FC0000003FFE00007F000000FFF000001F800001FFC000000 -7C00003FF80000003E00007FF00000001F0000FFE00000000F0001FFC0000000078003FF800000 -0003C007FF0000000003C00FFF0000000001E00FFE0000000001E01FFE0000000001E01FFE0000 -000000F03FFC0000000000F03FFC0000000000F03FFC0000000000F07FFC0000000000F07FF800 -00000000007FF80000000000007FF8000000000000FFF8000000000000FFF8000000000000FFF8 -000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FF -F8000000000000FFF8000000000000FFF8000000000000FFF80000000000007FF8000000000000 -7FF80000000000007FF80000000001F07FFC0000000001F03FFC0000000001F03FFC0000000001 -F03FFC0000000003F01FFE0000000003F01FFE0000000003F00FFE0000000007F00FFF00000000 -07F007FF000000000FF003FF800000000FF001FFC00000001FF000FFC00000003FF0007FF00000 -003FF0003FF80000007FF0001FFC000001FFF0000FFF000003FFF00003FFE0000FCFF00001FFFE -007F87F000007FFFFFFE03F000000FFFFFFC01F0000001FFFFE000F00000001FFF000030>60 61 --5 1 71]67 dc[<003FE000FFF001FFFC07FFF007FFFE0FFFF01FFC0F0FFFF03FF0039FF8007F -E000DFF0007FE0007FF000FFC0007FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC0003F -F0007FE0003FF0007FE0003FF0003FE0003FF0001FF0003FF0000FF8003FF00007FE003FF00001 -FF803FF000007FF83FF000000FFFFFF0000000FFFFF0000000003FF0000000003FF0000000003F -F00001C0003FF00007F0003FF0000FF8003FF0000FF8003FF0001FFC003FE0001FFC007FE0001F -FC007FC0001FFC00FF80000FF801FF000007F007FE000003FFFFFC000001FFFFF00000001FFF00 -0000>44 38 -3 0 48]97 dc[<0000FFE0000007FFFC00003FFFFF0000FFC03FC001FF0007E003 -FE0001F007FC0000F80FF80000781FF000003C1FF000003C3FF000003C3FE00000007FE0000000 -7FE00000007FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFFFFFFFFCFFFFFFFF -FCFFFFFFFFFCFFE00003FC7FE00003FC7FE00003FC7FE00003FC7FE00007F83FF00007F83FF000 -07F81FF00007F00FF8000FF00FF8000FE007FC001FC001FE003F8000FF80FF00003FFFFE00000F -FFF8000001FFC000>38 38 -3 0 45]101 dc[<FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFFFF -FFFC3FFFFF03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000 -FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003 -FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000 -FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF8000FFC003FF8000FFC003FF8000FFC003 -FFC000FFC003FFE000FFC003FF6000FF8003FF3001FF8003FF1C01FF0003FF0F03FE0003FF07FF -FC0003FF01FFF80003FF007FC00003FF0000000003FF0000000003FF0000000003FF0000000003 -FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000 -000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000007FF00000000FF -FF00000000FFFF00000000FFFF00000000FFFF0000000000FF00000000>48 60 -4 0 55]104 -dc[<FFFFFC000000FFFFFC000000FFFFFC000000FFFFFC00000003FF0000000003FF0000000003 -FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000 -000003FF0000000003FF0000000003FF0000000003FF0000000003FF01FF000003FF0FFFF00003 -FF3FFFFC0003FFFC07FF0003FFF001FF8003FFC0007FC003FF80003FE003FF00003FF003FF0000 -1FF803FF00001FF803FF00000FFC03FF00000FFC03FF00000FFE03FF000007FE03FF000007FE03 -FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF0000 -07FF03FF000007FF03FF000007FF03FF000007FE03FF00000FFE03FF00000FFE03FF00000FFC03 -FF00001FFC03FF00001FF803FF00003FF003FF80003FE003FFC0007FC0FFFFF000FF80FFFFFE03 -FF00FFFF3FFFFC00FFFF0FFFF00000FF01FF8000>48 55 -3 17 55]112 dc[<FFFFFE0000FFFF -FE0000FFFFFE0000FFFFFE000003FF00000003FF00000003FF00000003FF00000003FF00000003 -FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000 -03FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 -0003FF800E0003FF803F8003FF807FC003FF807FC003FFC0FFE003FEC0FFE003FEE0FFE007FE60 -FFE0FFFE707FC0FFFE3C3F80FFFE1FFF00FFFE0FFE0000FE03F000>35 38 -3 0 41]114 dc[< -0001FF000007FF80001FFFC0003FE0E0007FC07000FFC07800FF807801FF803C01FF803C01FF80 -3C01FF803C01FF803C01FF803C01FF803C01FF803C01FF800001FF800001FF800001FF800001FF -800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001 -FF800001FF800001FF800001FF800001FF8000FFFFFFF0FFFFFFF0FFFFFFF01FFFFFF007FF8000 -01FF800000FF8000007F8000003F8000003F8000001F8000001F8000000F8000000F8000000F80 -00000F80000007800000078000000780000007800000078000>30 55 -2 0 38]116 dc /fd df -[<7FFF1FFFC07FFF1FFFC07FFF1FFFC007F001FC0007F001FC0007F001FC0007F001FC0007F001 -FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F0 -01FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007 -F001FC00FFFFFFFC00FFFFFFFC00FFFFFFFC0007F000000007F000000007F000000007F0000000 -07F000F00007F001F80007F003FC0007F003FC0007F003FC0003F803FC0001F801F80000FC00F8 -00007F80F000001FFFC0000001FF0000>34 42 -1 0 38]12 dc[<00FF8001FE0007FFF00FFFC0 -0FFFFC7FFFE01FE07EFF81F03FC00FFE00707F8007F80038FF800FF00038FF003FF00000FF007F -F80000FF00FF9C0000FF00FF0E00007F01FE0700007F03FC0380003F07FC01C0001F07F801C000 -078FF000E000039FE000700001DFE000700000FFC0003800007F80001C00007F80001C00007F00 -000E00007F0000070000FF0000070000FF80007FFC00FEC0007FFC01FC60007FFC01FC30000000 -01FC1800000001FC1C00000001FC0C00000001F80E00000001F80700000001F80700000001F807 -00000000F80700000000FC07000000007C06000000003C0E000000001F1C000000000FF8000000 -0001F0000000>46 42 -3 0 53]38 dc[<00030007000E001C0038007000F001E003C003C007C0 -07800F800F001F001F003F003E003E007E007E007E007C007C00FC00FC00FC00FC00FC00FC00FC -00FC00FC00FC00FC00FC007C007C007E007E007E003E003E003F001F001F000F000F80078007C0 -03C003C001E000F000700038001C000E00070003>16 60 -6 15 27]40 dc[<8000C000E00070 -0038001C001E000F000780078007C003C003E001E001F001F001F800F800F800FC00FC00FC007C -007C007E007E007E007E007E007E007E007E007E007E007E007E007C007C00FC00FC00FC00F800 -F801F801F001F001E003E003C007C0078007800F001E001C0038007000E000C0008000>15 60 --5 15 27]41 dc[<2000300018000C0006000300030001800180018000C000C01CC07FC07FC0FF -C0FFC0FF807F007F001C00>10 21 -5 12 19]44 dc[<FFFF80FFFF80FFFF80FFFF80FFFF80FF -FF80>17 6 -1 -11 23]45 dc[<1C003E007F00FF80FF80FF807F003E001C00>9 9 -5 0 19] -46 dc[<003F800001FFF00007E0FC000FC07E001F803F001F803F003F001F803F001F807F001F -C07F001FC07F001FC07F001FC0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF00 -1FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE07F001FC07F -001FC07F001FC07F001FC03F001F803F001F801F803F001F803F000FC07E0007E0FC0001FFF000 -003F8000>27 39 -3 0 34]48 dc[<7FFFFE7FFFFE7FFFFE00FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00F8FE00FFFE00 -FFFE0007FE00007E00001E00000E00>23 39 -5 0 34]49 dc[<FFFFFF80FFFFFF80FFFFFF807F -FFFFC03FFFFFC01FFFFFC00FFFFFC0070001C0038001C001C001C000E000E0007000E0003C00E0 -001E0000000F0000000780000003E0000003F0000001F8000000FC000000FE0000007F0000007F -8000003FC000003FC000003FE03C003FE07E001FE0FF001FE0FF001FE0FF003FE0FF003FC0FE00 -3FC07C007F803800FF001F03FE000FFFFC0003FFF00000FF8000>27 39 -3 0 34]50 dc[<00FF -800007FFF0001FFFFC003F01FE007C007F007E007F80FF007FC0FF003FC0FF003FE0FF003FE07E -003FE03C003FE000003FE000003FE000003FC000003FC000007F8000007F0000007E000001FC00 -00FFF00000FFC0000007F0000001F8000001FC000000FE000000FF000000FF000F007F801F807F -803F807F803F807F803F807F803F80FF001F00FF000F81FE0007FFFC0003FFF000007F8000>27 -39 -3 0 34]51 dc[<007FFFF8007FFFF8007FFFF80000FE000000FE000000FE000000FE000000 -FE000000FE000000FE000000FE00FFFFFFF8FFFFFFF8FFFFFFF8E0007E0070007E0038007E001C -007E000E007E000E007E0007007E0003807E0001C07E0000E07E0000E07E0000707E0000387E00 -001C7E00000E7E00000E7E0000077E000003FE000001FE000000FE000000FE0000007E0000003E -0000001E0000000E00>29 39 -2 0 34]52 dc[<00FF800003FFF0000FFFF8001F01FE003C007F -0078003F8078003F80FC001FC0FE001FC0FE001FE0FE001FE0FE001FE07C001FE018001FE00000 -1FE000001FE000001FC000001FC000001F800C003F000E003E000F80FC000FFFF8000E7FC0000E -0000000E0000000E0000000E0000000E0000000E0000000FFE00000FFFC0000FFFE0000FFFF000 -0FFFF8000FFFFC000FFFFE000F803F000C000300>27 39 -3 0 34]53 dc[<003FC00000FFF000 -03FFFC0007E07E000FC03F001F803F801F801FC03F001FC03F001FE07F001FE07F001FE07F001F -E07F001FE0FF001FE0FF001FE0FF001FE0FF001FC0FF801FC0FF801F80FFC03F00FFC03E00FF70 -7C00FF3FF800FF0FC000FF0000007F0000007F0000007F0000003F8000003F801F001F803F801F -C03F800FC03F8007E03F8003F01F8001FC0F0000FFFE00003FFC000007F000>27 39 -3 0 34] -54 dc[<00380000007C000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -0000FE0000007E0000007E0000007E0000007E0000003E0000003E0000003F0000001F0000001F -0000000F0000000F00000007800000078000000380000001C0000000E000E000E000E0007000E0 -00380070001C0070000E0070000E007FFFFF007FFFFF807FFFFFC07FFFFFE03FFFFFF03FFFFFF0 -3FFFFFF03E00000038000000>28 41 -4 0 34]55 dc[<007FC00003FFF8000FFFFC001FC03E00 -3F000F007C0007807C0003C0F80003C0F80003E0F80003E0F80003E0F80007E0F80007E078001F -E07C007FE03C01FFC01E03FFC00F0FFF8007FFFF0001FFFE0001FFFC0003FFF80007FFE0000FFF -F8001FFE3C001FFC1E003FF01F003FC00F003F000F803F000F803E000F803E000F801E000F801E -001F000F003F0007C07E0003FFFC0001FFF000003FC000>27 39 -3 0 34]56 dc[<01FE000007 -FF80000FFFE0001E03F0001F01F8003F807C003F807E003F803F003F803F001F003F8000003F80 -00001FC000001FC000001FC000001FE0007E1FE003FF9FE007C1DFE00F807FE01F807FE03F003F -E07F003FE07F001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FC0FF001FC0FF001FC0FF00 -1F807F001F807F003F003F803F001F807E000FE0FC0007FFF80001FFF000007F8000>27 39 -3 -0 34]57 dc[<1C003E007F00FF80FF80FF807F003E001C00000000000000000000000000000000 -0000001C003E007F00FF80FF80FF807F003E001C00>9 27 -5 0 19]58 dc[<FFFE001FFFFEFF -FE001FFFFEFFFE001FFFFE01C00000FF0001C00000FF0001E00001FF0000E00001FE0000E00001 -FE0000700003FC0000700003FC0000780007FC00003FFFFFF800003FFFFFF800001FFFFFF00000 -1C000FF000001E001FF000000E001FE000000E003FE0000007003FC0000007003FC0000007807F -C0000003807F80000003C0FF80000001C0FF00000001C0FF00000000E1FE00000000E1FE000000 -00F3FE0000000073FC0000000073FC000000003FF8000000003FF8000000003FF8000000001FF0 -000000001FF0000000000FE0000000000FE0000000000FE00000000007C00000000007C0000000 -0003800000>47 41 -2 0 52]65 dc[<FFFFFFFE0000FFFFFFFFC000FFFFFFFFF00003F8001FF8 -0003F80007FC0003F80003FE0003F80001FF0003F80000FF0003F80000FF8003F80000FF8003F8 -0000FF8003F80000FF8003F80000FF8003F80000FF8003F80000FF0003F80000FF0003F80001FE -0003F80001FE0003F80003FC0003F80007F00003FFFFFFE00003FFFFFE000003F800FFC00003F8 -001FE00003F8000FF00003F80007F80003F80003FC0003F80003FC0003F80003FE0003F80001FE -0003F80001FE0003F80001FE0003F80003FE0003F80003FC0003F80003FC0003F80007FC0003F8 -000FF80003F8001FF000FFFFFFFFC000FFFFFFFF8000FFFFFFF80000>41 41 -3 0 49]66 dc[< -00003FF800000003FFFF0000000FFFFFC000003FF007E00000FF8000F80001FE00003C0003FC00 -001E0007F000000E000FF0000007001FE0000007001FE0000003803FC0000003803FC000000380 -7FC0000003807F80000000007F8000000000FF8000000000FF8000000000FF8000000000FF8000 -000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000007F8000000000 -7F80000003807FC0000003803FC0000003803FC0000007801FE0000007801FE0000007800FF000 -000F8007F000001F8003FC00003F8001FE00007F8000FF8001FF80003FF007DF80000FFFFF8780 -0003FFFE038000003FF00180>41 41 -4 0 50]67 dc[<FFFFFFFC0000FFFFFFFF8000FFFFFFFF -E00003FC001FF80003FC0003FC0003FC0001FE0003FC00007F0003FC00007F8003FC00003FC003 -FC00001FC003FC00001FE003FC00001FE003FC00000FF003FC00000FF003FC00000FF003FC0000 -0FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803 -FC00000FF803FC00000FF803FC00000FF803FC00000FF003FC00000FF003FC00000FF003FC0000 -0FF003FC00001FE003FC00001FE003FC00001FC003FC00003FC003FC00007F8003FC0000FF0003 -FC0001FE0003FC0007FC0003FC001FF800FFFFFFFFE000FFFFFFFF8000FFFFFFF80000>45 41 --3 0 53]68 dc[<FFFFFFFFF0FFFFFFFFF0FFFFFFFFF003FC001FF803FC0003F803FC0001F803 -FC0000F803FC00007803FC00003803FC00003C03FC00001C03FC00001C03FC00001C03FC01C01C -03FC01C00E03FC01C00E03FC01C00E03FC03C00003FC03C00003FC0FC00003FFFFC00003FFFFC0 -0003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01C03803FC01C03803FC01C03803FC01 -C07803FC00007003FC00007003FC00007003FC0000F003FC0001F003FC0001F003FC0007F003FC -001FE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0>39 41 -3 0 45]69 dc[<FFFFFC0000FFFFFC0000 -FFFFFC000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000 -0003FC00000003FC00000003FC03800003FC03800003FC03800003FC03800003FC07800003FC07 -800003FC1F800003FFFF800003FFFF800003FFFF800003FC1F800003FC07800003FC07800003FC -03800003FC03807003FC03807003FC03807003FC0000F003FC0000E003FC0000E003FC0000E003 -FC0001E003FC0001E003FC0003E003FC000FE003FC003FC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0 ->36 41 -3 0 43]70 dc[<00007FF003000003FFFE0F00001FFFFF1F00003FF007BF0000FF8001 -FF0001FE0000FF0003F80000FF0007F00000FF000FF00000FF001FE00000FF001FE00000FF003F -C00000FF003FC00000FF007FC00000FF007F8001FFFFF87F8001FFFFF8FF8001FFFFF8FF800000 -0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF -80000000007F80000000007F80000007007FC0000007003FC0000007003FC000000F001FE00000 -0F001FE000000F000FF000001F0007F000003F0003F800003F0001FE0000FF0000FF8001FF0000 -3FF00FFF00001FFFFF0F000003FFFC070000007FE00300>45 41 -4 0 54]71 dc[<FFFFFCFFFF -FCFFFFFC01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE -0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE -0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00FFFFFCFFFFFCFFFF -FC>22 41 -2 0 26]73 dc[<FFFFFFFF00FFFFFFFF00FFFFFFFF0003FC01FF0003FC007F8003FC -001F8003FC000F8003FC000F8003FC00078003FC00078003FC00038003FC00038003FC0003C003 -FC0001C003FC0001C003FC0001C003FC0001C003FC00000003FC00000003FC00000003FC000000 -03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000 -0003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 -000003FC000000FFFFFC0000FFFFFC0000FFFFFC0000>34 41 -3 0 41]76 dc[<FFFE007801FF -FFC0FFFE007801FFFFC0FFFE00FC01FFFFC0038000FC0007F000038000FC0007F000038001FE00 -07F000038001FE0007F000038003FF0007F000038003FF0007F000038007F38007F000038007F3 -8007F00003800FE1C007F00003800FE1C007F00003800FE1C007F00003801FC0E007F00003801F -C0E007F00003803F807007F00003803F807007F00003807F003807F00003807F003807F0000380 -FF003807F0000380FE001C07F0000380FE001C07F0000381FC000E07F0000381FC000E07F00003 -83F8000707F0000383F8000707F0000387F0000387F0000387F0000387F0000387F0000387F000 -038FE00001C7F000038FE00001C7F000039FC00000E7F000039FC00000E7F00003BF80000077F0 -0003BF80000077F00003FF0000003FF00003FF0000003FF000FFFF0000003FFFC0FFFE0000001F -FFC0FFFE0000001FFFC0>58 41 -3 0 65]77 dc[<0000FFE00000000FFFFE0000003FC07F8000 -00FF001FE00001FC0007F00003F80003F80007F00001FC000FF00001FE001FE00000FF001FE000 -00FF003FC000007F803FC000007F807FC000007FC07FC000007FC07F8000003FC0FF8000003FE0 -FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000 -003FE0FF8000003FE0FF8000003FE07F8000003FC07F8000003FC07F8000003FC07FC000007FC0 -3FC000007F803FC000007F801FE00000FF001FE00000FF000FF00001FE0007F00001FC0003F800 -03F80001FC0007F000007F001FC000003FC07F80000007FFFC00000000FFE00000>43 41 -4 0 -52]79 dc[<FFFFF00000FFFFF00000FFFFF0000003FC00000003FC00000003FC00000003FC0000 -0003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 -000003FC00000003FC00000003FC00000003FC00000003FFFFFE0003FFFFFF8003FC003FE003FC -000FF003FC0007F803FC0007FC03FC0003FC03FC0003FE03FC0003FE03FC0003FE03FC0003FE03 -FC0003FE03FC0003FE03FC0003FE03FC0003FC03FC0007FC03FC0007F803FC000FF003FC003FE0 -FFFFFFFFC0FFFFFFFF00FFFFFFF800>39 41 -3 0 47]80 dc[<00000000780000000001FE0000 -000003FF0000000003FF8000000007FF8000000007FFC00000000FFFC00000000FFFC00000000F -FFE00000000F81E00000001F00600000001E00600000FFFE0060000FFFFE0000003FE07F800000 -FFC03FE00001FCC037F00003F8C063F80007F060C1FC000FF03F81FE001FE01F00FF001FE00000 -FF003FC000007F803FC000007F807FC000007FC07F8000003FC07F8000003FC0FF8000003FE0FF -8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF800000 -3FE0FF8000003FE0FF8000003FE07F8000003FC07F8000003FC07FC000007FC07FC000007FC03F -C000007F803FC000007F801FE00000FF001FE00000FF000FF00001FE0007F00001FC0003F80003 -F80001FC0007F000007F001FC000003FC07F80000007FFFC00000000FFE00000>43 53 -4 12 -52]81 dc[<FFFFF0003FF0FFFFF001FFF8FFFFF003FE1C03FC0007F80E03FC000FF80703FC001F -F80703FC001FF00703FC001FF00003FC001FF00003FC001FF00003FC001FE00003FC001FE00003 -FC001FE00003FC001FE00003FC001FE00003FC001FC00003FC003F800003FC003F800003FC007F -000003FC00FC000003FFFFF0000003FFFFFE000003FC007FC00003FC001FE00003FC0007F80003 -FC0007F80003FC0003FC0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003 -FE0003FC0003FE0003FC0003FC0003FC0007FC0003FC0007F80003FC000FF00003FC007FE000FF -FFFFFF8000FFFFFFFE0000FFFFFFE00000>48 41 -3 0 52]82 dc[<C01FF000E0FFFE00F3FFFF -00FFE01F80FF0007C0FC0003E0F80003F0F00001F0F00001F0E00001F8E00001F8E00001F86000 -01F8000003F8000007F800000FF800007FF00007FFF000FFFFE003FFFFE007FFFFC00FFFFF801F -FFFE003FFFFC007FFFE0007FFE0000FFC00000FF000000FE0000E0FE0000E0FC0000E0FC0001E0 -FC0001E07C0001E07C0003E03E0007E01F001FE00F807FE007FFF9E003FFF0E0007F8060>29 41 --4 0 38]83 dc[<007FFFFFE000007FFFFFE000007FFFFFE00000003FC0000000003FC0000000 -003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 -000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000 -003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 -0000E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0F0003FC001E0F0 -003FC001E070003FC001C078003FC003C078003FC003C07E003FC007C07F803FC03FC07FFFFFFF -FFC07FFFFFFFFFC07FFFFFFFFFC0>43 40 -2 0 48]84 dc[<00001FF800000001FFFF00000007 -FFFFC000000FF007E000003FC000F000007F00003800007E00001C0000FE00001C0001FE00000E -0001FC00000E0003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC -0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC000007 -0003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC -0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC000007 -0003FC0000070003FC0000070003FC00000700FFFFF001FFFCFFFFF001FFFCFFFFF001FFFC>46 -41 -3 0 53]85 dc[<000001C0000000000003E0000000000003E0000000000007F00000000000 -07F000000000000FF800000000000FF800000000000FF800000000001FFC00000000001FFC0000 -0000003FFE00000000003FCE00000000007FCF00000000007F870000000000FF878000000000FF -038000000000FF038000000001FF01C000000001FE01C000000003FE01E000000003FC00E00000 -0007FC00F000000007F8007000000007F800700000000FF000380000000FF000380000001FF000 -1C0000001FE0001C0000003FE0001E0000003FC0000E0000007FC0000F0000007F800007000000 -7F800007000000FF000003800000FF000003800001FF000003C00001FE000001C00003FE000001 -E000FFFFF0003FFF80FFFFF0003FFF80FFFFF0003FFF80>49 41 -1 0 52]86 dc[<00000E0000 -0700000000001F00000F80000000001F00000F80000000001F80001F80000000003F80001FC000 -0000003F80001FC0000000003FC0003FC0000000007FC0003FE0000000007FC0003FE000000000 -FFE0007FF000000000FFE0007FF000000000FFF000FFF000000001FE7000FF3800000001FE7000 -FF3800000001FE7801FF3800000003FC3801FE1C00000003FC3801FE1C00000007FC1C03FC1E00 -000007F81C03FC0E00000007F81E07FC0E0000000FF00E07F8070000000FF00E07F8070000001F -F00F0FF0078000001FE0070FF0038000001FE0070FF0038000003FE0039FE003C000003FC0039F -E001C000003FC003FFE001C000007F8001FFC000E000007F8001FFC000E00000FF8000FF8000F0 -0000FF0000FF8000700000FF0000FF8000700001FF0000FF0000780001FE0000FF0000380001FE -0001FF0000380003FC0001FE00001C0003FC0001FE00001C00FFFFE07FFFF007FFF0FFFFE07FFF -F007FFF0FFFFE07FFFF007FFF0>68 41 -1 0 71]87 dc[<01FC03FC0FFF0FFC3F839FFC7F00DF -807E007F80FE003F80FE003F80FE003F80FE003F807F003F803F003F803F803F800FE03F8007FC -3F8000FFFF80000FFF8000003F8000003F8000003F8007003F800F803F801FC03F001FC07E001F -C07E000F81F80007FFF00001FF8000>30 27 -2 0 33]97 dc[<0E01FC00000F07FF80000F9E07 -E0000FF803F0000FF001F8000FE000FC000FE000FE000FE0007F000FE0007F000FE0007F000FE0 -007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F000F -E0007F000FE0007F000FE000FE000FE000FC000FF000F8000FF801F0000FFE07E0000FE7FF8000 -0FE1FE00000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000 -000FE00000000FE00000000FE00000000FE00000000FE0000000FFE0000000FFE0000000FFE000 -0000>33 42 -2 0 38]98 dc[<001FE00000FFFC0003F01E0007E007000FC003801F8001C03F80 -01C07F8000007F0000007F000000FF000000FF000000FF000000FF000000FF000000FF000000FF -0000007F0000007F0000007F800E003F801F001F803F800FC03F8007E03F8003F01F0000FFFE00 -001FF800>26 27 -2 0 31]99 dc[<003FC3FF8000FFF3FF8003F03BFF8007C00FF8000F8007F8 -001F8003F8003F8003F8007F0003F8007F0003F8007F0003F800FF0003F800FF0003F800FF0003 -F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F8007F0003F8003F80 -03F8001F8003F8000FC007F80007E00FF80003F03FF80000FFFBF800001FE3F800000003F80000 -0003F800000003F800000003F800000003F800000003F800000003F800000003F800000003F800 -000003F800000003F800000003F80000003FF80000003FF80000003FF800>33 42 -2 0 38] -100 dc[<001FF00000FFFE0003F81F0007E003800FC001C01F8000E03F8000E07F0000007F0000 -007F000000FF000000FF000000FF000000FFFFFFE0FFFFFFE0FF0007E0FF0007E07F0007E07F00 -07C07F000FC03F800FC01F800F800F801F8007C01F0003F07E0001FFF800003FE000>27 27 -2 -0 32]101 dc[<7FFF807FFF807FFF8007F00007F00007F00007F00007F00007F00007F00007F0 -0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 -00FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00007F00007F03E07F07F03F0 -7F03F87F01F87F00FE3E003FFC0007F0>24 42 -2 0 21]102 dc[<007FF00003FFFE000FC01F -801F0007C03C0001E07C0001F0F80000F8F80000F8F80000F8F80000F87C0001F83E0007F01FFF -FFF007FFFFE00FFFFFC01FFFFF801FFFFF003FFFF8003E0000003C000000380000003800000018 -FF80001FFFE0000FC1F8001F80FC001F007C003F007E007F007F007F007F007F007F007F007F00 -7F007F007F007F003F007E101F007C381F80FC7C0FC1FE7C03FFE7F800FF81F0>30 40 -2 13 -34]103 dc[<FFFE3FFF80FFFE3FFF80FFFE3FFF800FE003F8000FE003F8000FE003F8000FE003 -F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0 -03F8000FE003F8000FE003F8000FE003F8000FE003F8000FF003F8000FF003F8000FF803F8000F -F803F0000FEE03F0000FE787E0000FE1FFC0000FE07F00000FE00000000FE00000000FE0000000 -0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000 -000FE0000000FFE0000000FFE0000000FFE0000000>33 42 -3 0 38]104 dc[<FFFEFFFEFFFE -0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F -E00FE0FFE0FFE0FFE0000000000000000000000000000007000FC01FE03FE03FE03FE01FE00FC0 -0700>15 43 -3 0 20]105 dc[<0FF0003FFC007C3E00FE1F00FE1F80FE0FC0FE0FE07C0FE000 -0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000 -0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000 -0FE0000FE001FFE001FFE001FFE000000000000000000000000000000000000000000000070000 -0F80001FC0003FE0003FE0003FE0001FC0000F80000700>19 55 4 12 21]106 dc[<FFFC3FFE -FFFC3FFEFFFC3FFE0FC00FE00FC00FC00FC01FC00FC03F800FC07F000FC07F000FC0FE000FC1FC -000FE3F8000FF3F8000FFFF0000FFFE0000FEFE0000FE7C0000FE3C0000FE0E0000FE078000FE0 -3C000FE01E000FE00F000FE007800FE01FFC0FE01FFC0FE01FFC0FE000000FE000000FE000000F -E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00000FFE00000 -FFE00000FFE00000>31 42 -2 0 36]107 dc[<FFFEFFFEFFFE0FE00FE00FE00FE00FE00FE00F -E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 -0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFE0FFE0FFE0>15 42 -3 0 20]108 dc[<FF -FE1FFFC3FFF8FFFE1FFFC3FFF8FFFE1FFFC3FFF80FE001FC003F800FE001FC003F800FE001FC00 -3F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE0 -01FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F -800FE001FC003F800FE001FC003F800FF001FE003F800FF001FE003F800FD801FF003F800FCC01 -F9803F000FC603F8C07F00FFC383F0707E00FFC1FFE03FFC00FFC07F800FF000>53 27 -3 0 58 -]109 dc[<FFFE3FFF80FFFE3FFF80FFFE3FFF800FE003F8000FE003F8000FE003F8000FE003F8 -000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003 -F8000FE003F8000FE003F8000FE003F8000FE003F8000FF003F8000FF003F8000FD803F8000FD8 -03F0000FCE03F000FFC787E000FFC1FFC000FFC07F0000>33 27 -3 0 38]110 dc[<003FE000 -01FFFC0007F07F000FC01F801F800FC03F800FE03F800FE07F0007F07F0007F0FF0007F8FF0007 -F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F0007F07F0007F07F0007F03F00 -07E03F800FE01F800FC00FC01F8003F07E0001FFFC00003FE000>29 27 -2 0 34]111 dc[<FF -FE000000FFFE000000FFFE0000000FE00000000FE00000000FE00000000FE00000000FE0000000 -0FE00000000FE00000000FE00000000FE00000000FE1FC00000FE7FF80000FFE0FE0000FF803F0 -000FF001F8000FE001FC000FE000FE000FE000FF000FE000FF000FE0007F000FE0007F800FE000 -7F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F000FE0007F000FE0 -00FF000FE000FE000FE000FC000FF001F8000FF803F000FFFE07E000FFE7FF8000FFE1FE0000> -33 39 -2 12 38]112 dc[<FFFF00FFFF00FFFF000FE0000FE0000FE0000FE0000FE0000FE000 -0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FF01C0FF03E0FF07F -0FD87F0FD87FFFCE3EFFC7FCFFC1F0>24 27 -2 0 28]114 dc[<C1FF00F7FFC0FF01E0FC0070 -F80038F00038F0003CE0003C60007C0000FC0003FC00FFF807FFF81FFFF03FFFE07FFF807FFE00 -FFE000FC0000F80070F00070F000707000703800F01E03F00FFFF003FE30>22 27 -2 0 27] -115 dc[<001F8000FFC001F86003F87003F03807F03807F03807F03807F03807F03807F03807F0 -0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F000FFFF -F0FFFFF01FFFF007F00003F00003F00001F00000F00000F00000F0000070000070000070000070 -00>21 38 -1 0 27]116 dc[<003FC3FF8001FFF3FF8003F03BFF8007E00FF80007E007F8000F -E007F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800 -0FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8 -000FE003F8000FE003F8000FE003F800FFE03FF800FFE03FF800FFE03FF800>33 27 -3 0 38] -117 dc[<0001C000000003E000000003E000000007F000000007F00000000FF80000000FF80000 -000FF80000001FDC0000001FDC0000003FDE0000003F8E0000007F8F0000007F070000007F0700 -0000FE03800000FE03800001FC01C00001FC01C00003FC01E00003F800E00007F800F00007F000 -700007F0007000FFFE03FF80FFFE03FF80FFFE03FF80>33 27 -1 0 36]118 dc[<00078003C0 -0000078003C000000FC007E000000FC007E000000FC007E000001FE00FF000001FE00FF000003F -F01FF800003FF01FB800003FF01FB800007F783F3C00007F383F1C0000FF383F1E0000FE1C7E0E -0000FE1C7E0E0001FE1EFC0F0001FC0EFC070001FC0EFC070003F807F8038003F807F8038007F8 -07F803C007F003F001C007F003F001C00FE007E000E0FFFE7FFC0FFEFFFE7FFC0FFEFFFE7FFC0F -FE>47 27 -1 0 50]119 dc[<FFF01FFF80FFF01FFF80FFF01FFF8003C007F00001C00FE00001 -E01FE00000F01FC00000783F8000003C7F0000001EFE0000001FFE0000000FFC00000007F80000 -0007F00000000FF00000000FF00000001FF00000003FF80000007F3C000000FF1E000000FE0F00 -0001FC07800003F807800007F003C000FFFC0FFF00FFFC0FFF00FFFC0FFF00>33 27 -1 0 36] -120 dc[<0FC00000003FE00000007C78000000FE3C000000FE1E000000FE0E000000FE0F000000 -7C070000003807800000000380000000038000000001C000000001C000000003E000000003E000 -000007F000000007F00000000FF80000000FF80000000FF80000001FDC0000001FDC0000003FDE -0000003F8E0000007F8F0000007F070000007F07000000FE03800000FE03800001FC01C00001FC -01C00003FC01E00003F800E00007F800F00007F000700007F0007000FFFE03FF80FFFE03FF80FF -FE03FF80>33 39 -1 12 36]121 dc[<FFFFFF00FFFFFF007F007F003F801F003FC00F001FE007 -000FE007800FF0078007F8038003F8038001FC038001FE038000FF0000007F0000007F8000003F -C000001FC000700FE000700FF0007007F8007803F8007803FC003801FE003C00FE003F007F003F -FFFF803FFFFF80>25 27 -2 0 31]122 dc /fe df[<01FC003F800FFF81FFE01F81E7F0783F00 -7FC0187E003F000CFE007E000CFC00FF0000FC01F98000FC03F0C000FC07F0C0007C07E060003C -0FC030001E1F8018000E1F001800073F000C0003BE00060000FE000600007C00030000FC000180 -00FC00018000FE001FFC00FF001FFC01F380000001F180000001F0C0000001F060000001F06000 -0001E030000001E030000000F030000000F030000000706000000038600000001FC00000000F80 -0000>38 35 -2 0 44]38 dc[<00180030006000C001C00380070007000E001E001C003C003C00 -3C007800780078007800F800F000F000F000F000F000F000F000F000F000F000F000F800780078 -00780078003C003C003C001C001E000E0007000700038001C000C0006000300018>13 49 -5 12 -22]40 dc[<C0006000300018001C000E0007000700038003C001C001E001E001E000F000F000F0 -00F000F80078007800780078007800780078007800780078007800F800F000F000F000F001E001 -E001E001C003C00380070007000E001C00180030006000C000>13 49 -3 12 22]41 dc[<FFFC -FFFCFFFCFFFC>14 4 -1 -9 19]45 dc[<387CFEFEFE7C38>7 7 -4 0 16]46 dc[<00FE0007FF -C00F83E01F01F03E00F83E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC00 -7EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007C7C007C7C007C7C007C3E00F83E00 -F81F01F00F83E007FFC000FE00>23 32 -2 0 28]48 dc[<7FFFE07FFFE001F80001F80001F800 -01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800 -01F80001F80001F80001F80001F80001F80001F80001F80001F800FFF800FFF80001F800007800 -001800>19 32 -4 0 28]49 dc[<FFFFF0FFFFF07FFFF03FFFF01FFFF00FFFF00E003807001803 -801801C01800E018007000003800003E00001F00000F800007C00007E00003F00003F00003F838 -03F87C01F8FE01F8FE03F8FE03F8FE03F07C07F07007E03C1FC00FFF0003FC00>21 32 -3 0 28 -]50 dc[<01FE000FFFC01E07F07801F87E01FCFF00FCFF00FEFF00FEFF00FE7E00FE3C00FE0000 -FC0000FC0001F80001F00007C001FF0001FE00001F800007C00003E00003F01F03F01F03F83F81 -F83F81F83F81F83F03F01E03F00F07E007FFC000FE00>23 32 -2 0 28]51 dc[<00FFFE00FFFE -0007E00007E00007E00007E00007E00007E00007E0FFFFFEFFFFFEE007E07007E03807E01807E0 -0C07E00E07E00707E00307E00187E001C7E000E7E00077E00037E0001FE0001FE0000FE00007E0 -0003E00003E00001E00000E0>23 32 -2 0 28]52 dc[<03F8000FFF001C1F803007C07007E0FC -03F0FC03F0FE03F8FE03F87C03F83803F80003F80003F80003F00003F01803E01807E01E0FC01F -FF0019FC001800001800001800001800001BC0001FF8001FFE001FFF001FFF801FFFC01E01E010 -0020>21 32 -3 0 28]53 dc[<00FF0003FFC00783E00F00F01E00F83E007C3C007C7C007E7C00 -7E7C007EFC007EFC007EFC007EFC007EFE007CFE007CFF00F8FD80F0FCFFE0FC7FC0FC08007C00 -007C00007E00F03E01F83E01F81F01F80F01F807C0F003F07000FFE0001F80>23 32 -2 0 28] -54 dc[<01E00003F00003F00003F00003F00003F00003F00003F00001F00001F00001F00000F0 -0000F00000F000007800007800003800001800001C00000C00000600C00300C00300C00180E000 -C0E000607FFFF07FFFF87FFFF87FFFFC7FFFFE7FFFFE780000600000>23 34 -3 0 28]55 dc[< -01FF000FFFC01F01F03C0038780038F8001CF0001CF0001EF0001EF0003EF000FE7801FE7807FC -3C1FFC1E7FF807FFF003FFE007FFC00FFF801FFFC01FF9E03FE0F03F80783F00783E00783C0078 -1C00781C00F00E00F00703E003FFC000FE00>23 32 -2 0 28]56 dc[<03F8000FFE001C0F801E -03C03F01E03F00F03F00F83F00F81E007C00007C00007C00207E07FC7E0FFE7E1E037E3E01FE7C -00FE7C00FEFC007EFC007EFC007EFC007EFC007CFC007CFC007C7C00787C00F83E00F01E01F00F -83E007FF8001FE00>23 32 -2 0 28]57 dc[<387CFEFEFE7C380000000000000000387CFEFEFE -7C38>7 22 -4 0 16]58 dc[<FFE00FFFF8FFE00FFFF80600007F000600007F00030000FE0003 -0000FE00038001FE00018001FC00018001FC0000FFFFF80000FFFFF80000E007F800006007F000 -00600FF00000300FE00000300FE00000381FE00000181FC00000183FC000000C3F8000000C3F80 -00000E7F800000067F00000006FF00000003FE00000003FE00000003FE00000001FC00000001FC -00000000F800000000F800000000F8000000007000000000700000>37 34 -2 0 42]65 dc[<FF -FFFFC000FFFFFFF80007F001FE0007F0007F0007F0003F8007F0003F8007F0001FC007F0001FC0 -07F0001FC007F0001FC007F0001FC007F0001FC007F0001F8007F0003F8007F0003F0007F0007E -0007F001FC0007FFFFF00007FFFFF00007F003F80007F000FC0007F000FE0007F0007E0007F000 -7F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007E0007F0007E0007F000FC0007F0 -01F800FFFFFFE000FFFFFF8000>34 34 -2 0 40]66 dc[<0003FE0000001FFFC00000FF00F000 -01F800380003F0000C0007C00006000F800003001F800003003F000003803F000001807F000001 -807E000001807E00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 -0000FE00000000FE000000007E000001807E000001807F000001803F000003803F000003801F80 -0007800F8000078007C0000F8003E0001F8001F8003F8000FF01E380001FFF81800003FE0080> -33 34 -3 0 40]67 dc[<FFFFFF8000FFFFFFF00007F003FC0007F0007E0007F0003F0007F000 -1F8007F0000FC007F00007E007F00007E007F00003F007F00003F007F00003F007F00003F807F0 -0003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807 -F00003F007F00003F007F00003F007F00007F007F00007E007F00007E007F0000FC007F0001F80 -07F0003F0007F0007E0007F003FC00FFFFFFF000FFFFFF8000>37 34 -2 0 43]68 dc[<FFFFFF -FCFFFFFFFC07F001FC07F0003E07F0001E07F0000E07F0000E07F0000607F0000607F0000607F0 -000307F0180307F0180307F0180007F0180007F0380007F0780007FFF80007FFF80007F0780007 -F0380007F0180007F0180607F0180607F0180607F0000607F0000E07F0000E07F0000C07F0001C -07F0003C07F000FCFFFFFFFCFFFFFFFC>32 34 -2 0 37]69 dc[<FFFFE000FFFFE00007F00000 -07F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0180007F0180007F018 -0007F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007F0 -180C07F0180C07F0000C07F0000C07F0001C07F0001C07F0001807F0003807F0007807F001F8FF -FFFFF8FFFFFFF8>30 34 -2 0 35]70 dc[<0003FF00C0001FFFC3C0007F80E7C001FC003FC003 -F0001FC007E0001FC00FC0001FC01F80001FC03F00001FC03F00001FC07F00001FC07F00001FC0 -7E000FFFFCFE000FFFFCFE00000000FE00000000FE00000000FE00000000FE00000000FE000000 -00FE000000007E000000C07E000000C07F000000C03F000001C03F000001C01F800003C00FC000 -03C007C00007C003F0000FC001F8003FC0007F00F1C0001FFFC0C00003FE0040>38 34 -3 0 44 -]71 dc[<FFFF83FFFEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0 -07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F -C007F0001FC007F0001FC007FFFFFFC007FFFFFFC007F0001FC007F0001FC007F0001FC007F000 -1FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0 -001FC007F0001FC0FFFF83FFFEFFFF83FFFE>39 34 -2 0 44]72 dc[<FFFFE0FFFFE003F80003 -F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003 -F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003 -F80003F80003F800FFFFE0FFFFE0>19 34 -1 0 21]73 dc[<FFFFFFF0FFFFFFF007F007F007F0 -01F007F000F007F0007007F0007007F0003807F0003807F0001807F0001807F0001807F0001807 -F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000 -07F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000FFFFE0 -00FFFFE000>29 34 -2 0 34]76 dc[<FFF00600FFFFFFF00F00FFFF06000F0007E006001F8007 -E006001F8007E006001F8007E006003FC007E006003FC007E006007E6007E006007E6007E00600 -FC3007E00600FC3007E00601F81807E00601F81807E00601F81807E00603F00C07E00603F00C07 -E00607E00607E00607E00607E0060FC00307E0060FC00307E0060FC00307E0061F800187E0061F -800187E0063F0000C7E0063F0000C7E0067E000067E0067E000067E006FC000037E006FC000037 -E006FC000037E007F800001FE0FFF800001FFFFFF000000FFF>48 34 -2 0 53]77 dc[<FFF000 -00C0FFF00001C006000003C006000003C006000007C00600000FC00600001FC00600003FC00600 -007FC00600007FC0060000FFC0060001FEC0060003FCC0060007F8C0060007F0C006000FF0C006 -001FE0C006003FC0C006007F80C00600FF00C00600FE00C00601FE00C00603FC00C00607F800C0 -060FF000C0060FE000C0061FE000C0063FC000C0067F8000C006FF0000C007FE0000C007FC0000 -C0FFFC001FFEFFF8001FFE>39 34 -2 0 44]78 dc[<0007FC0000003FFF800000FC07E00003F0 -01F80007E000FC000FC0007E001F80003F003F80003F803F00001F807F00001FC07F00001FC07E -00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0 -FE00000FE0FE00000FE07E00000FC07E00000FC07F00001FC03F00001F803F00001F801F80003F -001F80003F000FC0007E0007E000FC0003F001F80000FC07E000003FFF80000007FC0000>35 34 --3 0 42]79 dc[<FFFF8000FFFF800007F0000007F0000007F0000007F0000007F0000007F000 -0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007FFFF0007FFFFE007F0 -07F007F001FC07F000FC07F0007E07F0007E07F0007F07F0007F07F0007F07F0007F07F0007F07 -F0007E07F0007E07F000FC07F001FC07F007F0FFFFFFE0FFFFFF00>32 34 -2 0 38]80 dc[<FF -FF800FF0FFFF803FF807F000FF0C07F000FE0607F001FC0607F001FC0007F001FC0007F001FC00 -07F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F003F80007F007F00007F00FE0 -0007FFFF800007FFFFC00007F007F00007F001F80007F000FC0007F0007E0007F0007F0007F000 -7F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007E0007F000FC0007F001F80007F0 -07F000FFFFFFC000FFFFFE0000>39 34 -2 0 42]82 dc[<80FF80C7FFE0FF00F8FC003CF0003C -E0001EE0001EC0001FC0001FC0001F00003F00003F00007F0003FF003FFE03FFFE0FFFFC1FFFF8 -3FFFF07FFFC07FFF00FFE000FF0000FC0000FC000CF8000CF8000C78001C78001C7C003C3C007C -1F03FC07FF8C01FC04>24 34 -3 0 31]83 dc[<03FFFFF80003FFFFF8000003F800000003F800 -000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8 -00000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003 -F800000003F800000003F80000C003F800C0C003F800C0C003F800C0C003F800C0E003F801C0E0 -03F801C06003F801807003F803807803F807807E03F80F807FFFFFFF807FFFFFFF80>34 34 -2 -0 39]84 dc[<0001FF0000000FFFE000003F80F800007E001C0000FC000E0001F800060003F800 -030003F000030007F000018007F000018007F000018007F000018007F000018007F000018007F0 -00018007F000018007F000018007F000018007F000018007F000018007F000018007F000018007 -F000018007F000018007F000018007F000018007F000018007F000018007F000018007F0000180 -07F000018007F0000180FFFF803FFCFFFF803FFC>38 34 -2 0 43]85 dc[<0000E0000E000000 -00E0000E00000000F0001E00000001F0001F00000001F0001F00000003F8003F80000003F8003F -80000003FC007F80000007FC007FC0000007FC007FC000000FF600FFE000000FE600FE6000000F -E600FE6000001FE301FC3000001FC301FC3000001FC383FC3000003F8183F81800003F8183F818 -00007F80C7F81C00007F00C7F00C00007F00C7F00C0000FF006FE0060000FE006FE0060000FE00 -7FE0060001FC003FC0030001FC003FC0030003FC003F80038003F8003F80018003F8007F800180 -07F0007F0000C007F0007F0000C00FF000FF0000E0FFFF0FFFF01FFEFFFF0FFFF01FFE>55 34 --1 0 58]87 dc[<07E03F1FF87F7E0CF87E02F0FC01F0FC01F0FC01F0FC01F07E01F03F01F01F -C1F003FDF0003FF00001F00001F01E01F03F01F03F01E03F03E03F07C01FFF8007FC00>24 22 --2 0 27]97 dc[<180FC0001C3FF8001EE07C001FC03E001F801F001F001F801F000F801F000F -C01F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000F801F000F801F00 -1F001F801E001FF07C001F3FF8001F0FE0001F0000001F0000001F0000001F0000001F0000001F -0000001F0000001F0000001F0000001F0000001F000000FF000000FF000000>26 35 -2 0 31] -98 dc[<00FE0007FF800FC0E01F00603E00307E00007E00007C0000FC0000FC0000FC0000FC00 -00FC0000FC00007C00007C01E07E03F03E03F01F03F00F83F007FFE000FF80>20 22 -2 0 25] -99 dc[<01FC3FC007FF3FC00F83BE001E00FE003E007E007C003E007C003E00FC003E00FC003E -00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007E003E003E003E001F00 -7E000F81FE0007FFBE0001FC3E0000003E0000003E0000003E0000003E0000003E0000003E0000 -003E0000003E0000003E0000003E0000003E000001FE000001FE00>26 35 -2 0 31]100 dc[< -00FF0003FFC00FC0701F00303E00187E00007C00007C0000FC0000FC0000FC0000FFFFF8FFFFF8 -FC00F8FC00F87C00F87C00F03E01F01E01E00F87C007FF8000FE00>21 22 -2 0 26]101 dc[< -7FF8007FF8000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8000 -0F80000F80000F80000F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F8000 -0F80000F80000F83C00F87E007C7E003C7E001E3E000FFC0003F80>19 35 -1 0 17]102 dc[< -01FF000FFFE03F01F87C007C78003CF0001EF0001EF0001EF0001E70003E3800FC1FFFFC0FFFF8 -1FFFF03FFF8038000030000030000013FC001FFF001F0F803E07C03C03C07C03E07C03E07C03E0 -7C03E07C03E03C03C03E07CF1F0F8F0FFF7F03FC1E>24 33 -2 11 28]103 dc[<FFE1FFC0FFE1 -FFC01F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F -003E001F003E001F003E001F003E001F003E001F803E001F803E001F403C001F307C001F1FF800 -1F07E0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000 -001F0000001F000000FF000000FF000000>26 35 -2 0 31]104 dc[<FFE0FFE01F001F001F00 -1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FF00FF000000000000 -0000000000000000001C003F007F007F007F003F001C00>11 36 -2 0 16]105 dc[<1F807FE0 -78F8FC7CFC3CFC3E783E003E003E003E003E003E003E003E003E003E003E003E003E003E003E00 -3E003E003E003E003E003E003E003E003E03FE03FE00000000000000000000000000000038007C -00FE00FE00FE007C0038>15 46 3 10 17]106 dc[<FFE0FFC0FFE0FFC01F003C001F007C001F -00F8001F01F0001F01E0001F03E0001F07C0001F0F80001FCF00001FFF00001F7E00001F1C0000 -1F0E00001F0700001F0380001F01C0001F0060001F0038001F00FF801F00FF801F0000001F0000 -001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000FF00 -0000FF000000>26 35 -2 0 30]107 dc[<FFE0FFE01F001F001F001F001F001F001F001F001F -001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 -1F001F001F00FF00FF00>11 35 -2 0 16]108 dc[<FFE0FFE0FFE0FFE0FFE0FFE01F001F001F -001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 -1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F -001F801F801F001F801F801F001F403E403E001F303E303E00FF1FFC1FFC00FF07F007F000>43 -22 -2 0 48]109 dc[<FFE1FFC0FFE1FFC01F003E001F003E001F003E001F003E001F003E001F -003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F803E00 -1F803E001F403C001F307C00FF1FF800FF07E000>26 22 -2 0 31]110 dc[<00FE0007FFC00F -83E01F01F03E00F87C007C7C007CFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C -007C7C007C3E00F81E00F00F83E007FFC000FE00>23 22 -2 0 28]111 dc[<FFE00000FFE000 -001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0FC0001F3F -F8001FE0FC001FC03E001F803F001F001F801F001F801F000FC01F000FC01F000FC01F000FC01F -000FC01F000FC01F000FC01F000FC01F001F801F001F801F001F001F803E001FF07C00FF3FF800 -FF0FE000>26 32 -2 10 31]112 dc[<0000FFE00000FFE000001F0000001F0000001F0000001F -0000001F0000001F0000001F0000001F0001FC1F0007FF9F000FC1DF001F007F003E003F007E00 -1F007E001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F007C001F007E -001F007E003F003F003F001F006F000FC1C70007FF870000FE0300>27 32 -2 10 30]113 dc[< -FFF000FFF0001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0000 -1F00001F00001F83C01E87E01E87E01EC7E01E67E0FE3FC0FE1F00>19 22 -2 0 23]114 dc[< -C7F000EFFC00FC0E00F00700E00380E00380C00380C00780000F8001FF000FFF003FFE007FF800 -7FE000FC0000F00300E00300E00300600700781F003FFF000FF300>17 22 -2 0 22]115 dc[< -00F80003FE0007C3000F83000F81800F81800F81800F81800F81800F80000F80000F80000F8000 -0F80000F80000F80000F80000F80000F80000F8000FFFF00FFFF003F80000F8000078000078000 -038000038000018000018000018000018000>17 32 -1 0 22]116 dc[<01FC3FC007FF3FC00F -81BE001F00FE001F007E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00 -1F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00FF01FE00FF01FE -00>26 22 -2 0 31]117 dc[<000E0000000E0000001F0000001F0000003F8000003F8000007F -C000007CC000007CC00000F8600000F8600001F0300001F0300003E0180003E0180007E01C0007 -C00C000FC00E000F8006000F800600FFE01FE0FFE01FE0>27 22 -1 0 30]118 dc[<001800C0 -00003800E000003C01E000007C01F000007E03F000007E03F00000FE03D80000FB07D80001FB07 -9C0001F38F8C0001F18F0C0003E18F060003E0DF060007E0DE070007C0DE030007C07E03000F80 -7C01800F807C01800F807801801F007800C0FFE7FF07F8FFE7FF07F8>37 22 -1 0 40]119 dc[ -<FF80FFE0FF80FFE00E003E0007007E000380FC0001C0F80000C1F0000063E0000037C000003F -C000001F8000001F0000003F0000007F800000F9800001F8C00003F0600003E0700007C038000F -801C00FFE07FC0FFE07FC0>27 22 -1 0 30]120 dc[<1F0000007F80000069C00000FC600000 -FC300000FC3800007818000000180000000C0000000C0000000E0000000E0000001F0000001F00 -00003F8000003F8000007FC000007CC000007CC00000F8600000F8600001F0300001F0300003E0 -180003E0180007E01C0007C00C000FC00E000F8006000F800600FFE01FE0FFE01FE0>27 32 -1 -10 30]121 dc /ff df[<0F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F -00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F0FFF8F0FFF8F0FFF8F00F00000F00000F -00000F00000F00000F00000F000007000007800003F8F001F8F000F8F00000F0>20 33 0 0 24] -12 dc[<018001C001800180C183E187F99F7DBE1FF807E007E01FF87DBEF99FE187C183018001 -8001C00180>16 20 -3 -14 23]42 dc[<FFC0FFC0FFC0>10 3 -1 -9 15]45 dc[<F0F0F0F0> -4 4 -4 0 13]46 dc[<FFFEFFFEFFFE03C003C003C003C003C003C003C003C003C003C003C003 -C003C003C003C003C003C003C003C003C003C003C0F3C0FFC0FFC00FC001C000C0>15 31 -4 0 -23]49 dc[<FFFFC0FFFFC0FFFFC07000003800001C00000E000007000003800001C00000E00000 -7800003C00001C00000E00000F000007800007800003C00003C00003C04003C04003C0E003C0E0 -0780600780700F00383F001FFE000FFC0007F000>18 31 -2 0 23]50 dc[<F0F0F0F000000000 -0000000000000000F0F0F0F0>4 20 -4 0 13]58 dc[<E0606030301878787878000000000000 -00000000000078787878>5 26 -3 6 13]59 dc[<F00003E0780003C0780003C0780007C03C00 -07803C0007803C000F801E000F001E000F000FFFFE000FFFFE000FFFFE0007003C0007803C0007 -803C000380780003C0780003C0780001C0F00001E0F00001E0F00000E0E00000E1E00000F1E000 -0071C0000073C000007BC000003B8000003B8000003F8000001F0000001F0000>27 32 -1 0 30 -]65 dc[<FFFC00FFFF80FFFFC0F007E0F001F0F000F0F00078F00078F00078F00078F00078F000 -78F000F0F001E0F007E0FFFF80FFFF00FFFF00F01F80F003C0F001E0F000F0F000F0F000F0F000 -F0F000F0F001E0F003E0F00FC0FFFF80FFFF00FFF800>21 32 -5 0 30]66 dc[<001FC000FFF0 -01FFFC03E03E07800E0F00021E00003E00003C00007C0000780000780000780000F00000F00000 -F00000F00000F00000F00000F00000F000007800007800007800007C00003C00003E00001E0000 -0F000007800C03E03C01FFFC00FFF8001FC0>23 34 -3 1 29]67 dc[<FFFC00FFFF80FFFFC0F0 -07E0F001F0F000F8F0007CF0003CF0001EF0001EF0001EF0000FF0000FF0000FF0000FF0000FF0 -000FF0000FF0000FF0000FF0000EF0001EF0001EF0003CF0003CF00078F000F8F001F0F007E0FF -FFC0FFFF80FFFC00>24 32 -5 0 33]68 dc[<FFFFE0FFFFE0FFFFE0F00000F00000F00000F000 -00F00000F00000F00000F00000F00000F00000F00000F00000FFFF80FFFF80FFFF80F00000F000 -00F00000F00000F00000F00000F00000F00000F00000F00000F00000FFFFC0FFFFC0FFFFC0>19 -32 -5 0 27]69 dc[<F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000 -F00000F00000F00000F00000F00000FFFF00FFFF00FFFF00F00000F00000F00000F00000F00000 -F00000F00000F00000F00000F00000F00000FFFFC0FFFFC0FFFFC0>18 32 -5 0 26]70 dc[<00 -1FC000FFF801FFFE03E03E07801E0F001E1E001E3E001E3C001E7C001E78001E78001E7803FEF0 -03FEF003FEF00000F00000F00000F00000F00000F000007800007800007800007C00003C00003E -00001E00000F000007800E03E03E01FFFE00FFF8001FE0>23 34 -3 1 30]71 dc[<F0F0F0F0F0 -F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0>4 32 -4 0 13]73 dc[<0F -C07FE0FFF0E078C078003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C -003C003C003C003C003C003C003C003C003C003C003C003C003C>14 33 -2 1 21]74 dc[<FFFF -80FFFF80FFFF80F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000 -00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000 -00F00000F00000F00000F00000F00000>17 32 -5 0 25]76 dc[<F0000078F00F8078F00F8078 -F00F8078F019C078F019C078F019C078F039E078F039E078F030E078F070F078F070F078F06070 -78F0E07878F0E07878F0C03878F0C03878F1C03C78F1C03C78F1801C78F3801E78F3801E78F300 -0E78F3000E78F3000E78F6000778F6000778F6000778F4000378FC0003F8FC0003F8F80001F8> -29 32 -5 0 40]77 dc[<F001F8F003F8F003F8F00378F00778F00778F00E78F00E78F00E78F0 -1E78F01C78F03C78F03C78F03878F07878F07078F07078F0F078F0E078F1E078F1E078F1C078F3 -C078F38078F38078F38078F70078F70078F60078FE0078FE0078FC0078>21 32 -5 0 32]78 dc -[<003F000000FFC00003FFF00007E1F8000F807C001F003E001E001E003C000F003C000F007800 -07807800078078000780F80007C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F0 -0003C0F00003C0F00003C07800078078000780780007803C000F003C000F001E001E001F003E00 -0F807C0007E1F80003FFF00000FFC000003F0000>26 34 -3 1 33]79 dc[<F00000F00000F000 -00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFF800FFFF00FFFF -80F00FC0F003E0F001E0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F001E0F003E0F00F -C0FFFF80FFFF00FFF800>20 32 -5 0 29]80 dc[<F0003CF00078F00078F000F0F000F0F001E0 -F001C0F003C0F00780F00780F00F00F00F00F01E00F01E00F03C00FFF800FFFF00FFFF80F007C0 -F003E0F001E0F000F0F000F0F000F0F000F0F000F0F001E0F003E0F007C0FFFF80FFFF00FFF800 ->22 32 -5 0 29]82 dc[<03F8001FFE007FFF00FC0F80F007C0C003C00001C00001E00001E000 -01E00001E00001E00003E00003C00007C0003F8001FF0007FE000FFC001FE0003F00003C00007C -00007800007800007800007800007800003C00003C00C01F03C00FFFC007FF8001FC00>19 34 --2 1 25]83 dc[<001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E00 -00001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E -0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E000000 -1E0000001E0000FFFFFFC0FFFFFFC0FFFFFFC0>26 32 -2 0 31]84 dc[<01F80007FE000FFF00 -1F0F803C03C03C03C07801E07801E0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0 -F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0F000F0 -F000F0F000F0F000F0F000F0>20 33 -5 1 31]85 dc[<001F0000001F0000003F8000003B8000 -003B8000007BC0000071C00000F1E00000F1E00000F0E00001E0F00001E0F00001E0700003C078 -0003C0780003C0380007803C0007803C0007801C000F001E000F001E001F000F001E000F001E00 -0F003C0007803C0007803C000780780003C0780003C0780003C0F00001E0F00001E0>27 32 -1 -0 30]86 dc[<00F8001F0000F8001F0000F8003F0001DC003B8001DC003B8001DC003B8001DC00 -738003CE0073C0038E0071C0038E0071C0078E00F1E0078F00E1E0078700E1E0070700E0E00F07 -01E0F00F0781E0F00F0381C0F00E0381C0701E0383C0781E03C3C0781E01C380783C01C3803C3C -01C7803C3C01E7803C3C00E7003C7800E7001E7800E7001E7800EE001E78006E000EF0007E000F -F0007E000FF0007C000F>40 32 -1 0 43]87 dc[<1F8F3FEF7FFFF83FF00FF00FF00FF80F7E0F -1FFF07FF003F000F000F000F401F701E7FFC3FF807E0>16 20 -2 0 22]97 dc[<F1E000F7F800 -FFFC00FC3E00F81F00F00F00F00F00F00780F00780F00780F00780F00780F00780F00780F00F00 -F80F00FC3E00FFFE00F7FC00F1F000F00000F00000F00000F00000F00000F00000F00000F00000 -F00000F00000F00000F00000>17 32 -3 0 23]98 dc[<03F00FFE1FFF3E0F3C0178007800F000 -F000F000F000F000F000780078003C023E0E1FFE0FFC03F0>16 20 -2 0 20]99 dc[<07C7800F -F7801FFF803E1F80780F80780780F00780F00780F00780F00780F00780F00780F00780F8078078 -07807C07803E1F801FFF800FF78007C78000078000078000078000078000078000078000078000 -0780000780000780000780000780>17 32 -2 0 23]100 dc[<01F80007FE001FFF003E07003C -0100780000700000F00000F00000F00000FFFF80FFFF80FFFF807003807807003C07003E1F001F -FE000FFC0003F000>17 20 -1 0 20]101 dc[<0F000F000F000F000F000F000F000F000F000F -000F000F000F000F000F000F000F00FFF0FFF0FFF00F000F000F000F000F000F000F0007000780 -03FE01FE007E>15 32 0 0 14]102 dc[<03FC000FFF003FFFC07E07E0F801F0F000F0F000F0F0 -00F07803F03FFFE01FFFC03FFF803FFE0038000030000033E0003FF8001FFC003E3E003C1E0078 -0F00780F00780F00780F00780F003C1E003E3E001FFFF00FFFF003E0F0>20 30 -1 10 23]103 -dc[<F00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF80FF80FFC1FF7FEF3 -FCF1F8F000F000F000F000F000F000F000F000F000F000F000F000>16 32 -3 0 23]104 dc[< -F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F00000000000000000F0F0F0F0>4 32 -3 0 11] -105 dc[<3F00FF80FFC0C3C001E001E001E001E001E001E001E001E001E001E001E001E001E001 -E001E001E001E001E001E001E001E001E001E001E001E000000000000000000000000000000000 -01E001E001E001E0>11 41 3 9 12]106 dc[<F00F80F01F00F01E00F03E00F07C00F07C00F0F8 -00F8F000F9F000FFE000FFC000FFC000F78000F3C000F1E000F0F000F07800F03C00F01E00F01F -00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000>17 -32 -3 0 22]107 dc[<F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 -F0F0F0>4 32 -3 0 11]108 dc[<F007803CF007803CF007803CF007803CF007803CF007803CF0 -07803CF007803CF007803CF007803CF007803CF007803CF007803CF007803CF807C03CF807C03C -FE0FF07CF7FF3FF8F3FE1FF0F0FC07E0>30 20 -3 0 39]109 dc[<F00FF00FF00FF00FF00FF0 -0FF00FF00FF00FF00FF00FF00FF00FF00FF80FF80FFC1FF7FEF3FCF1F8>16 20 -3 0 23]110 -dc[<01F80007FE001FFF803F0FC03C03C07801E07801E0F000F0F000F0F000F0F000F0F000F0F0 -00F07801E07801E03C03C03F0FC01FFF8007FE0001F800>20 20 -1 0 23]111 dc[<F00000F0 -0000F00000F00000F00000F00000F00000F00000F00000F1E000F7F800FFFC00FC3E00F81F00F0 -0F00F00F00F00780F00780F00780F00780F00780F00780F00F80F00F00F81F00FC3E00FFFE00F7 -FC00F1F000>17 29 -3 9 23]112 dc[<F000F000F000F000F000F000F000F000F000F000F000 -F000F800F800FC00FC00FF00F7E0F3E0F0E0>11 20 -3 0 16]114 dc[<0FC07FF0FFF8F07CC0 -3C003C003C007C03F80FF81FF03FC07C00780078007800780C3FFC1FFC07F0>14 20 -1 0 17] -115 dc[<07C00FF01FF01E201E001E001E001E001E001E001E001E001E001E001E001E001E00FF -F0FFF0FFF01E001E001E001E001E001E00>12 26 -1 0 16]116 dc[<3F0F7FEFFFFFF03FF01F -F00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00F>16 20 -3 0 23] -117 dc[<07803E0007C03E0007C07E000EC077000EC077000EE077001EE0E7801E60E7801E60E7 -801C70E3803C71E3C03C71C3C03C31C3C07839C1E0783BC1E0783B81E0781B81E0F01F80F0F01F -80F0F01F00F0>28 20 -1 0 31]119 dc[<F801F07801E03C03C01E07800E0F000F0F00079E00 -03FC0001F80001F00000F00001F80003F80003FC00079E000F0F001E0F003E07807C03C07801E0 ->20 20 0 0 21]120 dc[<7C00007E00007F000007800003800001C00001C00001C00000E00000 -E00001F00001F00003B00003B80003B800073800073C000F1C000F1C000E1E001E1E001E0F003C -0F003C0F007C0780780780780780F003C0F003C0>18 29 -1 9 21]121 dc /fg df[<6030E038 -E038E038E038E038E038E038E038E038E038F078E0384010>13 14 -5 -15 24]34 dc[<C0F0F8 -381C1C0E0E0E3E7E7C7C38>7 14 -8 -14 24]39 dc[<007000F001F003C007800F001E001C00 -380038007000700070007000E000E000E000E000E000E000E000E0007000700070007000380038 -001C001E000F00078003C001E000F00070>12 36 -7 4 24]40 dc[<6000F00078003C001E000F -000780038001C001C000E000E000E000E00070007000700070007000700070007000E000E000E0 -00E001C001C0038007800F001E003C007800F0006000>12 36 -4 4 24]41 dc[<01C00001C000 -01C00001C000C1C180F1C780F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF80F1C780 -C1C18001C00001C00001C00001C000>17 20 -3 -4 24]42 dc[<60F87C1E0E071F3F7F7E3E1C> -8 12 -8 6 24]44 dc[<7FFF00FFFF80FFFF807FFF00>17 4 -3 -12 24]45 dc[<3078FCFC78 -30>6 6 -9 0 24]46 dc[<600000F00000F00000F800007800007C00003C00003C00003E00001E -00001F00000F00000F00000F800007800007C00003C00003C00003E00001E00001F00000F00000 -F800007800007800007C00003C00003E00001E00001E00001F00000F00000F8000078000078000 -0300>17 36 -3 4 24]47 dc[<01F00007FC000FFE001F1F001C07003803807803C07001C07001 -C0F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E07001C07001C07803 -C03803801C07001F1F000FFE0007FC0001F000>19 28 -2 0 24]48 dc[<7FFCFFFE7FFC038003 -80038003800380038003800380038003800380038003800380038003804380FB80FF803F800F80 -0780038003800180>15 28 -5 0 24]49 dc[<7FFFE0FFFFE07FFFE03C00E01E00E00F800007C0 -0001E00000F000007800003C00001E00000F000007800003C00001C00001C00000E00000E06000 -E0F000E0F000E0E001C07003C07C0F803FFF000FFE0003F000>19 28 -2 0 24]50 dc[<03F800 -1FFE003FFF007C0780F003C0F001C0F000E0F000E00000E00000E00000E00001C00003C0000780 -03FF0003FE0003FF00000F000003800003C00001C03001C07801C07803C07807803FFF001FFE00 -07F800>19 28 -2 0 24]51 dc[<007FF000FFF8007FF000070000070000070000070000070000 -0700FFFFF8FFFFF8FFFFF8F007007807003807003C07001E07000E070007070007870003870001 -C70001E70000E700007700007700003F00001F00>21 28 -1 0 24]52 dc[<03F0001FFC003FFF -007C0F807003C0E001C0F000E0F000E06000E00000E00000E00001C01803C03C07803FFF003FFE -003BF8003800003800003800003800003800003800003800003800003FFF803FFF801FFF80>19 -28 -2 0 24]53 dc[<01F80007FE000FFF001E07803C03C03801C07000E07000E07000E0F000E0 -E000E0F000E0F001C0F803C0FE0780FFFF00E7FE00E1F8007000007000003800003801801C03C0 -1E03C00F83C007FF8001FF00007E00>19 28 -2 0 24]54 dc[<03800003800003800003800003 -800003800003800003C00001C00001C00001C00001C00000E00000E00000E00000700000700000 -3800003800001C00001E00000E00000700E00780E003C0FFFFE0FFFFE0FFFFE0E00000>19 29 --2 0 24]55 dc[<03F8000FFE001FFF003E0F807803C07001C0E000E0E000E0E000E0E000E0F0 -01E07001C03C07801F1F000FFE0007FC001FFF003C07803803807001C07001C07001C07001C038 -03803E0F801FFF000FFE0003F800>19 28 -2 0 24]56 dc[<3078FCFC78300000000000000000 -3078FCFC7830>6 20 -9 0 24]58 dc[<60F0783C1C0E1E3E7E7E3C180000000000000000183C -7E7E3C18>7 26 -8 6 24]59 dc[<000300000780001F80003F00007E0001FC0003F00007E000 -1FC0003F00007E0000FC0000FC00007E00003F00001FC00007E00003F00001FC00007E00003F00 -001F80000780000300>17 24 -3 -2 24]60 dc[<7FFFC0FFFFE0FFFFE0FFFFE0000000000000 -000000000000FFFFE0FFFFE0FFFFE07FFFC0>19 12 -2 -8 24]61 dc[<600000F00000FC0000 -7E00003F00001FC00007E00003F00001FC00007E00003F00001F80001F80003F00007E0001FC00 -03F00007E0001FC0003F00007E0000FC0000F00000600000>17 24 -3 -2 24]62 dc[<7F07F0 -FF8FF87F07F01C01C01C01C00E03800E03800FFF800FFF800FFF80070700070700070700070700 -030600038E00038E00038E00038E00018C0001DC0001DC0001DC0000D80000D80000F80000F800 -007000>21 28 -1 0 24]65 dc[<FFFE00FFFF80FFFFC01C03E01C00E01C00F01C00701C00701C -00701C00701C00F01C00E01C03C01FFFC01FFF001FFF801C07C01C01C01C01E01C00E01C00E01C -00E01C00E01C01C01C03C0FFFF80FFFF00FFFC00>20 28 -1 0 24]66 dc[<00F80003FE0007FF -800F07C01E01C03C00E03800E07000E07000E0700000E00000E00000E00000E00000E00000E000 -00E00000E000007000007000E07000E03800E03C01E01E03E00F07E007FFE003FEE000F8E0>19 -28 -2 0 24]67 dc[<7FF800FFFE007FFF001C0F801C03C01C01C01C01E01C00E01C00E01C00F0 -1C00701C00701C00701C00701C00701C00701C00701C00701C00F01C00E01C00E01C01E01C03C0 -1C03C01C0F807FFF00FFFE007FF800>20 28 -1 0 24]68 dc[<FFFFF8FFFFF8FFFFF81C00381C -00381C00381C00381C00381C00001C00001C0E001C0E001C0E001FFE001FFE001FFE001C0E001C -0E001C0E001C00001C00001C00701C00701C00701C0070FFFFF0FFFFF0FFFFF0>21 28 -1 0 24 -]69 dc[<FFC000FFC000FFC0001C00001C00001C00001C00001C00001C00001C00001C1C001C1C -001C1C001FFC001FFC001FFC001C1C001C1C001C1C001C00001C00001C00E01C00E01C00E01C00 -E0FFFFE0FFFFE0FFFFE0>19 28 -2 0 24]70 dc[<7FFF00FFFF807FFF0001C00001C00001C000 -01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000 -01C00001C00001C00001C00001C00001C0007FFF00FFFF807FFF00>17 28 -3 0 24]73 dc[<0F -C0003FF0007FFC00F03C00F00E00F00E00000E00000E00000E00000E00000E00000E00000E0000 -0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0001FFC003 -FFC001FFC0>18 28 -3 0 24]74 dc[<7F03F0FF87F87F03F01C01C01C03801C03801C07001C07 -001C0E001C0E001E1C001F1C001FB8001FB8001DF0001DF0001CF0001C70001C38001C3C001C1E -001C0E001C07001C07801C03C07F07F0FF87F87F07F0>21 28 -1 0 24]75 dc[<FE03F8FE03F8 -FE03F83800E03800E03800E03800E03800E03800E03870E03870E038F8E038D8E038D8E039DCE0 -39DCE039DCE0398CE0398CE03B8EE03B8EE03B06E03B06E03B06E03B06E0FE03F8FE03F8FC01F8 ->21 28 -1 0 24]77 dc[<7F03C0FF87C07F07C01C0DC01C0DC01C0DC01C1DC01C19C01C19C01C -39C01C39C01C39C01C31C01C71C01C71C01C61C01CE1C01CE1C01CE1C01CC1C01CC1C01DC1C01D -81C01D81C01D81C07F07F0FF0FF87E07F0>21 28 -1 0 24]78 dc[<0FF8003FFE007FFF00780F -00700700F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E003 -80E00380E00380E00380E00380E00380F00780700700780F007FFF003FFE000FF800>17 28 -3 -0 24]79 dc[<7F00F0FF81F87F01F81C039C1C039C1C039C1C03801C03801C03801C03801C0380 -1C07001C0F001FFE001FFE001FFF001C0F801C03801C03C01C01C01C01C01C01C01C03C01C0380 -1C0F807FFF00FFFE007FF800>22 28 -1 0 24]82 dc[<E7F800FFFE00FFFF80F80780F001C0E0 -01E0E000E06000E00000E00000E00001C00003C0000F8000FF0007FE001FF0003F000078000070 -0000E00000E00380E00380E003807007807C0F803FFF801FFF8003F380>19 28 -2 0 24]83 dc -[<07FF0007FF0007FF000070000070000070000070000070000070000070000070000070000070 -00007000007000007000007000007000007000007000007000E07038E07038E07038E07038FFFF -F8FFFFF87FFFF8>21 28 -1 0 24]84 dc[<007C0001FF0003FF800783C00F01E00E00E01C0070 -1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C0070 -1C00701C00701C00701C00701C0070FF83FEFF83FEFF83FE>23 28 0 0 24]85 dc[<00700000 -F80000F80000D80001DC0001DC0001DC00018C00038E00038E00038E00038E0007070007070007 -07000707000F07800E03800E03800E03800E03801C01C01C01C01C01C01C01C0FF07F8FF07F8FF -07F8>21 28 -1 0 24]86 dc[<0E03800F07800F07800D05800D8D801D8DC01D8DC01D8DC01D8D -C0198CC019DCC019DCC019DCC039DCE039DCE038F8E038F8E03800E03800E03800E03800E03800 -E0700070700070700070FE03F8FE03F8FE03F8>21 28 -1 0 24]87 dc[<7F07F0FF8FF87F07F0 -1E03C00E03800E0780070700070F00038E00039E0001DC0001F80000F80000F00000700000F000 -00F00001F80001F80003DC00039C00078E00070E000F07000E07007F8FE07F9FE07F8FE0>21 28 --1 0 24]88 dc[<01FC0003FE0001FC0000700000700000700000700000700000700000700000 -700000700000F80000F80001DC0001DC0001DC00038E00038E000707000707000F07800E03801E -03C01C01C0FF07F8FF07F8FF07F8>21 28 -1 0 24]89 dc[<FFF8FFF8FFF8E000E000E000E000 -E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 -00E000E000E000E000E000E000FFF8FFF8FFF8>13 36 -9 4 24]91 dc[<FFF8FFF8FFF8003800 -380038003800380038003800380038003800380038003800380038003800380038003800380038 -003800380038003800380038003800380038FFF8FFF8FFF8>13 36 -1 4 24]93 dc[<7FFF00FF -FF80FFFF807FFF00>17 4 -3 4 24]95 dc[<387C7CFCF8E0E0E07070383E1E06>7 14 -8 -17 -24]96 dc[<07E1F01FFBF03FFFF0781F00F00F00E00700E00700E007007807007F07001FFF0007 -FF0000FF00000700000700300E00781E007FFC003FF8001FE000>20 20 -3 0 24]97 dc[<063E -000EFF800FFFC00FC1E00F80E00F00700F00700E00380E00380E00380E00380E00380E00380E00 -700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E00000E00007E0000FE00 -007E0000>21 28 0 0 24]98 dc[<01FC0007FF001FFF803E03C03801C07001C0700000E00000 -E00000E00000E00000E00000E000007000007000003803003E07801FFF8007FF0001FE00>18 20 --3 0 24]99 dc[<03E3F00FFBF81FFFF03C1F80380F80700780700780E00380E00380E00380E0 -0380E00380E00380700380700780380F803C1F801FFF800FFB8003E38000038000038000038000 -0380000380001F80003F80001F80>21 28 -2 0 24]100 dc[<01FC0007FF001FFF803E03C038 -01C07001C0700000E00000FFFFC0FFFFC0FFFFC0E001C0E001C07003807003803807803E0F001F -FE0007FC0001F000>18 20 -3 0 24]101 dc[<7FFF007FFF007FFF0001C00001C00001C00001 -C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000FFFFC0FFFFC07F -FFC001C00001C00001C00001C0C000E1E000FFE0007FC0001F80>19 28 -1 0 24]102 dc[<01 -FC000FFF801FFFC07E03F07800F0E00038E00038E00038E000387000707801F03FFFE01FFFC01F -FE001C000038000039E0001FF8001FFC001E1E001C0E003807003807003807003807003807001C -0E001E1E300FFFF807FFF801E1F0>21 31 -1 11 24]103 dc[<7FC3FCFFE7FE7FC3FC0E00E00E -00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00F00E00F80E00FC1C00F -FFC00EFF800E3E000E00000E00000E00000E00000E00007E0000FE00007E0000>23 28 0 0 24] -104 dc[<FFFF00FFFF80FFFF0001C00001C00001C00001C00001C00001C00001C00001C00001C0 -0001C00001C00001C00001C00001C0007FC000FFC0007FC0000000000000000000000000000380 -0007C00007C00007C000038000>17 29 -4 0 24]105 dc[<3F807FE0FFF0F0786038001C001C -001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 -1C0FFC1FFC0FFC00000000000000000038007C007C007C0038>14 39 -2 10 24]106 dc[<FFC7 -F8FFC7F8FFC7F80E03C00E03800E07000E0F000F0E000F9C000FFC000FF8000EF0000E78000E3C -000E1E000E0F000E07800E3FF00E7FF00E3FF00E00000E00000E00000E00000E0000FE0000FE00 -00FE0000>21 28 -1 0 24]107 dc[<7FFFC0FFFFE07FFFC000E00000E00000E00000E00000E0 -0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 -0000E00000E00000E00000E0007FE000FFE0007FE000>19 28 -2 0 24]108 dc[<7F1F1F00FF -BFBF807F1F1F001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C00 -1C1C1C001C1C1C001C1C1C001E1E1C001E1E1C001F1F1C007FFFF800FFFBF8007CE0E000>25 20 -1 0 24]109 dc[<7FC3FCFFE7FE7FC3FC0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E -00E00E00E00E00E00E00E00F00E00F80E00FC1C07FFFC0FEFF807E3E00>23 20 0 0 24]110 dc -[<01F0000FFE001FFF003E0F803C07807803C07001C0F001E0E000E0E000E0E000E0E000E0E000 -E07001C07001C03803803E0F801FFF000FFE0001F000>19 20 -2 0 24]111 dc[<7FC000FFE0 -007FC0000E00000E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1E00F80 -E00F00700F00700E00380E00380E00380E00380E00380E00380E00700F00700F80E00FC1E07FFF -C0FEFF807E3E00>21 30 0 10 24]112 dc[<7FFE00FFFF007FFE000380000380000380000380 -0003800003800003800003800003800003C00003C00003E00003F03003F8787FBFF8FF9FF07F87 -E0>21 20 -1 0 24]114 dc[<E7F000FFFC00FFFF00F80F00F00380E00380E00380600780001F -0003FE001FFC007FE0007C0000E00700E00700E00700780F007FFF003FFF0007F700>17 20 -3 -0 24]115 dc[<003E0000FF8001FFC001C1C00380E00380E00380E00380400380000380000380 -00038000038000038000038000038000038000FFFFC0FFFFC07FFFC00380000380000380000380 -00018000>19 25 -1 0 24]116 dc[<01FCFC03FFFE07FFFC0F03E00E01E00E00E00E00E00E00 -E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07E07E0FE0FE07E07E0>23 -20 0 0 24]117 dc[<00700000F80000F80001DC0001DC0001DC00038E00038E00038E00038E00 -0707000707000707000E03800E03800E03801E03C07F8FF0FF8FF87F8FF0>21 20 -1 0 24] -118 dc[<0707000F8F800F8F800D8D800DDD800DDD800DDD801CD9C01CD9C01CF9C01CF9C01C71 -C01C01C01C01C03800E03800E03800E0FF8FF8FF8FF8FF8FF8>21 20 -1 0 24]119 dc[<7F8F -F0FF8FF87F8FF00F0780070700038E00039E0001DC0000F80000F00000700000F80001F80001DC -00039E00078E000707007F8FF07F9FF07F8FF0>21 20 -1 0 24]120 dc[<1E00003F00007F80 -007BC00079E00000E00000F00000700000700000700000780000780000780000DC0000CC0000CC -0001CE0001CE00038E000386000387000707000707000703800E03800E03800E01C07F8FF0FF8F -F87F8FF0>21 30 -1 10 24]121 dc[<FFFFF0FFFFF0FFFFF07800703C00701E00700F00700780 -0003C00001F00000F800003C00001E00000F007007807003C07001E07FFFF07FFFF03FFFF0>20 -20 -1 0 24]122 dc[<0007E0001FE0007FE000780000E00000E00000E00000E00000E00000E0 -0000E00000E00000E00000E00000E00001E0007FC000FF8000FF80007FC00001E00000E00000E0 -0000E00000E00000E00000E00000E00000E00000E00000E00000E000007800007FE0001FE00007 -E0>19 36 -2 4 24]123 dc[<7C0000FF0000FFC00003C00000E00000E00000E00000E00000E0 -0000E00000E00000E00000E00000E00000E00000F000007FC0003FE0003FE0007FC000F00000E0 -0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00003C000FFC000FF00 -007C0000>19 36 -2 4 24]125 dc /fh df[<03F800FE000FFF07FF803F07DF81C07E00FE00E0 -7E00FC0060FC01FC0000FC03FE0000FC07E60000FC0FC300007C0F8180003C1F80C0001E3F0060 -000E7E006000077C00300001FC00180000F800180000F8000C0001F0000E0001F8007FE001FC00 -7FE003E600000003E300000003E180000003E0C0000003E060000003E060000003E060000001E0 -60000000E060000000F0C00000003F800000001F000000>35 32 -2 0 41]38 dc[<C000700038 -001C000E000E0007000380038003C001C001E001E000F000F000F000F000F80078007800780078 -0078007800780078007800F800F000F000F000F001E001E001C003C00380038007000E000E001C -0038007000C000>13 45 -3 11 20]41 dc[<2070180C0E060603033B7FFFFFFE7C38>8 16 -4 -9 15]44 dc[<FFF0FFF0FFF0FFF0>12 4 -1 -8 17]45 dc[<387CFEFEFE7C38>7 7 -4 0 15] -46 dc[<01FC0007FF001F8FC01E03C03E03E07C01F07C01F07C01F0FC01F8FC01F8FC01F8FC01 -F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F8FC01F87C01F07C01F07C01F03E03 -E01E03C01F07C007FF0001FC00>21 29 -2 0 26]48 dc[<FFFF80FFFF8003E00003E00003E000 -03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 -03E00003E00003E00003E00003E00003E000F3E000FFE0000FE00001E00000E000>17 29 -4 0 -26]49 dc[<FFFFC0FFFFC07FFFC03FFFC01FFFC01C00E00E006007006003806001C00000E00000 -F000007800003E00001F00001F80000FC0000FC0000FE03807E07C07E0FE07E0FE0FE0FE0FC0FE -0FC07C1F80383F001FFE0007F000>19 29 -3 0 26]50 dc[<03FC001FFF803C0FC07807E0FC03 -F0FE03F0FE03F8FE03F87C03F83803F80003F80003F00003E00007C0000F8001FC0001FC00001F -00000F80000FC01E0FC03F07E03F07E03F07E03F07E01E0FC00E0F8007FF0001FC00>21 29 -2 -0 26]51 dc[<00FFFE00FFFE0007C00007C00007C00007C00007C00007C0FFFFFEFFFFFEE003C0 -7003C03803C01803C00C03C00E03C00703C00383C00183C000C3C00063C00073C0003BC0001FC0 -000FC00007C00007C00003C00001C0>23 29 -1 0 26]52 dc[<07F0001FFC00381F00600F8078 -0FC0FC07C0FC07E0FC07E0FC07E07807E00007E00007E00007C01007C0380F803C1F0037FE0033 -F8003000003000003000003000003F80003FF0003FFC003FFE003FFF003FFF80380380>19 29 --3 0 26]53 dc[<01FE0007FF800F07C01E03E03E01F03C01F07C01F87C01F87C01F8FC01F8FC -01F8FC01F8FC01F8FE01F0FE01F0FD03E0FDFFC0FCFF00FC10007C00007C01E07C03F03E03F01E -03F01F03F00F81E007E0E001FFC0003F00>21 29 -2 0 26]54 dc[<00C00001E00003F00003F0 -0003F00003F00003F00003F00001F00001F00001F00001F00000F00000F0000070000078000038 -00003800001800000C00C00600C00300C00300E001807FFFC07FFFE07FFFF07FFFF87FFFF86000 -00>21 30 -3 0 26]55 dc[<03FC000FFF803E03C07C00E0780070F00070F00078F00078F000F8 -F001F87803F8780FF03C3FF01FFFE007FFC007FF800FFE001FFF001FE3803FC3C03F01E03E01E0 -3C01E03C01E01C01E01E03C00F078007FF0001FC00>21 29 -2 0 26]56 dc[<07F0001FFC0038 -1F003C07807E07C07E03E07E03E07E01F03C01F00001F00041F807F9F81FFDF83E05F87C03F87C -03F8FC01F8FC01F8FC01F8FC01F8FC01F0FC01F0FC01F07C01E07C03E03E03C01F07800FFF0001 -FC00>21 29 -2 0 26]57 dc[<387CFEFEFE7C38000000000000387CFEFEFE7C38>7 20 -4 0 -15]58 dc[<FFE00FFFE0FFE00FFFE00E0000FE00060000FC00060001FC00030001F800030001F8 -00018003F000018003F00001FFFFF00000FFFFE00000C007E00000600FC00000600FC00000701F -C00000301F800000303F800000183F000000183F0000000C7E0000000C7E0000000EFE00000006 -FC00000006FC00000003F800000003F800000001F000000001F000000001F000000000E0000000 -00E00000>35 31 -2 0 40]65 dc[<FFFFFF00FFFFFFE007C007F007C003F807C001FC07C000FC -07C000FE07C000FE07C000FE07C000FE07C000FE07C000FC07C001FC07C001F807C003F007FFFF -C007FFFF8007C00FE007C007F007C003F807C001F807C001FC07C001FC07C001FC07C001FC07C0 -01FC07C001F807C003F007C007E0FFFFFFC0FFFFFE00>31 31 -2 0 37]66 dc[<0007FC00003F -FF8000FE01C003F0007007E000380FC000181F80000C3F00000C3F0000067F0000067E0000067E -000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007E0000067E000006 -7F0000063F00000E3F00000E1F80001E0FC0001E07E0003E03F000FE00FE03DE003FFF0E0007FC -02>31 31 -3 0 38]67 dc[<FFFFFE0000FFFFFFC00007E007F00007E001F80007E000FC0007E0 -007E0007E0003F0007E0003F0007E0001F8007E0001F8007E0001F8007E0001FC007E0001FC007 -E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001F80 -07E0001F8007E0001F8007E0003F0007E0003F0007E0007E0007E000FC0007E001F80007E007F0 -00FFFFFFC000FFFFFE0000>34 31 -2 0 40]68 dc[<FFFFFFF0FFFFFFF007E003F007E000F807 -E0007807E0003807E0001807E0001807E0001807E0000C07E0600C07E0600C07E0600007E0E000 -07E1E00007FFE00007FFE00007E1E00007E0E00007E0600007E0603007E0603007E0003007E000 -3007E0007007E0006007E000E007E001E007E007E0FFFFFFE0FFFFFFE0>30 31 -2 0 34]69 dc -[<FFFF8000FFFF800007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 -000007E0600007E0600007E0600007E0E00007E1E00007FFE00007FFE00007E1E00007E0E00007 -E0600007E0603007E0603007E0003007E0003007E0007007E0006007E000E007E001E007E007E0 -FFFFFFE0FFFFFFE0>28 31 -2 0 33]70 dc[<0007FC0600003FFF8E0000FE01FE0003F000FE00 -07E0007E000FC0007E001F80007E003F00007E003F00007E007F00007E007E00007E007E00007E -00FE003FFFE0FE003FFFE0FE00000000FE00000000FE00000000FE00000000FE000000007E0000 -06007E000006007F000006003F00000E003F00000E001F80001E000FC0001E0007E0003E0003F0 -00FE0000FE03DE00003FFF0E000007FC0200>35 31 -3 0 41]71 dc[<FFFF0FFFF0FFFF0FFFF0 -07E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E -0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007FFFFFE0007FFFFFE0007E000 -7E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0 -007E0007E0007E0007E0007E0007E0007E00FFFF0FFFF0FFFF0FFFF0>36 31 -2 0 41]72 dc[< -FFFFFFFF07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007 -E007E007E007E007E007E007E007E007E007E0FFFFFFFF>16 31 -2 0 20]73 dc[<0FF0003FFE -00783F00FC1F80FE0F80FE0FC0FE0FC07C0FC0100FC0000FC0000FC0000FC0000FC0000FC0000F -C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000F -C0000FC003FFFC03FFFC>22 31 -1 0 27]74 dc[<FFFF03FFF0FFFF03FFF007E0007F0007E000 -7E0007E000FC0007E000FC0007E001F80007E003F00007E007E00007E00FE00007E00FC00007E0 -1F800007F03F000007F87F000007EC7E000007E6FC000007E3F8000007E1F8000007E0F0000007 -E030000007E018000007E00C000007E006000007E003800007E001C00007E000600007E0003000 -07E000180007E0001E00FFFF00FFE0FFFF00FFE0>36 31 -2 0 41]75 dc[<FFFFFF80FFFFFF80 -07E01F8007E00F8007E0038007E0038007E001C007E001C007E001C007E000C007E000C007E000 -C007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 -000007E0000007E0000007E0000007E0000007E0000007E0000007E00000FFFF8000FFFF8000> -26 31 -2 0 31]76 dc[<FFF00C03FFF8FFF01E03FFF806001E001F0006003F001F0006003F00 -1F0006003F001F0006007D801F0006007D801F000600F8C01F000600F8C01F000601F0601F0006 -01F0601F000603E0301F000603E0301F000607C0181F000607C0181F000607C0181F00060F800C -1F00060F800C1F00061F00061F00061F00061F00063E00031F00063E00031F00067C00019F0006 -7C00019F0006F80000DF0006F80000DF0006F80000DF0007F000007F00FFF000007FF8FFE00000 -3FF8>45 31 -2 0 50]77 dc[<FFF0000600FFF00006000600000E000600001E000600003E0006 -00007E00060000FE00060000FE00060001FE00060003F600060007E60006000FE60006001FC600 -06001F860006003F060006007E06000600FC06000601FC06000601F806000603F006000607E006 -00060FC00600061F800600063F800600063F000600067E00060006FC00060007F800060007F000 -0600FFF000FFF0FFE000FFF0>36 31 -2 0 41]78 dc[<001FF80000FFFF0001F81F8007E007E0 -0FC003F01F8001F83F8001FC3F0000FC7F0000FE7F0000FE7E00007EFE00007FFE00007FFE0000 -7FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007F7E00007E7E00007E7F0000FE3F00 -00FC1F0000F81F8001F80FC003F007E007E001F81F8000FFFF00001FF800>32 31 -3 0 39]79 -dc[<FFFF0000FFFF000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 -E0000007E0000007E0000007E0000007E0000007FFFE0007FFFF8007E00FE007E003F007E001F8 -07E001F807E001FC07E001FC07E001FC07E001FC07E001FC07E001F807E001F807E003F007E00F -E0FFFFFF80FFFFFE00>30 31 -2 0 36]80 dc[<FFFF007F80FFFF01FFC007E003F86007E007F0 -3007E00FE03007E00FE00007E00FE00007E00FE00007E00FC00007E00FC00007E00FC00007E00F -800007E00F800007E01F000007E03E000007FFFC000007FFFF000007E01FC00007E007E00007E0 -03F00007E003F00007E003F80007E003F80007E003F80007E003F80007E003F00007E003F00007 -E007E00007E01FC000FFFFFF0000FFFFF80000>36 31 -2 0 39]82 dc[<81FF00E7FFC0FE01E0 -F80070E00078E00038C0003CC0003CC0003C00003C00007C0000FC0007F800FFF807FFF00FFFF0 -1FFFE03FFF807FFE007FC000FC0000F80000F00018F00018F000387000387000783800F81E03F8 -0FFF3803FC08>22 31 -3 0 29]83 dc[<03FFFFC003FFFFC00007E0000007E0000007E0000007 -E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00000 -07E0000007E0000007E0000007E000C007E006C007E006C007E006C007E006E007E00E6007E00C -6007E00C7007E01C7C07E07C7FFFFFFC7FFFFFFC>31 30 -2 0 36]84 dc[<0000700000000070 -00000000F800000000F800000001FC00000001FC00000003FE00000003F600000003F600000007 -E300000007E30000000FE18000000FC18000001FC1C000001F80C000003F80E000003F00600000 -3F006000007E003000007E00300000FC00180000FC00180001FC000C0001F8000C0003F8000E00 -03F000060007F000070007E000030007E0000380FFFE003FF8FFFE003FF8>37 31 -1 0 40]86 -dc[<0FE07E3FF8FE7E0DE0FC05E0F803E0F803E0F803E07C03E03C03E01F03E007FBE0007FE000 -03E00C03E03F03E03F03E03F07C03F0F801FFF0007FC00>23 20 -1 0 25]97 dc[<181F801C7F -E01EC1F81F807C1F007C1F003E1F003E1F003F1F003F1F003F1F003F1F003F1F003F1F003E1F00 -3E1F007E1F807C1FE0F81F7FF01F1FC01F00001F00001F00001F00001F00001F00001F00001F00 -001F00001F0000FF0000FF0000>24 32 -2 0 29]98 dc[<01FC0007FF001F81C03F00C03E0060 -7E00007C0000FC0000FC0000FC0000FC0000FC0000FC00007C03007C0FC03E0FC03E0FC01F0FC0 -07FF8001FE00>19 20 -2 0 23]99 dc[<03F8FF0FFEFF1F07F83E01F87E00F87C00F87C00F8FC -00F8FC00F8FC00F8FC00F8FC00F8FC00F87C00F87C00F87E00F83E01F81F83F80FFEF801F8F800 -00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007F80007F8>24 32 --2 0 29]100 dc[<00FF8007FFE00F80701E00183E00187C00007C0000FC0000FC0000FC0000FF -FFF8FFFFF8FC00F87C00F87C00F03E00F01E01E00F83C007FF8001FE00>21 20 -1 0 24]101 -dc[<3FFC003FFC0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007 -C00007C00007C00007C00007C00007C000FFFC00FFFC0007C00007C00007C00007C00007C00007 -C3C007C7E003C7E003E7E001F3E000FFC0001F80>19 32 -1 0 16]102 dc[<01FF000FFFE03F -01F878003C78003CF0001EF0001EF0001E70003E3C007C1FFFFC07FFF80FFFF01FFF801C000018 -000018000009FC000FFF000F07801E03C03E03E03E03E03E03E03E03E03E03E01E03DE0F079E07 -FFFE01FC3C>23 30 -1 10 26]103 dc[<FFE3FFFFE3FF1F00F81F00F81F00F81F00F81F00F81F -00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F80F81FC0F81F61F01F3FE01F0FC01F -00001F00001F00001F00001F00001F00001F00001F00001F00001F0000FF0000FF0000>24 32 --3 0 29]104 dc[<FFE0FFE01F001F001F001F001F001F001F001F001F001F001F001F001F001F -001F001F00FF00FF000000000000000000000000001C003E003F007F003F003E001C00>11 33 --2 0 14]105 dc[<FFC3FFFFC3FF1E00F81E01F01E01E01E03C01E07C01E0F801F0F001F9E001F -FC001F7C001F18001F0C001F07001F03801F00C01F00F01F01FE1F01FE1F00001F00001F00001F -00001F00001F00001F00001F00001F00001F0000FF0000FF0000>24 32 -2 0 28]107 dc[<FF -E0FFE01F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 -1F001F001F001F001F001F001F001F001F001F00FF00FF00>11 32 -2 0 14]108 dc[<FFE3FF -8FFEFFE3FF8FFE1F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F00 -7C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F807E01F01E807E01F01E -407D01F01E70F9C3E0FE1FF07FC0FE0FE03F80>39 20 -3 0 44]109 dc[<FFE3FFFFE3FF1F00 -F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81E80 -F81EC0F81E61F0FE3FE0FE0FC0>24 20 -3 0 29]110 dc[<01FF0007FFC01F83F03E00F83E00 -F87C007C7C007CFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F83E00F81F83 -F007FFC001FF00>23 20 -1 0 26]111 dc[<FFE000FFE0001F00001F00001F00001F00001F00 -001F00001F00001F1F801F7FE01FC1F81F80FC1F007C1F007E1F003E1F003F1F003F1F003F1F00 -3F1F003F1F003F1F003E1F007E1F007E1F80FC1FE1F8FF7FF0FF1FC0>24 29 -2 9 29]112 dc[ -<FFF000FFF0001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00 -001F03001F8FC01E8FC01E8FC01ECFC0FE7F80FE3E00>18 20 -2 0 22]114 dc[<C7F0FFFCF8 -1EF006E007C007C007001F03FE1FFE3FFC7FF8FFC0F800E006E006600E701E3FFE0FE6>16 20 --2 0 21]115 dc[<01F003F807CC0F860F860F860F860F860F800F800F800F800F800F800F800F -800F800F80FFFCFFFC3F800F800780038003800380018001800180>15 29 -1 0 20]116 dc[< -03F8FF07FCFF0F06F81F01F81F01F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8 -1F00F81F00F81F00F81F00F81F00F8FF07F8FF07F8>24 20 -3 0 29]117 dc[<001C0000001C -0000003E0000003E0000007F0000007F000000FF800000F9800001F9C00001F0C00001F0C00003 -E0600003E0600007C0300007C030000F8018000F8018001F001C00FFE07F80FFE07F80>25 20 --1 0 28]118 dc[<0030018000007803C000007803C000007803C00000FC07E00000FC07E00001 -F60FB00001F60F300001F60F300003E31E180003E31E180007C1BE0C0007C1BC0C0007C1BC0C00 -0F80F806000F80F806001F00F803001F00F00300FFE7FE1FE0FFE7FE1FE0>35 20 -1 0 38] -119 dc[<FF81FF80FF81FF800E00FC000701F8000381F0000183E00000C7C000006F8000007F80 -00003F0000003E0000007E000000FF000001F3800003E1800007E0C00007C0E0000F807000FFE1 -FF00FFE1FF00>25 20 -1 0 28]120 dc[<1E0000007F800000E1C00000C0E00000FC600000FC -300000783000000018000000180000001C0000001C0000003E0000003E0000007F0000007F0000 -00FF800000F9800001F9C00001F0C00001F0C00003E0600003E0600007C0300007C030000F8018 -000F8018001F001C00FFE07F80FFE07F80>25 29 -1 9 28]121 dc[<FFFFC0FFFFC07C03C03E -01C03F00C01F80E00F806007C06003E06003F00001F80000F800607C00603E00603F00701F8038 -0F803C07C03FFFE03FFFE0>19 20 -1 0 23]122 dc[<FFFFFF80FFFFFF80>25 2 0 -11 26] -123 dc /fi df[<3C07C00000620C600000F31E100000798F18000031860C000001C00E000001 -C00E000000C006000000E007000000E007000000E007000000E007000000600380000070038000 -007003800000700380000070038000007001C000003801C000003801C000003801C000003801C0 -00003800E000001C00E000001C00E000001C00E000001C00E000001C00700000FFFFFF80000E00 -7000000E007000000E007000000E00380000070038000007003800000700380000030318600003 -879CF00001878CF00000C3867000003F03E0>36 41 2 9 28]11 dc[<3C00000062000000F300 -0000798000003180000001C0000001C0000000C0000000E0000000E0038000E0064000E00E2000 -700E2000700E2000700E2000700710007007000038070000380700003803800038038000380380 -001C0380001C01C0001C01C0001C01C0001C01C0000E00E000FFFFE0000E0000000E0000000E00 -00000700000007000000070000000700300003007800038078000180380000E01000003FE0>29 -41 2 9 26]12 dc[<3C00000062000000F3000000798000003180000001C0000001C0000000C0 -000000E0000000E001C000E0032000E00710007007100070071000700710007003880070038000 -38038000380380003801C0003801C0003801C0001C01C0001C00E0001C00E0001C00E0001C00E0 -001E007000FFFFF0000E0070000E0070000E0038000E003800070038000700380007001C000300 -DC000381FC000181FC0000E0EE00003FCE>31 41 2 9 27]13 dc[<C0C0202010100808040404 -040202020201011D1D3F3F3F3F1F1F0E0E>16 14 -7 -18 23]34 dc[<00FF00000780E0000E00 -180018000400380003007000010070000080F0000040F0000040F0000020F00000207800001078 -0030107800781038007C103CF058101D0840100F044010060420200704102007C40C4006780280 -060001800700004007000020070180100303C0080381E0080180E00401C0201C00C0203C006040 -1E0030800C000F0000>31 34 -5 1 35]38 dc[<C020100804040202011D3F3F1F0E>8 14 -9 --18 14]39 dc[<0800100010002000600060004000C000C000C000C000C000C000C000C000C000 -C000C000C000C000E000E000600060007000700030003800380018001C000C000E000600070003 -000180018000C00060002000100008000400020001>16 46 -7 12 19]40 dc[<800000600000 -3000001800000C000006000003000001000001800000C00000E000006000007000003000003800 -001800001C00000C00000C00000E00000600000600000700000700000300000300000300000380 -000380000380000180000180000180000180000180000180000180000100000300000300000300 -000200000600000400000800001000>17 46 0 12 19]41 dc[<00200000003000000030000000 -3000000030000000180000001800000018000000180000000C0000000C0000000C0000000C0000 -FFFFFFE0FFFFFFE000060000000600000003000000030000000300000003000000018000000180 -0000018000000180000000C0000000C0000000C000>27 28 -6 3 35]43 dc[<80402020100808 -04043C3C3C3C1C>6 14 -3 9 14]44 dc[<7FE0FFE07FF0>12 3 -3 -8 16]45 dc[<E0F0F8F8 -70>5 5 -5 0 14]46 dc[<80000000C0000000C000000060000000300000003000000018000000 -180000000C0000000C000000060000000300000003000000018000000180000000C0000000C000 -000060000000300000003000000018000000180000000C0000000C000000060000000300000003 -000000018000000180000000C0000000C000000060000000300000003000000018000000180000 -000C00000006000000060000000300000003000000018000000180000000C000000040>26 45 --1 11 23]47 dc[<0FC000187000303800701C00700E00700700F00700F00780F00380F003C070 -03C07801C07801E07801E07801E03C00F03C00F03C00F03C00F01E00701E00780E00780F00780F -007807003803803803803001C07000E0700030E0000F80>21 31 -4 1 23]48 dc[<FFF8078003 -8003800380038001C001C001C001C000E000E000E000E000700070007000700038003800380038 -001C031C00DC003C000E000600020002>15 30 -5 0 23]49 dc[<80780080FC0041FE0047FF00 -7E0300200180100080100040080040040000030000008000006000001800000C00000700000380 -0703C00881E00840E00820F00820F00820F00410700420700220700200700100E00080E0006180 -001F00>20 31 -4 1 23]50 dc[<1F800020E000403800401C00401E00800F00F00F0078078078 -0780300780000780000780000780000700000600001C0000FE000003000001C00000E003806004 -60700420700410380420380420380200380100300080700060E0001F80>21 31 -4 1 23]51 dc -[<006000007000007000003800003800003800003800001C00001C00801FC0607C003F8E00080E -00040E00060E0003070001070000870000C700006300003000003000001800001800000C00000E -000006000007000007000003000003800003800001C00001C00001C00000E00000E00000E00000 -60>19 39 -2 9 23]52 dc[<0F800010C000307000703800601C00701C00F01E00F00E00F00F00 -700F00700F007807807807807807807C07803C07003E07003E06001D84001E78001E00000E0000 -0F00000700000380C00181E000C1E00060E0003020001C200007C0>19 31 -5 1 23]54 dc[<03 -000007800007800007C00003C00003C00003C00001E00001E00001E00000F00000F00000700000 -7000003800003800001C00001C00000C00000E00000600800300400300600100200080380E803E -19C01FF06017F0200BF01008E010>20 31 -7 1 23]55 dc[<1F8000306000403000C00800C00C -00800600800600C00300C00300C00300600700200700300F00183F00047E0003FC0001F80003F8 -0007E40007C3000F81800F00800E00C00600600600600600600300600100600080C0006180001F -00>19 31 -5 1 23]56 dc[<3E000043800080C000E06000F07000F03800601C00001C00000E00 -000E00000F0003C7000637800C0F801C0F801C07C01C03C01C03C01C03C01E01C01E01E01E01E0 -1E01E00F01E00F00E00700E00380E00180C000C0C0007180001F00>19 31 -5 1 23]57 dc[<E0 -F0F8F870000000000000000000000E1F1F0F07>8 20 -5 0 14]58 dc[<800040002000200010 -0008000800040004003C003C003C003C001C000000000000000000000000000000000000000000 -038007C007C003C001C0>10 29 -3 9 14]59 dc[<7FFFFFE0FFFFFFF000000000000000000000 -000000000000000000000000000000000000000000003FFFFFFC1FFFFFF8>30 12 -5 -5 35] -61 dc[<FF807FF81E000F8006000780020007800200078001000780010007800080078000C007 -8000400780003FFF8000200F8000100F0000100F0000080F00000C0F0000040F0000020F000002 -0F0000010F0000010F0000008F0000004F0000004F0000002F0000003F0000001E0000001E0000 -000E00000006000000060000000200>29 32 -2 0 34]65 dc[<FFFFE0000F00780007801E0007 -800F0007800780078003C003C001C003C001E003C001E003C001E001E001E001E001E001E001E0 -01E001C000F003C000F00F8000FFFE0000F00780007801E0007800F00078007800780078003C00 -3C003C003C003C003C003C003C001E003C001E0038001E0078001E00F001FFFFC0>30 31 -3 0 -32]66 dc[<00FE00000381C000060020000C001800180004003800020038000100700001007000 -008070000080F0000080F0000000F0000000F0000000F000000078000000780000007800000078 -0000003C0000003C0000001E0000101E0000100F000018070000180380001801C0001800C0001C -0060003C0038003C001C004C000781860000FE02>31 33 -6 1 33]67 dc[<FFFFC0000F007000 -07801C0007800E0007800380078001C003C001C003C000E003C0007003C0007001E0007801E000 -3C01E0003C01E0003C00F0001E00F0001E00F0001E00F0001E0078000E0078000E0078000E0078 -000E003C000E003C000E003C000E003C001C001E001C001E0038001E0070001E00E001FFFF80> -31 31 -3 0 34]68 dc[<FFFFFE000F001F000780070007800100078001800780008003C00040 -03C0004003C0002003C0002001E0001001E0200001E0200001E0200000F0300000F0300000FFF0 -0000F0300000781800007808000078080000780808003C0004003C0004003C0004003C0004001E -0004001E0004001E000C001E001C01FFFFFE>31 31 -3 0 31]69 dc[<FFF800000F8000000780 -000007800000078000000780000003C0000003C0000003C0000003C0000001E0200001E0200001 -E0200001E0200000F0300000FFF00000F0300000F0100000780800007808000078080000780010 -003C0008003C0008003C0008003C0008001E0008001E0008001E0018001E003801FFFFFC>30 31 --3 0 30]70 dc[<00FC0000038304000E00CC001C002E0018003E0038001E0070001E0070000F -0070000F0070000F00F0000F00F0000780F0000780F000FFF0F000000078000000780000007800 -0000780000003C0000003C0000001E0000201E0000200E00003007000030038000300380003001 -C0003800E0007800300078001C00980007030C0000FC04>30 33 -6 1 35]71 dc[<FFF1FFE000 -0F801F000007800F000007800F000007800F000007800F000003C007800003C007800003C00780 -0003C007800001E003C00001E003C00001E003C00001E003C00000F001E00000F001E00000FFFF -E00000F001E000007800F000007800F000007800F000007800F000003C007800003C007800003C -007800003C007800001E003C00001E003C00001E003C00001F003E0001FFF3FFE0>35 31 -3 0 -34]72 dc[<FFF8000F800007800007800007800007800003C00003C00003C00003C00001E00001 -E00001E00001E00000F00000F00000F00000F000007800007800007800007800003C00003C0000 -3C00003C00001E00001E00001E00001F0001FFF0>20 31 -3 0 18]73 dc[<1F000021C00040E0 -00807000F07800F83C00F83C00781E00301E00001E00001E00000F00000F00000F00000F000007 -800007800007800007800003C00003C00003C00003C00001E00001E00001E00001E00000F00000 -F00000F00000F8001FFF>24 32 -3 1 24]74 dc[<FFF03FF8000F8007C0000780078000078007 -8000078007800007800F000003C00F000003C00F000003C01E000003C01E000001E01E000001E0 -3C000001F03C000001E83C000000F478000000F278000000F1F8000000F0F00000007830000000 -7810000000780800000078040000003C020000003C010000003C004000003C002000001E001000 -001E000800001E000E00001F000F8001FFF03FE0>35 31 -3 0 35]75 dc[<FFFFF8000F007800 -07801C0007800C00078006000780060003C0020003C0030003C0010003C0010001E0008001E000 -0001E0000001E0000000F0000000F0000000F0000000F000000078000000780000007800000078 -0000003C0000003C0000003C0000003C0000001E0000001E0000001E0000001F000001FFF800> -25 31 -3 0 29]76 dc[<FF8103FFC0001C01803E00000C01801E00000401C01E00000401E01E -00000401E01E00000203900F00000203900F00000203880F00000203840F000001038407800001 -038207800001038207800001038107800000838083C00000838083C00000838043C00000870043 -C00000470021E00000470021E00000470011E00000470009E00000270008F00000270004F00000 -270004F00000270002F000001700017800001700017800001E0000F800001E0000FC0001FE0000 -7FC0>42 31 -3 0 41]77 dc[<FF800200001C000200000C000700000400070000040007000004 -000F000002000F800002000F800002001E800002001E800001001E400001003C400001003C4000 -01003C40000080782000008078200000807820000080F020000040F010000041F010000041E010 -000041E010000023C008000023C008000023C00800002780080000178004000017800400001F00 -0400001F000F0001FF007FE0>35 31 -3 0 34]78 dc[<01FC0000078380000E00E0001C007000 -38003C0038001E0078000F007000070070000380F00003C0F00001C0F00001E0F00000E0F00000 -F0F00000F0780000787800007878000078780000783C0000383C0000381C0000381E0000380E00 -003807000038078000380380007001C0007000E00060003000E0001C01C0000707000001FC00> -29 33 -6 1 35]79 dc[<FFF000000F8000000780000007800000078000000780000003C00000 -03C0000003C0000003C0000001E0000001E0000001E0000001E0000000F0000000FFFC0000F00F -0000F003C0007800E0007800F00078007800780078003C003C003C003C003C003C003C003C001E -003C001E0038001E0070001E00E001FFFF80>30 31 -3 0 31]80 dc[<000007C0FFF00C200F80 -1C1007803C1007803C0807803C0807803C0003C01E0003C01E0003C01E0003C01E0001E00F0001 -E00E0001E01E0001E01C0000F0380000FFF00000F01E0000F00700007801C0007801E0007800F0 -007800F0003C0078003C0078003C0078003C0078001E0078001E0070001E00E0001E03C001FFFF -00>29 32 -3 1 33]82 dc[<81F80000C6060000E80380007000C0006000E00060006000600070 -00200030002000380020003800000038000000380000007800000078000001F800001FF000007F -F00001FFE00001FF800003F8000003C0000003C000000380000003800100038001000380010001 -80010001C0018000C003800060038000300580001C18C00007E040>26 33 -3 1 26]83 dc[<FF -FF000003E0000001E0000001E0000001E0000001E0000000F0000000F0000000F0000000F00000 -00780000007800000078000000780000003C0000003C0000003C0000003C0000001E0000001E00 -00001E0000801E0040400F0020400F0020600F0020200F00202007802010078020180780201E07 -80E00FFFFFF0>28 31 -8 0 33]84 dc[<07E000000C1800003804000030020000700100007000 -8000F0004000F0004000F0002000F0002000F0002000780010007800100078001000780010003C -0008003C0008003C0008003C0008001E0004001E0004001E0004001E0004000F0002000F000200 -0F0002000F00020007800100078001000780010007C003C07FFC1FF8>29 32 -9 1 34]85 dc[< -01000000018000000380000003C0000003C0000003E0000003D0000003D0000003C8000003C800 -0003C4000003C2000007C200000781000007810000078080000780400007804000078020000780 -200007801000078008000F8008000F0004000F0004000F0002000F0001000F0001000F0000800F -0000C00F8000E0FFF007FC>30 32 -9 1 34]86 dc[<04000800000006000800000006000C0000 -0007001E00000007001E00000007801F00000007801F0000000FC01E8000000F601E8000000F20 -1E4000000F101E4000000F101E2000000F081E2000000F081E1000000F041E0800000F041E0800 -000F021E0400000F021E0400000F011E0200000F009E0200000F009E0100000F005E0100000F00 -5E0080000F003E00C0000F003E0040000F003C0020000F003C0020000F003C0010000F003C0010 -001F003C0018001F003E001C00FFF1FFC0FF80>41 32 -9 1 45]87 dc[<FFC07FF8001F000FC0 -000700078000010007800001800F800000800F000000400F000000201F000000101E000000081E -000000043E000000063C000000023C000000017C00000000F800000000F800000000F800000000 -F000000001F800000001EC00000001E400000003E200000003C100000003C080000007C0400000 -078020000007803000000F801000000F001C00000F801F0000FFF07FE0>35 31 -2 0 34]88 dc -[<3FFC000003C0000001E0000001E0000001E0000001E0000000E0000000F0000000F0000000F0 -0000007000000078000000780000007C000000FE000000FA000000F1000001F0800001F0400001 -E0400003E0200003E0100003C0080003C00C0007C0040007800200078001000F8000800F0000C0 -1F8000E0FFF003FC>30 31 -9 0 34]89 dc[<7070F8F8F8F8F8F8B0B080808080404040402020 -1010080804040202>15 14 -12 -18 23]92 dc[<70F8F8F8B0808040402010080402>7 14 -9 --18 14]96 dc[<0F0700308C80705C40703C40F01C40F01C40F00E20F00E00F00E00F00E007807 -007807007807003807003C03801C03800E03800707800389C000F180>19 20 -4 0 23]97 dc[< -1F0031C060E06070E038E03CE01CE01EE01EE01E700F700F700F700F380F380F3C0E3A0E1D0C1C -F01C001C000E000E000E000E0007000700070007003F800780>16 32 -5 0 21]98 dc[<07C000 -183800300400700200700100F00000F00000F00000F00000F000007800007800007800003C0200 -1C07001E07800E078003008001C100007E00>17 20 -4 0 21]99 dc[<0F0700308C80705C4070 -3C40F01C40F01C40F00E20F00E00F00E00F00E007807007807007807003807003C03801C03800E -03800707800389C000F1C00001C00001C00000E00000E00000E00000E000007000007000007000 -00700003F8000078>21 32 -4 0 23]100 dc[<07C018383804700270017000F000F000F000F0 -007C007BF0780C38023C011C010E01070101C2007C>16 20 -4 0 21]101 dc[<3C0000660000 -F300007B000031800001800001C00001C00000C00000E00000E00000E00000E000007000007000 -007000007000007000007000003800003800003800003800003800001C00001C00001C00001C00 -01FFE0000E00000E00000E00000E00000E0000070000070000071800033C00033C00019C000078 ->22 41 2 9 14]102 dc[<3F800060E000F07000783800301C00001C00001C00000E00000E0003 -CE000C2E001C17001C0F003C07003C07003C03803C03803C03803C03801E01C01E01C01E01C00E -01C00F00E00700E00380E001C1E000E270003C60>20 29 -2 9 21]103 dc[<600700E00CC070 -0C40701C20700C20700E20380E103807003807003807001C03801C03801C03801C03800E01C00E -01C00F01C00E8180076300071E0007000007000003800003800003800003800001C00001C00001 -C00001C0000FE00001E000>20 32 -3 0 23]104 dc[<1C003300310070803080388038401C00 -1C001C000E000E000E008700470043004380230033000E00000000000000000000000000000001 -C001E001E000C0>11 31 -4 0 14]105 dc[<3C0000630000F1800079C00030E00000E00000E0 -00007000007000007000007000003800003800003800003800001C00001C00001C00001C00000E -00000E00000E00020E00010700010700008700008700004600003C000000000000000000000000 -000000000000000000000003800003C00003C0000180>18 40 2 9 14]106 dc[<601E00E03100 -70310070708070708070708038384038700038700038E0001FC0001E00001D00001C80000E40C0 -0E21E00E11E00E08E00704200703C007000007000003800003800003800003800001C00001C000 -01C00001C0000FE00001E000>19 32 -3 0 21]107 dc[<38006400E200E200E200E200710070 -007000700038003800380038001C001C001C001C000E000E000E000E0007000700070007000380 -0380038003801FC003C0>10 32 -4 0 12]108 dc[<3003003800700700660038038062003803 -80E100380380610038038071001C01C070801C01C038001C01C038001C01C038000E00E01C000E -00E01C000E00E01C008E00E01C004700700E004700700E004780680E004740640C002630C31800 -1C0F80F000>33 20 -4 0 37]109 dc[<3001C07003303803103807083803083803881C03841C -01C01C01C01C01C00E00E00E00E00E00E08E00E04700704700704780604740602630C01C0F80> -22 20 -4 0 26]110 dc[<07C000187000301800700E00700F00F00700F00780F003C0F003C0F0 -03C07801E07801E07801E03C01E01C01E01E01C00E01C003018001C300007C00>19 20 -4 0 23 -]111 dc[<FFC0001C00001C00000E00000E00000E00000E0000070000070000071E0007238003 -C1C00380E003807003807801C03801C03C01C03C01C03C00E01E00E01E00E01E08E01E04701E04 -701E04781C04741C02621801C1E0>23 29 0 9 23]112 dc[<0FFE0000E00000E0000070000070 -000070000070000038000038000F380030B800705C00703C00F01C00F01C00F00E00F00E00F00E -00F00E007807007807007807003807003C03801C03800E03800705800388C000F040>18 29 -4 -9 21]113 dc[<3000007000003800003800003800003800001C00001C00001C00001C00000E00 -000E00000E00008E00004703004707804787804783802661001C1E00>17 20 -4 0 19]114 dc[ -<1F8020604010E008F00CF00C700E000E003E03FC07F80FF00F800C000C060C070C0306010302 -00FC>16 20 -3 0 19]115 dc[<1E003100708070807040704038203800380038001C001C001C -001C000E000E000E000E000700FFF007000700038003800380038001C00180>12 28 -4 0 15] -116 dc[<07C3800C26401C1E20180E20180E201C0E201C07101C07001C07001C07000E03800E03 -800E03808703804701C04301C04381C02301C03300E00E00C0>20 20 -4 0 24]117 dc[<03C0 -000E30001C08001C04001C04001C02001C02001C01001C01001C01000E00800E00800E00808700 -804700C04301C04383C02307C03307800E0380>18 20 -4 0 21]118 dc[<03E1F0000E130800 -0C0F04001C0F02001C0602001C0701001C0701001C0700801C0700801C0700800E0380400E0380 -400E038040870380404701C0604301C0E04381C1E02301C3E03300E3C00E00C1C0>27 20 -4 0 -30]119 dc[<78780084C600E58100F38100F3808063808001C04001C00001C00001C00000E000 -00E00000E00040E0002070C02071E01071E01068E00CC440038380>19 20 -3 0 21]120 dc[< -3E0000438000C0C000E06000F07000F03800003800001C00001C0007DC000C3C001C1E00180E00 -180E001C0E001C07001C07001C07001C07000E03800E03800E03808703804701C04301C04381C0 -2301C03300E00E00C0>19 29 -4 9 22]121 dc[<80E00041F80063FC003E0C00100200080200 -0401000200000100000080000040000020000010000008000004000802000C1F0007F18003E080 -01C040>18 20 -3 0 19]122 dc /fj df[<FFFFFFC0FFFFFFC0>26 2 -4 -10 35]0 dc[<03C0 -0FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF80FF003C0>16 18 -3 --2 23]15 dc[<FFFFFFF07FFFFFF0000000000000000000000000000000000000000000000000 -00000000FFFFFFF0FFFFFFF0000000000000000000000000000000000000000000000000000000 -007FFFFFF0FFFFFFF0>28 20 -3 -1 35]17 dc[<FFFFFFC07FFFFF8000000000000000000000 -000000000000000000000000000000000000C0000000700000003C0000000F00000003C0000000 -F0000000380000000E0000000780000001E0000000780000001E0000000780000001C000000780 -00001E00000078000001E00000078000000E00000038000000F0000003C000000F0000003C0000 -00F0000000C0000000>26 36 -4 7 35]21 dc[<80003E0080007F808000FFC08001C1E0C00780 -60C00F0030601E0030783800103FF000101FE0001007C00010>28 11 -3 -6 35]24 dc[<003F -FFC000FFFFC003C00000070000000C0000001800000030000000300000006000000060000000C0 -000000C0000000C0000000C0000000C0000000C0000000C0000000C00000006000000060000000 -3000000030000000180000000C0000000700000003C0000000FFFFC0003FFFC0>26 28 -4 3 35 -]26 dc[<00000200000000030000000003000000000180000000018000000000C0000000006000 -7FFFFFF000FFFFFFF8000000000C00000000070000000003C000000000F0000000007C00000001 -F000000003800000000E00FFFFFFFC007FFFFFF0000000006000000000C000000000C000000001 -8000000003000000000300000000020000>38 26 -3 2 45]41 dc[<003FF800FFF803C0000700 -000C0000180000300000300000600000600000C00000C00000C00000FFFFF8FFFFF8C00000C000 -00C000006000006000003000003000001800000C000007000003C00000FFF8003FF8>21 28 -4 -3 30]50 dc[<400000C000006000006000003000003000001800001800000C00000C0000060000 -06000006000003000003000001800001800000C00000C000006000006000003000003000001800 -001800000C00000C000006000006000003000003000001800001800001800000C00000C0000060 -00006000003000003000001800001800000C00000C>22 44 -6 11 0]54 dc[<00180000180000 -3C00003C00003C0000660000660000660000C30000C30000C3000181800181800181800300C003 -00C00600600600600600600C00300FFFF00FFFF018001818001818001830000C30000C30000C60 -0006600006600006C00003400001>24 33 0 1 25]56 dc[<FFFFC0FFFFC00000C00000C00000 -C00000C00000C00000C00000C00000C00000C00000C00000C00000C00000C07FFFC07FFFC00000 -C00000C00000C00000C00000C00000C00000C00000C00000C00000C00000C00000C00000C0FFFF -C0FFFFC0>18 32 -3 0 25]57 dc[<1800001800001800000FF0000E18000C0C001C0600360300 -360300760380730380630180630180E301C0E181C0E181C0E181C0E181C0E0C1C0E0C1C0E0C1C0 -E061C0E061C0E061C0E061C0E031C0E031C0603180603180601980701B80301B00300F00180E00 -0C0C00061C0003F600000600000200>18 39 -2 4 23]59 dc[<00FE0003FF800F01E01C007030 -001860000C60000CC00006C00006C00006C00006C00006C00006C00006C00006C00006C00006C0 -0006C00006C00006C00006C00006C00006C00006C00006C00006C00006400002>23 28 -3 1 30 -]91 dc[<400002C00006C00006C00006C00006C00006C00006C00006C00006C00006C00006C000 -06C00006C00006C00006C00006C00006C00006C00006C00006C0000660000C60000C3000181C00 -700F01E003FF8000FE00>23 28 -3 1 30]92 dc[<C00002C0000660000C60000C60000C300018 -3000181800301800301800300C00600C00600600C00600C00600C0030180030180018300018300 -01830000C60000C600006C00006C00006C00003800003800001000>23 28 -3 1 30]94 dc[<00 -1000003800003800006C00006C00006C0000C60000C60001830001830001830003018003018006 -00C00600C00600C00C00600C006018003018003018003030001830001860000C60000C60000CC0 -0006C00002>23 28 -3 1 30]95 dc[<000F0038006000E001C001C001C001C001C001C001C001 -C001C001C001C001C001C001C001C0038007001E00F8001E000700038001C001C001C001C001C0 -01C001C001C001C001C001C001C001C001C001C000E000600038000F>16 45 -3 11 23]102 dc -[<F8001E000700038001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C0 -00E000600038000F0038006000E001C001C001C001C001C001C001C001C001C001C001C001C001 -C001C001C0038007001E00F800>16 45 -3 11 23]103 dc[<C0C0C0C0C0C0C0C0C0C0C0C0C0C0 -C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0>2 45 -5 11 13] -106 dc /fk df[<70F8F8F870>5 5 -4 0 13]58 dc[<000001C00000078000001E0000007800 -0001E00000078000000E00000038000000F0000003C000000F0000003C000000F0000000F00000 -003C0000000F00000003C0000000F0000000380000000E0000000780000001E000000078000000 -1E0000000780000001C0>26 26 -4 2 35]60 dc[<E0000000780000001E0000000780000001E0 -000000780000001C0000000700000003C0000000F00000003C0000000F00000003C0000003C000 -000F0000003C000000F0000003C00000070000001C00000078000001E00000078000001E000000 -78000000E0000000>26 26 -4 2 35]62 dc[<FF807FFC1E0007C00C0003C0040003C0020007C0 -0200078001000780018007800080078000400780007FFF80002007800020078000100780000807 -8000080F8000040F0000040F0000020F0000010F0000010F0000008F0000008F0000004F000000 -2F0000002F0000001F0000001E0000000E0000000E000000060000000200>30 32 -2 0 34]65 -dc[<00FE00000381C000060020000C001800180004003800020038000100700001007000008070 -000080F0000080F0000000F0000000F0000000F000000078000000780000007800000078000000 -3C0000003C0000001E0000101E0000100F000018070000180380001801C0001800C0001C006000 -3C0038003C001C004C000781860000FE02>31 33 -2 1 33]67 dc[<FFFFF0000007803C000003 -C007000003C003800003C001C00003C000E00001E000700001E000380001E0003C0001E0001C00 -00F0001E0000F0000E0000F0000F0000F0000F0000780007800078000780007800078000780007 -80003C000380003C000380003C000380003C000380001E000380001E000380001E000380001E00 -0700000F000700000F000E00000F001C00000F00780000FFFFE000>33 31 -2 0 38]68 dc[<FF -FE000007C0000003C0000003C0000003C0000003C0000001E0000001E0000001E0000001E00000 -00F0100000F0100000F0100000F0100000781800007FF8000078180000780800003C0400003C04 -00003C0400003C0004001E0002001E0002001E0002001E0002000F0002000F0002000F0006000F -000E00FFFFFF>32 31 -2 0 29]70 dc[<FFE0C1FFF8000F00C00F80000600E00780000200F007 -80000200F00780000200E80780000100E803C0000100E403C0000100E203C0000100E203C00000 -81C101E0000081C101E0000081C081E0000081C041E0000041C040F0000041C020F0000041C020 -F0000041C010F0000021C0087800002380087800002380047800002380027800001380023C0000 -1380013C00001380013C0000138000BC00000B80005E00000B80005E00000B80003E00000F0000 -3F0000FF00001FF0>44 31 -2 0 44]77 dc[<01FC0000078380000E00E0001C00700038003C00 -38001E0078000F007000070070000380F00003C0F00001C0F00001E0F00000E0F00000F0F00000 -F0780000787800007878000078780000783C0000383C0000381C0000381E0000380E0000380700 -0038078000380380007001C0007000E00060003000E0001C01C0000707000001FC00>29 33 -2 -1 35]79 dc[<FFFC000007C0000003C0000003C0000003C0000003C0000001E0000001E0000001 -E0000001E0000000F0000000F0000000F0000000F0000000780000007FFE0000780380007800E0 -003C0070003C0078003C003C003C003C001E001E001E001E001E001E001E001E000F001E000F00 -1C000F0038000F007000FFFFC0>31 31 -2 0 29]80 dc[<000003E0FFFC071807C00E0403C01E -0403C01E0203C01E0203C01E0001E00F0001E00F0001E00F0001E00F0000F0078000F0070000F0 -0F0000F00E0000781C00007FF80000780F0000780380003C01E0003C00F0003C0078003C007800 -1E003C001E003C001E003C001E003C000F003C000F0038000F0070000F01E000FFFF80>31 32 --2 1 35]82 dc[<81F80000C60E0000E8030000700180006001C0006000C0006000E000200060 -0020007000200070000000700000007000000070000000F0000003F000003FF00000FFE00001FF -C00003FF800003F8000003C0000003800000038000000380020003800200038002000180020001 -C0030000C007000060070000300B00001811800007E080>25 33 -3 1 28]83 dc[<7FFFC00001 -F0000000F0000000F0000000F0000000F0000000780000007800000078000000780000003C0000 -003C0000003C0000003C0000001E0000001E0000001E0000001E0000000F0000000F0000000F00 -00800F0010400780084007800860078008200780082003C0081003C0081803C0181E03C0380FFF -FFFC>30 31 -1 0 27]84 dc[<0080000000C0000001C0000001E0000001F0000001F0000001E8 -000001E8000001E4000001E2000003E2000003C1000003C1800003C0800003C0400003C0400003 -C0200003C0100003C0100007C00800078008000780040007800200078002000780010007800080 -078000800F8000400F0000400F0000600F800078FFF801FF>32 32 -2 1 27]86 dc[<FFE01FFE -000F0007E000030003E000010003E000008003C000004007C0000020078000001007800000080F -8000000C0F000000061F000000021E000000011E00000000BE000000007C000000007C00000000 -7C000000007800000000FC00000000F600000000F300000001F100000001E080000003E0400000 -03C020000003C010000007C008000007800400000F800600000FC00F8000FFF83FF8>37 31 -1 -0 38]88 dc[<0F0780308C40705C40703C20F01C20F01C20F00E10F00E00F00E00F00E00780700 -7807007807003807003C03801C03800E03800707800389C000F180>20 20 -2 0 24]97 dc[<1F -0031C060E06070E038E03CE01CE01EE01EE01E700F700F700F700F380F380F3C0E3A0E1D0C1CF0 -1C001C000E000E000E000E0007000700070007003F800780>16 32 -2 0 20]98 dc[<0FC01838 -300470027001F000F000F000F000F0007800780078003C041C0E1E0F0E0F070101C2007C>16 20 --2 0 20]99 dc[<0F0780308C40705C40703C20F01C20F01C20F00E10F00E00F00E00F00E0078 -07007807007807003807003C03801C03800E03800707800389C000F1C00001C00001C00000E000 -00E00000E00000E00000700000700000700000700003F8000078>21 32 -2 0 24]100 dc[<07 -C018383004700270017000F000F000F000F0007C007BF0780C38023C011C010E01070101C2007C ->16 20 -2 0 21]101 dc[<3C0000620000F3000079800031800001C00000C00000E00000E000 -00E00000E000007000007000007000007000007000003800003800003800003800003800001C00 -001C00001C00001C00001C00000E00000E0000FFF0000E00000E00000E00000700000700000700 -00070000030C00039E00019E0000CE00007C>23 41 -2 9 22]102 dc[<3FC000607000F03800 -781C00300E00000E00000E0000070000070001E7000617000E0B800E07801E03801E03801E01C0 -1E01C01E01C01E01C00F00E00F00E00F00E00700E007807003807001C07000E0F0007138001E30 ->21 29 0 9 22]103 dc[<0E00190038803840384038401C201C001C000E000E00070007008700 -438043804380238013000E00000000000000000000000000000000C001E001E000E0>11 31 -2 -0 16]105 dc[<38006400E200E200E200E200710070007000700038003800380038001C001C00 -1C001C000E000E000E000E00070007000700070003800380038003801FC003C0>10 32 -2 0 14 -]108 dc[<1801800F0038038018801C01C018401C01C038401C01C038201C01C01C200E00E01C -100E00E00E000E00E00E000E00E00E000700700700070070070007007007008700700700438038 -0380438038038043C034030023A032030023186186001E07C07C00>36 20 -2 0 40]109 dc[< -1801E03803101C03081C07081C07041C03840E03820E01C00E01C00E01C00700E00700E00700E0 -8700E043807043807043C07023A0602318C01E0780>23 20 -2 0 27]110 dc[<07C000187000 -301800700E00700F00F00700F00780F003C0F003C0F003C07801E07801E07801E03C01E01C01E0 -1E01C00E01C003018001C300007C00>19 20 -2 0 22]111 dc[<FFC0001C00001C00000E0000 -0E00000E00000E0000070000070000071E0007238003C1C00380E003807003807801C03801C03C -01C03C01C03C00E01E00E01E00E01E10E01E08701E08701E08781C04741C04621803C1E0>23 29 -1 9 23]112 dc[<1800003800001C00001C00001C00001C00000E00000E00000E00000E000007 -000007000007000087000043830043878043C78023C3802321001E1E00>17 20 -2 0 21]114 -dc[<1FC020304008E004F006F00670070007001F01FE03FC07F807800E00060606070603030101 -82007C>16 20 -2 0 21]115 dc[<0F00188038403820382038201C101C001C001C000E000E00 -0E000E0007000700070007000380FFF80380038001C001C001C001C000E000C0>13 28 -1 0 16 -]116 dc[<03E1E00613100E0F100C07080C07080E07080E03840E03800E03800E03800701C007 -01C00701C08381C04380E041C0E021C0E02180E01180700F0060>22 20 -2 0 26]117 dc[<01 -F0780007098600060781000E0780800E0380800E0380400E0380400E0380200E0380200E038020 -0701C0100701C0100701C0108381C0104380E01841C0E03821C0E0782180E0F8118070F00F0060 -60>29 20 -2 0 33]119 dc[<383C00446300E2C080F1C080F1C04061C04000E02000E00000E0 -0000E0000070000070000070004070002038602038F01038F01034700C622003C1C0>20 20 -2 -0 26]120 dc[<1F000021C000606000707000783800781800001C00000E00000E0003EE00061E -000E0F000C07000C07000E07000E03800E03800E03800E03800701C00701C00701C08381C04380 -E041C0E021C0E02180E01180700F0060>20 29 -2 9 22]121 dc /fl df[<7FE3FF0007007000 -070070000700700007007000070070000700700007007000070070000700700007007000070070 -0007007000070070000700700007007000070070000700700007007000FFFFFF80070070000700 -700007007000070070000700700007007000070070000300F0300380F87801C0787800F06E3000 -1F83E0>29 32 0 0 27]11 dc[<7FC3FE0700E00700E00700E00700E00700E00700E00700E007 -00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0FFFFE007000007 -00000700000700000700000700000701E00701E00381E001C0C000E0C0003F00>23 32 0 0 25] -12 dc[<7FE7FE0700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 -E00700E00700E00700E00700E00700E00700E00700E0FFFFE00700E00700E00700E00700E00700 -E00700E00700E00700E00381E001C1E000E0E0003FE0>23 32 0 0 25]13 dc[<7FE3FE3FF007 -007007000700700700070070070007007007000700700700070070070007007007000700700700 -070070070007007007000700700700070070070007007007000700700700070070070007007007 -0007007007000700700700FFFFFFFF000700700000070070000007007000000700700000070070 -000007007000000700F00F000300F00F000380F80F0001C07C060000F04F0400001F81F800>36 -32 0 0 38]14 dc[<70F8F8F8700000000000202020202070707070707070707070F8F8F8F8F8 -F8F870>5 33 -4 0 13]33 dc[<402020101008100808040804040204020402743AFC7EFC7EF8 -7C7038>15 14 -2 -18 23]34 dc[<07E00F801C183860380670307801C0107003C008F003C008 -F0074000F00E2000F01E1000701C100070380800307808001870040008F0020004E0020003E001 -0001C0010001C00080038001C003C003E003A00FFC031000000708000007080000070400000704 -00000702000007020000070200000702000003020000018400000084000000780000>30 34 -2 -1 35]38 dc[<40201010080804040474FCFCF870>6 14 -4 -18 13]39 dc[<00200040008001 -00020006000C000C00180018003000300030007000600060006000E000E000E000E000E000E000 -E000E000E000E000E000E0006000600060007000300030003000180018000C000C000600020001 -00008000400020>11 46 -3 12 18]40 dc[<800040002000100008000C000600060003000300 -01800180018001C000C000C000C000E000E000E000E000E000E000E000E000E000E000E000E000 -C000C000C001C001800180018003000300060006000C0008001000200040008000>11 46 -3 12 -18]41 dc[<01800180018001800180C183F18F399C0FF003C003C00FF0399CF18FC18301800180 -018001800180>16 20 -3 -14 23]42 dc[<000600000006000000060000000600000006000000 -060000000600000006000000060000000600000006000000060000000600000006000000060000 -FFFFFFF0FFFFFFF000060000000600000006000000060000000600000006000000060000000600 -0000060000000600000006000000060000000600000006000000060000>28 32 -3 5 35]43 dc -[<40201010080804040474FCFCF870>6 14 -4 9 13]44 dc[<FFC0FFC0>10 2 -1 -9 15]45 -dc[<70F8F8F870>5 5 -4 0 13]46 dc[<C000C000C00060006000600030003000300018001800 -18000C000C000C0006000600060003000300030001800180018000C000C000C000600060006000 -3000300030001800180018000C000C000C000600060006000300030001>16 45 -3 11 23]47 -dc[<03F0000E1C001C0E00180600380700780780700380700380700380F003C0F003C0F003C0F0 -03C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C070038070038070038070 -03803807001806001C0E000E1C0003F000>18 31 -2 1 23]48 dc[<FFFE07C003800380038003 -800380038003800380038003800380038003800380038003800380038003800380038003800380 -0380F3800F8003800180>15 30 -4 0 23]49 dc[<FFFF807FFF803FFF801000801800400C0040 -06004003000001800000C000006000007000003800001C00000E00000F000007800007800007C0 -2007C0F803C0F803C0F803C0F007C0800780400780200700100E000C1C0003F000>18 30 -2 0 -23]50 dc[<03F0001C3C00200E00400F00400780F00780F807C0F807C0F807C02007C00007C000 -0780000780000F00000E00003C0003F000003800001C00000E00000F00000F00000F80380F8078 -0780780780780F80200F00100E000C1C0003F000>18 31 -2 1 23]51 dc[<00FFE0000E00000E -00000E00000E00000E00000E00000E00FFFFF0C00E00400E00200E00200E00100E00080E00080E -00040E00020E00020E00010E00008E00008E00004E00002E00002E00001E00000E00000E000006 -00000600>20 30 -1 0 23]52 dc[<03E0000C3800100E00200600400700400380E00380F003C0 -F003C07003C00003C00003C00003C0000380000380100780100700180E00161C0011F000100000 -1000001000001000001000001000001FE0001FF8001FFC001FFE00180300>18 31 -2 1 23]53 -dc[<01F000061C000C0E001807003807003803807003807003C07003C0F003C0F003C0F003C0F0 -03C0F003C0F80380F80380F80700F40600F21C00F1F0007000007000007800003800003803001C -07800C07800E0380070100018200007C00>18 31 -2 1 23]54 dc[<0300000780000780000780 -0007800007800007800007800003800003800003800003800001800001C00000C00000C0000040 -000040000020000020000010000008000008008004008002008002004001007FFF807FFF807FFF -C0400000>18 31 -3 1 23]55 dc[<03F0000C0C00100200200100600180C00080C000C0C000C0 -C000C0C001C04001C0600380300F80103F000C7E0007FC0003F8000FF0001FC8003F06003E0300 -7803007001806001806001806001802001803003001006000C0C0003F000>18 31 -2 1 23]56 -dc[<0FC000107000201800700C00780E0078060030070000070000038000038000038003E3C00E -13C0180BC03807C07007C07007C0F003C0F003C0F003C0F003C0F003C0F00380F0038070038070 -07003807003806001C0C000E180003F000>18 31 -2 1 23]57 dc[<70F8F8F870000000000000 -0000000070F8F8F870>5 20 -4 0 13]58 dc[<40202010101008080878F8F8F0700000000000 -000000000070F8F8F870>5 29 -4 9 13]59 dc[<7FFFFFE0FFFFFFF000000000000000000000 -00000000000000000000000000000000000000000000FFFFFFF07FFFFFE0>28 12 -3 -5 35] -61 dc[<07000F800F800F80070000000000000000000000020002000200020002000200030001 -000180018000C000E000700038603CF03CF03CE03C4038403830700FC0>14 32 -3 0 21]63 dc -[<001FF00000E01F00010001C0060000700800000008000000100F07802030CC4020605C2040C0 -3C2041C01C1041C01C1081801C1083801C1083801C1083801C1083801C1083801C1083801C1081 -801C1041C01C2041C01C2040C02020206040402030C040100F0080080001000800010006000600 -0100080000E07000001F8000>28 32 -3 0 35]64 dc[<FFC03FFE1F0007E00E0003C0040003C0 -02000780020007800200078001000F0001000F0001000F0000FFFE0000801E0000801E0000403C -0000403C0000403C000020780000207800002078000010F0000010F0000010F0000009E0000009 -E0000009E0000007C0000007C0000007C00000038000000380000003800000010000>31 32 -1 -0 34]65 dc[<FFFFF0000F803C0007801F0007800F0007800F8007800780078007C0078007C007 -8007C0078007C0078007C00780078007800F8007800F0007801E0007803C0007FFF00007803C00 -07801E0007801F0007800F0007800F8007800F8007800F8007800F8007800F8007800F0007801F -0007801E000F803800FFFFE000>26 31 -2 0 32]66 dc[<000FC0000070380001C00400038002 -00070001000E0000801E0000801C0000403C0000407C0000407C00004078000000F8000000F800 -0000F8000000F8000000F8000000F8000000F8000000F8000000F8000000780000407C0000407C -0000403C0000C01C0000C01E0000C00E0001C0070003C0038005C001C009C0007030C0000FC040 ->26 33 -3 1 33]67 dc[<FFFFE0000F803C0007800E000780070007800380078003C0078001E0 -078001E0078000F0078000F0078000F0078000F8078000F8078000F8078000F8078000F8078000 -F8078000F8078000F8078000F8078000F0078000F0078001F0078001E0078001E0078003C00780 -03800780070007801E000F803C00FFFFE000>29 31 -2 0 35]68 dc[<FFFFFF800F800F800780 -0180078000C0078000C00780004007800040078000400780002007800020078000200780800007 -80800007808000078080000781800007FF80000781800007808000078080000780800007808080 -078000800780008007800080078001800780010007800300078003000F800F00FFFFFF00>27 31 --2 0 31]69 dc[<FFFE00000FC000000780000007800000078000000780000007800000078000 -000780000007800000078080000780800007808000078080000781800007FF8000078180000780 -800007808000078080000780800007800080078000800780008007800080078001800780010007 -800300078003000F800F00FFFFFF00>25 31 -2 0 30]70 dc[<000FE0000078182000E0046003 -8002E0070001E00F0001E01E0001E01E0001E03C0001E03C0001E07C0001E0780001E0F80003E0 -F8007FFCF8000000F8000000F8000000F8000000F8000000F8000000F8000000780000207C0000 -203C0000203C0000601E0000601E0000600F0000E0070001E0038002E000E004E000781860000F -E020>30 33 -3 1 36]71 dc[<FFF8FFF80F800F8007800F0007800F0007800F0007800F000780 -0F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007 -FFFF0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F00 -07800F0007800F0007800F000F800F80FFF8FFF8>29 31 -2 0 34]72 dc[<FFFC0FC007800780 -078007800780078007800780078007800780078007800780078007800780078007800780078007 -80078007800780078007800FC0FFFC>14 31 -1 0 16]73 dc[<0F800030E000407000407800F0 -3800F83C00F83C00F83C00203C00003C00003C00003C00003C00003C00003C00003C00003C0000 -3C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C0000 -7C000FFFC0>18 32 -2 1 23]74 dc[<FFFC3FFC0FC007E0078007C0078007800780078007800F -0007801E0007801E0007803C0007803C00078078000780F00007C0F00007A1E0000791E0000793 -C000078F8000078780000783000007810000078080000780400007802000078010000780080007 -8004000780020007800100078001800FC003E0FFFC0FFC>30 31 -2 0 35]75 dc[<FFFFFC0F80 -7C07801C07800C0780040780040780060780020780020780020780020780000780000780000780 -000780000780000780000780000780000780000780000780000780000780000780000780000780 -000780000FC000FFFE00>23 31 -2 0 28]76 dc[<FFE0C1FFF81F00C01F800E00C00F000401E0 -0F000401E00F000401E00F000403900F000403900F000407080F000407080F000407080F00040E -040F00040E040F00040E040F00041C020F00041C020F00041C020F000438010F000438010F0004 -38010F000470008F000470008F000470008F0004E0004F0004E0004F0005C0002F0005C0002F00 -05C0002F000780001F000F80001F80FF80001FF8>37 31 -2 0 42]77 dc[<FFE001001F000300 -0E000300040007000400070004000F0004001F0004001F0004003D0004003D00040079000400F1 -000400F1000401E1000401E1000403C1000407810004078100040F0100040F0100041E0100043C -0100043C0100047801000478010004F0010005E0010005E0010007C0038007C007C0FF803FF8> -29 31 -2 0 34]78 dc[<001F800000F0F00001C0380007801E000F000F000E0007001E000780 -3C0003C03C0003C07C0003E07C0003E0780001E0F80001F0F80001F0F80001F0F80001F0F80001 -F0F80001F0F80001F0F80001F0F80001F0780001E0780001E07C0003E03C0003C03C0003C01E00 -07800E0007000F000F0007801E0001C0380000F0F000001F8000>28 33 -3 1 35]79 dc[<FFFC -00000FC00000078000000780000007800000078000000780000007800000078000000780000007 -8000000780000007800000078000000780000007FFE0000780780007801C0007801E0007800F00 -07800F8007800F8007800F8007800F8007800F8007800F8007800F0007801E0007801C000F8078 -00FFFFE000>25 31 -2 0 31]80 dc[<0000078000000FC000001FE000001FE000003FF0000038 -700000383000003010001FB01000F0F01001E0380007A03E000F204F000E2047001E1087803C0F -03C03C0003C07C0003E0780001E0780001E0F80001F0F80001F0F80001F0F80001F0F80001F0F8 -0001F0F80001F0F80001F0F80001F0780001E07C0003E07C0003E03C0003C03C0003C01E000780 -0E0007000F000F0007801E0001C0380000F0F000001F8000>28 41 -3 9 35]81 dc[<000003E0 -FFFC0F100FC01E0807803E0407807E0407807C0407807C0007807C0007807C0007807800078078 -0007807800078070000780F0000780E0000781C00007FF80000780F0000780780007803C000780 -1E0007801E0007801F0007801F0007801F0007801F0007801E0007801E0007803C00078078000F -80F000FFFF8000>30 32 -2 1 33]82 dc[<81F800CE0C00F00600E00300C00380C001808001C0 -8001C08001C08001C00001C00003C00003C0000780001F8003FF000FFE001FFC003FF0007F0000 -780000F00000F00000E00080E00080E00080E001806001806001803003801007800C198007E080 ->18 33 -3 1 25]83 dc[<07FFFE00001F8000000F0000000F0000000F0000000F0000000F0000 -000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F00 -00000F0000000F0000000F0000000F0000800F0010800F0010800F0010800F0010C00F0030400F -0020400F0020600F0060780F01E07FFFFFE0>28 31 -2 0 33]84 dc[<000FC000003820000070 -180000E0080001C0040001C0020003800200038002000780010007800100078001000780010007 -800100078001000780010007800100078001000780010007800100078001000780010007800100 -07800100078001000780010007800100078001000780010007800100078003800FC007C0FFFC3F -F8>29 32 -2 1 34]85 dc[<000100000003800000038000000380000007C0000007C0000007C0 -00000F2000000F2000001F3000001E1000001E1000003C0800003C0800003C0800007804000078 -040000F8060000F0020000F0020001F0010001E0010001E0010003C0008003C0008003C0008007 -800040078000400F8000600F0000601F8000F8FFF003FE>31 32 -1 1 34]86 dc[<0004000200 -00000C00030000000E00070000000E00070000001E00078000001F000F8000001F000F8000001F -000F8000003C801E4000003C801E4000003C801E40000078C03E20000078403C20000078403C20 -0000F0403C100000F02078100000F02078100001F02078080001E010F0080001E010F0080003E0 -10F00C0003C009E0040003C009E0040003C009E00400078007C00200078007C00200078007C002 -000F0007C001000F00078001000F00078003801F800FC007C0FFF07FF81FF0>44 32 -1 1 47] -87 dc[<FFE01FFE1F8007E0070003C0020007C00100078001800F0000801F0000401E0000603C -0000207C00001078000018F8000009F0000005E0000007E0000003C00000078000000F8000000F -8000001E4000003E4000003C2000007C10000078100000F0080001F00C0001E0040003C0020007 -C007000FE00FC07FF83FF8>31 31 -1 0 34]88 dc[<007FFE000007C0000003C0000003C00000 -03C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000007C000 -0007A000000FB000001F1000001E0800003E0800003C0400007C040000F8020000F0030001F001 -0001E0008003E0008007C00040078000400F8000601F8000F8FFF003FF>32 31 -1 0 34]89 dc -[<FFFFF8F801F87800383C00183C00181E00081E000C0F000C0F800407800403C00403C00401E0 -0001E00000F00000F800007800003C00003C00001E00001E00800F00800F80800780C003C0C003 -C04001E06001E07000F07C00F87FFFF8>22 31 -3 0 28]90 dc[<FEFEC0C0C0C0C0C0C0C0C0C0 -C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE>7 45 -4 11 -13]91 dc[<381C7C3EFC7EFC7EB85C804080408040402040202010201010080804>15 14 -5 --18 23]92 dc[<FEFE060606060606060606060606060606060606060606060606060606060606 -0606060606060606060606FEFE>7 45 -1 11 13]93 dc[<387CFCFCB8808080404020201008> -6 14 -3 -18 13]96 dc[<0F83C0386720781E10F01E10F00E10F00E10F00E10780E00380E001E -0E00078E0000FE00000E00000E00000E00300E00781C007818003030001FE000>20 20 -2 0 23 -]97 dc[<083E000CC3000D01C00F00E00E00E00E00700E00700E00780E00780E00780E00780E00 -780E00780E00700E00700E00E00F00E00F01C00EC3800E3E000E00000E00000E00000E00000E00 -000E00000E00000E00000E00000E0000FE00000E0000>21 32 -1 0 25]98 dc[<03F00E0C1C02 -3801380170007000F000F000F000F000F000F00070007000380C381E1C1E0E0C03F8>16 20 -2 -0 20]99 dc[<03E3F80E1B801C0780380780380380700380700380F00380F00380F00380F00380 -F00380F003807003807003803803803803801C0780061B8003E380000380000380000380000380 -000380000380000380000380000380000380003F80000380>21 32 -2 0 25]100 dc[<01F800 -0706000C0100180080380080700000700000F00000F00000F00000FFFF80F00380F00380700380 -7007003807003807001C0E000E1C0003F000>17 20 -1 0 20]101 dc[<7FF007000700070007 -0007000700070007000700070007000700070007000700070007000700FFF00700070007000700 -0700070007000706038F018F00C6007C>16 32 0 0 14]102 dc[<03FC001C03803000C0600060 -C00030C00030C00030C000306000703001E00FFFC01FFF803FFE00300000300000200000200000 -33E0001E38001C1C00380E00780F00780F00780F00780F00780F00380E001C1C300E3C3003E330 -0000E0>20 31 -1 10 23]103 dc[<FFE7FC0E01C00E01C00E01C00E01C00E01C00E01C00E01C0 -0E01C00E01C00E01C00E01C00E01C00E01C00E01C00F01C00F01C00E81800E43000E3E000E0000 -0E00000E00000E00000E00000E00000E00000E00000E00000E0000FE00000E0000>22 32 -1 0 -25]104 dc[<FFC00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E -000E007E000E000000000000000000000000001C001E003E001E001C00>10 31 0 0 12]105 dc -[<3F006180F0C0F060607000700070007000700070007000700070007000700070007000700070 -007000700070007000700070007000F007F0007000000000000000000000000000E001F001F001 -F000E0>12 40 2 9 14]106 dc[<FFCFF80E03E00E03C00E03800E07800E07000E0E000E1E000E -1C000F38000EF8000E70000E30000E10000E08000E04000E02000E03000E03C00E0FF00E00000E -00000E00000E00000E00000E00000E00000E00000E00000E0000FE00000E0000>21 32 -1 0 24 -]107 dc[<FFE00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 -0E000E000E000E000E000E000E000E000E000E000E000E000E00FE000E00>11 32 0 0 12]108 -dc[<FFE7FE7FE00E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00 -E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000F -00F00E000F00F00E000E81C81C00FE618618000E1F01F000>35 20 -1 0 38]109 dc[<FFE7FC -0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 -0E01C00F01C00F01C00E8180FE43000E3E00>22 20 -1 0 25]110 dc[<01F800070E001C0380 -3801C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0F000F07000E07000E03801C0 -3801C01C0380070E0001F800>20 20 -1 0 23]111 dc[<FFE0000E00000E00000E00000E0000 -0E00000E00000E00000E00000E3E000EC3000F01C00F01E00E00E00E00F00E00700E00780E0078 -0E00780E00780E00780E00780E00700E00F00E00E00F00E00F01C0FEC3800E3E00>21 29 -1 9 -25]112 dc[<003FF800038000038000038000038000038000038000038000038003E3800E1380 -1C0B80380780380380780380700380F00380F00380F00380F00380F00380F00380700380780380 -3803803C07801C058006198003E080>21 29 -2 9 24]113 dc[<FFE00E000E000E000E000E00 -0E000E000E000E000E000E000E000E000E000F0C0F1E0F1EFE8C0E78>15 20 -1 0 18]114 dc[ -<8F80D060E030C018C01880188018803800700FF03FE07F807800E000C010C010C01040303070 -1F90>13 20 -2 0 18]115 dc[<01E0031006100E080E080E080E080E080E000E000E000E000E -000E000E000E000E000E000E00FFF83E000E000E0006000600020002000200>13 28 -1 0 18] -116 dc[<01F1FC030DC00603C00E03C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 -C00E01C00E01C00E01C00E01C00E01C00E01C0FE1FC00E01C0>22 20 -1 0 25]117 dc[<0020 -0000700000700000700000E80000E80001EC0001C40001C4000382000382000382000701000701 -000E00800E00800E00801C00C01E01E0FF83F8>21 20 -1 0 24]118 dc[<0040080000601800 -00E01C0000E01C0000F03C0001D03A0001D0320003C8730003887100038861000704E0800704C0 -800707C0800E03C0400E0380400E0380401C0380201C0300603C078070FF9FE1FC>30 20 -1 0 -33]119 dc[<FF07FE1E01E00601E00201C0030380010700008700004E00007C00003C00003800 -00780000EC0000E40001C2000381000701800701C00F01E07FC3FC>23 20 0 0 24]120 dc[<3C -0000620000F10000F08000F0800000400000400000400000200000200000700000700000700000 -E80000E80001EC0001C40001C4000382000382000382000701000701000E00800E00800E00801C -00C01E01E0FF83F8>21 29 -1 9 24]121 dc[<FFFE700E700638021C031E010E010701078003 -8001C001E000E0407040784038201C200E380E3FFF>16 20 -1 0 20]122 dc[<FFFFFC>22 1 0 --12 23]123 dc /fm df[<60F07830>5 4 -4 0 12]46 dc[<FFC3FC001C00F0000E00F0000E00 -E0000E00E0000E00E0000701C0000701C0000701C000070380000383800003C380000397000003 -8F000001C7000001C2000001C1000001C0800000E0400000E0100000E0080000E0040000700200 -00700100007001C003FF07F0>28 26 -3 0 29]75 dc[<1E18613460F2C072C072C072E038E038 -E038E038701C301C381C181C0E2E03CC>15 16 -4 0 20]97 dc[<1E00638060C0C0E0C060C070 -E038E038E038E03870187018701878303C303BC0380038001C001C001C001C000E000E000E007E -00>13 26 -4 0 18]98 dc[<1F0030C06020E010E008E000E000E000E00060007000301018380C -18060801F0>13 16 -4 0 18]99 dc[<1E180061340060F200C07200C07200C07200E03800E038 -00E03800E03800701C00301C00381C00181C000E2E0003CE00000E00000E000007000007000007 -00000700000380000380000380001F80>17 26 -4 0 20]100 dc[<1F0030C060206010E008E0 -00E000E000E000FFE07010700838081C08061801E0>13 16 -4 0 18]101 dc[<700000CC0000 -E4000066000007000007000007000003800003800003800003800003800001C00001C00001C000 -01C00001C00000E00000E00000E00000E00000E00007FF00007000007000007000007000003000 -003000003B00001B80001980000700>17 33 1 7 12]102 dc[<7F0000C1C000E0E00060700000 -700000380000380007B800187800183C00301C00301C00301C00380E00380E00380E00380E001C -07000C07000E0700060700038B8000F300>17 23 -2 7 18]103 dc[<600E00E0190070390070 -3880701C80701C80381C00380E00380E00380E001C07001C07001E07001E07000F86000E7C000E -00000E00000700000700000700000700000380000380000380001F8000>17 26 -2 0 20]104 -dc[<3864E4E272727038381C9C9C8E4E4C38000000000000060703>8 25 -4 0 12]105 dc[<30 -68E4E4E4E470707070383838381C1C1C1C0E0E0E0E0707073F>8 26 -3 0 10]108 dc[<601807 -00E0380C80701C1C80701C1C40701C0E40701C0E40380E0E00380E0700380E0700380E07009C07 -03809C0703809E0703809E07838059866300307C1E00>26 16 -4 0 31]109 dc[<600E00E019 -00703900703880701C80701C80381C00380E00380E00380E009C07009C07009E07009E07005986 -00307C00>17 16 -4 0 22]110 dc[<1F0030C06060E030E018E01CE00CE00EE00E600E700E30 -0E180E0C0C061801F0>15 16 -4 0 20]111 dc[<FF00001C00001C00001C00001C00000E0000 -0E00000E78000E8E000703000703800701800701C00380E00380E00380E00380E009C06009C060 -09C06009E0C00590C0030F00>19 23 0 7 20]112 dc[<6000E000700070007000700038003800 -380038009C009C009C189E38591830F0>13 16 -4 0 16]114 dc[<3E00418080C0E060E06000 -6000E00FE01FC01F801C00186018700830043003E0>12 16 -3 0 16]115 dc[<38006400E200 -E100E100E100700070007000700038003800380038001C00FFC01C001C000E000E000E000E0006 -00>10 23 -4 0 13]116 dc[<0F0C389A3079703970397039381C381C381C1C1C9C0E9C0E8E0E -4E0E4C073806>16 16 -4 0 21]117 dc[<0F0018C030407020701070103808380838081C089C -0C9C0C8E0C4E1C4C1C3818>14 16 -4 0 18]118 dc[<78F000C58800E78400C3820003820003 -820001C00001C00001C00001C00020E00020E00020E18010F38008D180078F00>17 16 -2 0 18 -]120 dc /fn df[<0007F00000003FFE000000780F000001C001C000038000E00006000030000C -000018001800000C001800000C003000000600600000030060000003006000000300C000000180 -C000000180C000000180C000000180C000000180C000000180C000000180600000030060000003 -00600000030030000006001800000C001800000C000C000018000600003000038000E00001C001 -C00000780F0000003FFE00000007F00000>33 33 -2 7 38]13 dc /fo df[<FFFF00000E01E0 -00070070000700380007001E0007000E000380070003800380038003C0038003C001C001C001C0 -01E001C001E001C001E000E000F000E000F000E000F000E000F0007000F0007000E0007000E000 -7000E0003801C0003803800038070001FFFC00>28 26 -2 0 32]68 dc[<FFF000000F00000007 -0000000700000007000000070000000380000003800000038000000381000001C0800001C08000 -01C0800001FF800000E0C00000E0400000E0400000E04000007000800070008000700080007000 -8000380080003801800038038001FFFF80>25 26 -2 0 25]70 dc[<03F800000E0F00001C03C0 -003800E0007000700070003800F0003C00F0001E00F0000E00F0000F00F0000F00F0000780F000 -0780F0000780780003C0780003C0380003C03C0003C01C0003800E0003800F0003800700070001 -C0070000E00E0000383800000FE000>26 26 -2 0 29]79 dc[<03000000030000000380000003 -C0000003C0000003A0000003900000079000000708000007040000070400000702000007030000 -070100000F0080000E0080000E0040000E0020000E0020000E0010000E0008000E0008001C0004 -001C0006001E000700FFC01FE0>27 26 -2 0 22]86 dc /fp df[<7F0FF00E07000E07000E07 -000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E0700FFFFF00E07 -000E07000E07000E07000E07000E070006070407078E0183C600FC7C>23 26 0 0 22]11 dc[< -7F0FE00E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E0700 -0E07000E0700FFFF000E00000E00000E00000E00000E00000E020006070007030001820000FC00 ->19 26 0 0 21]12 dc[<7F9FE00E07000E07000E07000E07000E07000E07000E07000E07000E -07000E07000E07000E07000E07000E0700FFFF000E07000E07000E07000E07000E07000E070006 -070007070003870000FF00>19 26 0 0 21]13 dc[<7F8FE3FC0E0380E00E0380E00E0380E00E -0380E00E0380E00E0380E00E0380E00E0380E00E0380E00E0380E00E0380E00E0380E00E0380E0 -0E0380E0FFFFFFE00E0380000E0380000E0380000E0380000E0380000E038040060380E00703C0 -6001C17040007E1F80>30 26 0 0 32]14 dc[<08000700180018800C00184006003040060070 -2003007020018070200180702000C070200060702000607020003030400018184000181880000C -07000E060000310300003083000060818000E040C000E040C000E0406000E0403000E0403000E0 -401800E05FEC0060E01C0030800E00310007000E000300>27 30 -2 2 32]37 dc[<C020101008 -080868F8F060>5 11 -3 -15 11]39 dc[<00800100020004000C000800180030003000300060 -00600060006000E000E000E000E000E000E000E000E000E000E000600060006000600030003000 -3000180008000C000400020001000080>9 38 -3 10 15]40 dc[<800040002000100018000800 -0C0006000600060003000300030003000380038003800380038003800380038003800380030003 -00030003000600060006000C00080018001000200040008000>9 38 -2 10 15]41 dc[<000C00 -00000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C -0000000C0000FFFFFF80FFFFFF80000C0000000C0000000C0000000C0000000C0000000C000000 -0C0000000C0000000C0000000C0000000C0000000C0000>25 26 -2 4 30]43 dc[<8040202010 -101070F0F060>4 11 -3 7 11]44 dc[<FFC0FFC0>10 2 0 -7 13]45 dc[<60F0F060>4 4 -3 -0 11]46 dc[<078018603030703860186018E01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE0 -1CE01C601860183030303018600780>14 24 -2 0 19]48 dc[<FFF00700070007000700070007 -0007000700070007000700070007000700070007000700070007000700FF0007000300>12 24 --3 0 19]49 dc[<FFF87FF83FF8300810040804040402000100018000C0006000700038003800 -3C401CE01CC01C803C4038203010600F80>14 24 -2 0 19]50 dc[<0F8030E040704038C03CE0 -3CE03C003C003C0038007000E00F8000C00060007000700078203870386078207010E00F80>14 -24 -2 0 19]51 dc[<07FF007000700070007000700070FFFFC070407020703070107008700C70 -047002700370017000F000F0007000300030>16 24 -1 0 19]52 dc[<0F8030E0403040388018 -E01CE01C401C001C001C001800382030386027C0200020002000200020003FC03FE03FF03018> -14 24 -2 0 19]53 dc[<07C01860303030187018601C601CE01CE01CE01CE018F018F030E860 -E7C0E000600070003000303818380C18061001E0>14 24 -2 0 19]54 dc[<0200070007000700 -070007000700030003000300030001000180018000800040004080208010801040087FFC7FFC7F -FE4000>15 25 -2 0 19]55 dc[<0FC0186020106008C00CC00CC00CC00C401C603830F819F007 -C00F803E603C3070106018601860182018303018600780>14 24 -2 0 19]56 dc[<1F00218060 -4070607030003800180018001C0F9C185C303C603C601CE01CE01CE01CE018E018601870303030 -18600780>14 24 -2 0 19]57 dc[<8040202010101070F0F060000000000000000060F0F060> -4 23 -3 7 11]59 dc[<FFFFFF80FFFFFF80000000000000000000000000000000000000000000 -000000FFFFFF80FFFFFF80>25 10 -2 -4 30]61 dc[<FF00FFC01C001E0008001C0008001C00 -040038000400380006007800020070000200700001FFE0000100E0000100E0000081C0000081C0 -000081C0000043800000438000004380000027000000270000003F0000001E0000001E0000000C -0000000C0000000C0000>26 26 -1 0 29]65 dc[<FFFF800E01E00E00F00E00780E00380E003C -0E003C0E003C0E003C0E003C0E00780E00700E01E00FFF800E03C00E00E00E00F00E00780E0078 -0E00780E00780E00780E00700E00E00E01C0FFFF00>22 26 -2 0 27]66 dc[<003F0001C0C003 -00300E00081C00081C0004380004780002700002700002F00000F00000F00000F00000F00000F0 -00007000027000027800023800061C00061C000E0E001E03002E01C0C6003F02>23 26 -2 0 28 -]67 dc[<FFFF000E01C00E00700E00380E00380E001C0E001E0E000E0E000E0E000F0E000F0E00 -0F0E000F0E000F0E000F0E000F0E000F0E000E0E000E0E001C0E001C0E00380E00300E00E00E01 -C0FFFF00>24 26 -2 0 29]68 dc[<FFFFF00E00700E00380E00180E00080E00080E00080E0004 -0E00040E04000E04000E04000E0C000FFC000E0C000E04000E04000E04000E00080E00080E0008 -0E00180E00100E00300E0070FFFFF0>22 26 -2 0 26]69 dc[<FFF0000E00000E00000E00000E -00000E00000E00000E00000E00000E04000E04000E04000E0C000FFC000E0C000E04000E04000E -04000E00100E00100E00100E00300E00200E00600E00E0FFFFE0>20 26 -2 0 25]70 dc[<003F -820001C06600030016000E000E001C000E001C000E0038000E0078000E0070000E0070000E00F0 -01FFC0F0000000F0000000F0000000F0000000F000000070000200700002007800020038000600 -1C0006001C000E000E001E0003002E0001C0C600003F0200>26 26 -2 0 30]71 dc[<FFE7FF0E -00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700FFFF00E -00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF>24 26 --2 0 29]72 dc[<FFE00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E -000E000E000E000E000E000E000E000E000E00FFE0>11 26 -1 0 14]73 dc[<FFE0FF800E003E -000E001C000E0038000E0070000E0070000E00E0000E00E0000E01C0000E0380000F0380000E87 -00000E4E00000E2E00000E1C00000E0800000E0400000E0200000E0100000E0080000E0040000E -0020000E0010000E0018000E001E00FFE07F80>25 26 -2 0 30]75 dc[<FFFFC00E03C00E00C0 -0E00400E00400E00600E00200E00200E00200E00000E00000E00000E00000E00000E00000E0000 -0E00000E00000E00000E00000E00000E00000E00000E00000E0000FFF000>19 26 -2 0 24]76 -dc[<FF861FFC1C0601C0080601C0080F01C0080F01C0080F01C0081C81C0081C81C0081C81C008 -3841C0083841C0083841C0087021C0087021C008E011C008E011C008E011C009C009C009C009C0 -09C009C00B8005C00B8005C00B8005C00F0003C00F0003C0FF0003FC>30 26 -2 0 35]77 dc[< -FF80101C00300800300800700800700800F00801D00801D0080390080390080710080E10080E10 -081C10081C1008381008701008701008E01008E01009C0100B80100B80100F00100F0038FE01FF ->24 26 -2 0 29]78 dc[<007F000001C1C000070070000E0038001C001C003C001E0038000E00 -78000F0078000F00F0000780F0000780F0000780F0000780F0000780F0000780F0000780F00007 -807000070078000F0038000E003C001E001C001C000E0038000700700001C1C000007F0000>25 -26 -2 0 30]79 dc[<FFE0000E00000E00000E00000E00000E00000E00000E00000E00000E0000 -0E00000E00000FFF000E03C00E00E00E00700E00700E00780E00780E00780E00780E00700E0070 -0E00E00E03C0FFFF00>21 26 -2 0 26]80 dc[<FFE03E000E0071000E00F0800E01E0800E01E0 -000E01E0000E01E0000E01C0000E01C0000E01C0000E0180000E0300000E0600000FFC00000E07 -80000E01C0000E00E0000E00F0000E00F0000E00F0000E00F0000E00F0000E00E0000E01C0000E -078000FFFC0000>25 26 -2 0 28]82 dc[<87E0D818E004C006C0028003800380030003000700 -0E003E07FC1FF83FE07E007000E000C002C002C002C0066006200E18360FC2>16 26 -2 0 21] -83 dc[<03FFE000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C00 -00001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000801C -0080801C0080801C0080C01C0180401C0100401C0100701C07007FFFFF00>25 26 -1 0 28]84 -dc[<003E0000C1800180400300400700200600200E00100E00100E00100E00100E00100E00100E -00100E00100E00100E00100E00100E00100E00100E00100E00100E00100E00100E00100E0038FF -E1FF>24 26 -2 0 29]85 dc[<000C0000000C0000001E0000001E0000001E0000003900000039 -000000390000007080000070800000E0400000E0400000E0400001C0200001C0200003C0300003 -801000038010000700080007000800070008000E0004000E0004001C0006001E000F00FF801FC0 ->26 26 -1 0 29]86 dc[<FF80FFC01E003E000C001C000400380002007800010070000100E000 -0081E0000041C000004380000027800000170000001E0000001E0000001C0000003C0000007A00 -000071000000E1800001E0800001C040000380600007802000070030000F003C007FC0FF00>26 -26 -1 0 29]88 dc[<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 -C0C0C0C0C0FEFE>7 37 -3 9 11]91 dc[<FEFE06060606060606060606060606060606060606 -0606060606060606060606060606FEFE>7 37 0 9 11]93 dc[<3078F8B080808040402018>5 -11 -2 -15 11]96 dc[<1E3C71FBE0F1E071E071E070707030701C7007F000700070207070E070 -C03F80>16 16 -2 0 19]97 dc[<10F0001B0C001E07001C03001C03801C01C01C01C01C01C01C -01C01C01C01C01C01C01801C03801E07001F0E001CF8001C00001C00001C00001C00001C00001C -00001C00001C00001C0000FC0000>18 26 -1 0 21]98 dc[<07E00C18380830047000E000E000 -E000E000E000E00070003008381C0C1C07F8>14 16 -1 0 17]99 dc[<07CFC01C2E00381E0070 -0E00600E00E00E00E00E00E00E00E00E00E00E00E00E00700E00300E00380E000C3E0003CE0000 -0E00000E00000E00000E00000E00000E00000E00000E00000E00007E00>18 26 -1 0 21]100 -dc[<07E00C18380830046000E000E000E000E000FFFCE00C600C701830181C3007C0>14 16 -1 -0 17]101 dc[<7FE00E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC0 -0E000E000E000E000E000E000E100738031801F0>13 26 0 0 12]102 dc[<07E0381C6006C003 -C003C003C003600F1FFE3FFC3FF07000600020002FC0186030307038703870387038303018730F -CE>16 24 -1 8 19]103 dc[<FF9FC01C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E -001C0E001C0E001C0E001E0E001E0E001D0C001CF8001C00001C00001C00001C00001C00001C00 -001C00001C00001C0000FC0000>18 26 -1 0 21]104 dc[<FF801C001C001C001C001C001C00 -1C001C001C001C001C001C001C001C00FC0000000000000000000000000018003C003C001800> -9 26 0 0 10]105 dc[<7E00E300E18041C001C001C001C001C001C001C001C001C001C001C001 -C001C001C001C001C001C001C001C00FC0000000000000000000000000018003C003C00180>10 -33 2 7 12]106 dc[<FF3FC01C1F001C1E001C1C001C38001C78001C70001CE0001FE0001DC000 -1C40001C20001C10001C18001C1E001C3F801C00001C00001C00001C00001C00001C00001C0000 -1C00001C0000FC0000>18 26 -1 0 20]107 dc[<FF801C001C001C001C001C001C001C001C00 -1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FC00>9 26 0 0 -10]108 dc[<FF9FE7F81C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C -0701C01C0701C01C0701C01C0701C01E0781C01E0781C01D8E6380FC7C1F00>29 16 -1 0 32] -109 dc[<FF9FC01C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E -001E0E001E0E001D0C00FCF800>18 16 -1 0 21]110 dc[<07E01C38381C700E6006E007E007 -E007E007E007E0076006700E300C1C3807E0>16 16 -1 0 19]111 dc[<FF80001C00001C0000 -1C00001C00001C00001C00001CF0001F0C001E07001C03001C03801C01C01C01C01C01C01C01C0 -1C01C01C01C01C03801C03801E07001F0E00FCF800>18 23 -1 7 21]112 dc[<007FC0000E00 -000E00000E00000E00000E00000E0007CE001C2E00381E00700E00700E00E00E00E00E00E00E00 -E00E00E00E00E00E00700E00300E00381E000C260003C200>18 23 -1 7 20]113 dc[<FFC01C -001C001C001C001C001C001C001C001C001C001C001E201E701D70FCE0>12 16 -1 0 15]114 -dc[<8F80F040C020C0308030807000F01FE03FC07F00F000C020C020402060E01F20>12 16 -1 -0 15]115 dc[<03800E401C201C201C201C201C201C001C001C001C001C001C001C001C00FFC0 -3C001C000C000C00040004000400>11 23 -1 0 15]116 dc[<07CFC00C2E001C1E001C0E001C -0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E00FC7E00>18 16 --1 0 21]117 dc[<00800001C00001C00001C00003A00003A0000790000710000710000E08000E -08001E0C001C04001C04003C0600FF1F80>17 16 -1 0 20]118 dc[<010040000180C0000380 -E0000380E00003C1E0000741D000074190000F2398000E2388000E2308001E170C001C1704001C -160400380E06003C0E0700FF3F9F80>25 16 -1 0 28]119 dc[<FC3FC0381E00181C00083800 -04380002700003E00001E00001C00003C0000760000720000E10001C18003C1C00FF3F80>18 16 --1 0 20]120 dc[<780000E40000E20000E1000001000001000000800000800001C00001C00001 -C00003A00003A0000790000710000710000E08000E08001E0C001C04001C04003C0600FF1F80> -17 23 -1 7 20]121 dc[<FFF07030701038101C081C080E0807000700038041C041C040E04070 -60707FF8>13 16 -1 0 17]122 dc /fq df[<40C0E06070703038383C1C1E1E0E0F0F06>8 17 --1 -1 10]48 dc[<01FF8007FF800E0000180000300000600000600000600000C00000C00000FF -FF80FFFF80C00000C000006000006000006000003000001800000E000007FF8001FF80>17 22 --3 3 24]50 dc /fr df[<60F0F060>4 4 -3 0 10]58 dc[<40402020101070F0F060>4 10 -3 -6 10]59 dc[<FE03FE18007008007004007004007002007001007001FFF00080E000C0E00040E0 -0020E00020E00010E00008E00008E00005E00005C00003C00001C00001C00000C00000C0>23 23 --1 0 26]65 dc[<FFFF00001C01C0000E0070000E0018000E000C000E000E0007000700070003 -000700038007000380038001C0038001C0038001C0038001C001C000C001C000C001C001C001C0 -01C000E0018000E0038000E0030000E00E0007FFF800>26 23 -1 0 29]68 dc[<FFC000001C00 -00000E0000000E0000000E0000000E000000070000000701000007010000070100000381800003 -FF8000038180000380800001C0400001C0400001C0010001C0010000E0010000E0010000E00100 -00E0038007FFFF80>25 23 -1 0 22]70 dc[<03F0000E0E001803803801C07000E07000707000 -38600038E0001C70001C70000E70000E70000E30000E38000E18000E1C000E0E000E06000C0300 -1C01C018007070001FC0>23 23 -1 0 27]79 dc[<FF80001C00000E00000E00000E00000E0000 -07000007000007000007000003800003FFC003807003801C01C00E01C00701C00701C00700E007 -00E00700E00700E00E07FFF8>24 23 -1 0 22]80 dc[<FF801E001C0031000E0070800E007080 -0E0070000E007000070038000700380007003800070070000380E00003FF80000380700003801C -0001C00E0001C0070001C0070001C0070000E0070000E0070000E0060000E01C0007FFF000>25 -23 -1 0 27]82 dc[<7FFC0003C00001C00001C00001C00001C00000E00000E00000E00000E000 -007000007000007000007000003800003800803804403804401C04601C04201C04381C0E1FFFFE ->23 23 -1 0 21]84 dc[<02000003000003800007800007400007600007200007100007100007 -08000F04000E04000E02000E01000E01000E00800E00400E00401C00201C00301C00101C0018FF -807F>24 23 -2 0 21]86 dc[<387046C8C1C480C480C480C0C060C060C06060606070307018F0 -0710>14 14 -2 0 19]97 dc[<3C004600C100818080C080C0C060C060C060C0606060704068C0 -6780300030003000300018001800180018007C00>11 23 -2 0 15]98 dc[<3F0060C0C020C010 -80008000C000C000C0006000207010700C2007C0>12 14 -2 0 15]99 dc[<1F0060C04020C010 -C000C000C000C000FFC06020601030101C2007C0>12 14 -2 0 16]101 dc[<7800CC00E60066 -00030003000300030001800180018001800180018000C000C000C000C000C007FC006000600060 -00600060003600370013000E>16 29 -2 6 17]102 dc[<7F00C1C0E060606000300030073008 -F01838101810181018180C180C180C0C0C0C0E060E031E00E2>15 20 0 6 17]103 dc[<C03CC0 -226062606160316030303030183018381818081C081B1818F00C000C000C000C00060006000600 -06001F00>16 23 -2 0 20]104 dc[<1C0032003200310031001800180018000C008C00460046 -0024001C00000000000000000000000000030003800300>9 23 -1 0 12]105 dc[<7800C600E3 -006300018001800180018000C000C000C000C0006000600060086004300430022001C000000000 -0000000000000000001000380018>13 29 0 6 14]106 dc[<70D0C8C8C8C06060606030303030 -181818180C0C0C0C3E>7 23 -2 0 11]108 dc[<3018078030180440180C0C40180C0C20180C06 -20180C06000C0606000C0603000C0603008E070300460301004702810044C66300383C1E00>27 -14 -1 0 31]109 dc[<300F00300880181880181840180C40180C000C0C000C06000C06008E06 -0046020047020044C600383C00>18 14 -1 0 21]110 dc[<3E006180C0C0C06080308030C018 -C018C0186018201810100C2007C0>13 14 -2 0 17]111 dc[<FC003000300030001800180019 -E01A300C080C0C0C060C0606030603060346032303238222461C3C>16 20 0 6 18]112 dc[<30 -00300018001800180018000C000C000C008C0046304638451838F0>13 14 -1 0 16]114 dc[< -3F00C180C0C0E0606060006003E00FC01E003800187018700C2007C0>12 14 -2 0 16]115 dc[ -<1E003100310030803080300018001800180018000C000C000C00FFC006000600060006000300 -0300>10 20 -1 0 13]116 dc[<078E000C59001838801818801818801818000C0C000C0C000C -0C00860C004606004606002606001C0200>17 14 -1 0 20]117 dc[<78F000C50800E70400C3 -020003020003000001800001800001800041800020C30020C38011A1800F1F00>17 14 -1 0 20 -]120 dc[<1E00218070C070600060003007B00C7018381818181818180C0C0C0C0C0C860C4606 -460626061C02>15 20 -1 6 17]121 dc[<81C043E03C30100808080400020001800040002010 -1018780FCC0784>14 14 -1 0 16]122 dc /fs df[<0102040C1818303070606060E0E0E0E0E0 -E0E0E0E0E060606070303018180C040201>8 34 -3 9 14]40 dc[<8040203018180C0C0E0606 -06070707070707070707070606060E0C0C181830204080>8 34 -2 9 14]41 dc[<07C01C7030 -18701C600C600CE00EE00EE00EE00EE00EE00EE00EE00EE00E600C600C701C3018183007C0>15 -21 -1 0 18]48 dc[<7FF007000700070007000700070007000700070007000700070007000700 -070007000700FF0007000300>12 21 -2 0 18]49 dc[<FFF07FF03FF0101808080C0806000300 -018000C000600070007000384038E038C0388030407030E00F80>13 21 -2 0 18]50 dc[<0FE0 -30304018C00CE00EE00E000E000E000C0018003007E0006000380018001C701C701C601830300F -E0>15 21 -1 0 18]51 dc[<03FE00700070007000700070FFFEC0704070207010701870087004 -700270017001F000F0007000300030>15 21 -1 0 18]52 dc[<1F0020C040608030E038E03840 -38003800380030207030E02F80200020002000200024003FC03FE02030>13 21 -2 0 18]53 dc -[<07C018303018300C600E600EE00EE00EE00EF00CF018EC30E3E0E00060007000301C181C080C -060801F0>15 21 -1 0 18]54 dc[<04000E000E000E000E000E00060006000200030001000100 -00800080004080208010C0087FF87FFC7FFE4000>15 22 -2 0 18]55 dc[<0FE03830600CC004 -C006C006C00E601E607C18F80FF00FC01F603E107818700C600C600C2018183007E0>15 21 -1 -0 18]56 dc[<1F8020C0603070187018001C000C000E0F8E186E301E601EE00EE00EE00EE00CE0 -0C60183018183007C0>15 21 -1 0 18]57 dc /ft df[<FF00001800000C00000C00000C0000 -0C100006080006080007F8000608000304000304200300200300200180200180600FFFE0>19 17 --2 0 19]70 dc[<FF01E01803100C03080C03000C03000C030006030006070007FC0006038003 -00C00300600300600300600180600180C00FFF00>21 17 -2 0 23]82 dc[<0400000600000F00 -000D00000C80000C40000C60001C20001810001808001808001804001802003002003001003001 -80FC03E0>19 17 -3 0 18]86 dc[<1F0060C04020C000C000C0006000600030C018400780>11 -11 -2 0 14]99 dc[<7800CC0046000300030003000300018001800180018000C008C008C004C0 -03800000000000000000000000200020>11 23 0 5 13]106 dc[<603860643062303230303030 -181898189C189A1871F0>15 11 -2 0 19]110 dc[<79C0C73043100308030003000180218021 -8C11440F38>14 11 -1 0 17]120 dc[<7C008600C180418000C00EC031C030E0306030603060 -183098308C3048303810>12 16 -2 5 16]121 dc /fu df[<1F00318060C04040C060C060C060 -C060C060C060C060C060404060C031801F00>11 16 -1 0 15]48 dc[<FF800C000C000C000C00 -0C000C000C000C000C000C000C000C00CC003C000C00>9 16 -2 0 15]49 dc[<FFC07FC02020 -10200C0006000300018000C000600060C060806040C061801F00>11 16 -1 0 15]50 dc[<1F00 -60808040C060C0600060004000800F000180008000C060C060C021801F00>11 16 -1 0 15]51 -dc[<1FE00300030003000300FFE0C30043002300330013000B000F00070003000300>11 16 -1 -0 15]52 dc[<1F00618080C0C060006000600060204030802F002000200020002C003F002080> -11 16 -1 0 15]53 dc[<1F00308060C04060C060C060C060E040F080CF00C000600060C030C0 -18400780>11 16 -1 0 15]54 dc[<18001800180018001800080008000C000400040002000100 -808080807FC07FE04000>11 17 -2 0 15]55 dc[<1F0060804040C060C060C06061C033800F00 -3F00718060C060C060C031801F00>11 16 -1 0 15]56 dc[<3E004300608060C0004000601E60 -21E040E0C060C060C060C04060C031801F00>11 16 -1 0 15]57 dc /fv df[<FE0030001800 -1800180018200C300FF00C100C110601060106011FFF>16 14 -2 0 18]70 dc[<F0008C000600 -0600060006000300030003000300118011800F000000000000000000008000C0>10 19 -1 4 12 -]106 dc[<73C0CE204610060006000600231023181CF0>13 9 -1 0 16]120 dc /fw df[<F861 -F820606020D06020D0602188602188602304602304602602602602602C01602C01603800E0F800 -F8>21 14 -2 0 25]77 dc[<FC0F003018803018803018003018003018003030003FE000301800 -300C00300C00300C00301800FFE000>17 14 -2 0 20]82 dc[<0FF00180018001800180018001 -8001800180818181818181C183FFFF>16 14 -2 0 20]84 dc bop 391 422 a fl(REF)-5 b -(A)o(CTORING)15 b(OBJECT-ORIENTED)i(FRAMEW)o(ORKS)942 954 y(BY)733 1041 y(WIL\ -LIAM)f(F.)e(OPD)o(YKE)688 1137 y(B.S.,)h(Drexel)g(Univ)o(ersit)o(y)l(,)h(1979) -688 1194 y(B.S.,)f(Drexel)g(Univ)o(ersit)o(y)l(,)h(1979)513 1250 y(M.S.,)e -(Univ)o(ersit)o(y)i(of)e(Wisconsin)j(-)e(Madison,)g(1982)893 1704 y(THESIS) -463 1800 y(Submitted)h(in)g(partial)g(ful\014llmen)o(t)h(of)d(the)i(requireme\ -n)o(ts)380 1856 y(for)e(the)i(degree)f(of)g(Do)q(ctor)f(of)h(Philosoph)o(y)h -(in)g(Computer)f(Science)671 1913 y(in)h(the)f(Graduate)g(College)h(of)f(the) -483 1969 y(Univ)o(ersit)o(y)h(of)f(Illinois)j(at)d(Urbana-Champaign,)g(1992) -821 2454 y(Urbana,)f(Illinois)g eop bop 391 135 a fl(REF)-5 b(A)o(CTORING)15 b -(OBJECT-ORIENTED)i(FRAMEW)o(ORKS)711 270 y(William)g(F.)d(Op)q(dyk)o(e,)i(Ph.\ -D.)643 327 y(Departmen)o(t)e(of)h(Computer)g(Science)483 383 y(Univ)o(ersit)o -(y)h(of)f(Illinois)j(at)d(Urbana-Champaign,)g(1992)706 439 y(Ralph)i(E.)d(Joh\ -nson,)i(Advisor)37 1155 y(This)k(thesis)g(de\014nes)g(a)e(set)h(of)g(program) -f(restructuring)h(op)q(erations)g(\(refactorings\))f(that)g(supp)q(ort)h(the) -37 1211 y(design,)d(ev)o(olution)g(and)g(reuse)f(of)g(ob)s(ject-orien)o(ted)g -(application)i(framew)o(orks.)108 1268 y(The)11 b(fo)q(cus)h(of)f(the)g(thesi\ -s)h(is)f(on)h(automating)e(the)h(refactorings)g(in)h(a)f(w)o(a)o(y)f(that)g -(preserv)o(es)i(the)f(b)q(eha)o(vior)37 1324 y(of)22 b(a)f(program.)38 b(The) -22 b(refactorings)g(are)f(de\014ned)i(to)e(b)q(e)i(b)q(eha)o(vior)f(preservin\ -g,)h(pro)o(vided)g(that)e(their)37 1381 y(preconditions)15 b(are)f(met.)19 b -(Most)12 b(of)h(the)h(refactorings)f(are)g(simple)i(to)d(implemen)o(t)j(and)f -(it)f(is)h(almost)f(trivial)37 1437 y(to)g(sho)o(w)f(that)g(they)h(are)g(b)q -(eha)o(vior)g(preserving.)20 b(Ho)o(w)o(ev)o(er,)12 b(for)g(a)h(few)f(refacto\ -rings,)h(one)g(or)f(more)h(of)f(their)37 1493 y(preconditions)22 b(are)f(in)g -(general)g(undecidable.)38 b(F)l(ortunately)l(,)21 b(for)f(some)g(cases)h(it) -f(can)h(b)q(e)g(determined)37 1550 y(whether)16 b(these)f(refactorings)g(can) -g(b)q(e)h(applied)h(safely)l(.)108 1606 y(Three)h(of)f(the)g(most)g(complex)h -(refactorings)f(are)g(de\014ned)i(in)f(detail:)26 b(generalizing)19 b(the)f -(inheritance)37 1663 y(hierarc)o(h)o(y)l(,)f(sp)q(ecializing)i(the)d(inherita\ -nce)i(hierarc)o(h)o(y)e(and)g(using)h(aggregations)e(to)g(mo)q(del)i(the)f -(relation-)37 1719 y(ships)23 b(among)d(classes.)39 b(These)22 b(op)q(eration\ -s)g(are)f(decomp)q(osed)h(in)o(to)f(more)g(primitiv)o(e)i(parts,)f(and)f(the) -37 1776 y(p)q(o)o(w)o(er)c(of)g(these)g(op)q(erations)g(is)h(discussed)h(from) -d(the)h(p)q(ersp)q(ectiv)o(es)i(of)e(automatabilit)o(y)g(and)g(usefulness)37 -1832 y(in)g(supp)q(orting)e(design.)108 1889 y(Tw)o(o)e(design)h(constrain)o -(ts)f(needed)h(in)h(refactoring)d(are)i(class)f(in)o(v)m(arian)o(ts)h(and)g -(exclusiv)o(e)h(comp)q(onen)o(ts.)37 1945 y(These)21 b(constrain)o(ts)f(are)g -(needed)i(to)e(ensure)h(that)e(b)q(eha)o(vior)i(is)g(preserv)o(ed)g(across)e -(some)h(refactorings.)37 2002 y(This)j(thesis)f(giv)o(es)f(some)g(conserv)m -(ativ)o(e)h(algorithms)g(for)e(determining)j(whether)f(a)f(program)f(satis\ -\014es)37 2058 y(these)c(constrain)o(ts,)e(and)i(describ)q(es)g(ho)o(w)f(to)g -(use)g(this)h(design)g(information)f(to)g(refactor)f(a)h(program.)956 2760 y -(iii)g eop bop 499 1350 a fl(T)l(o)15 b(Brenda,)g(for)g(her)g(encouragemen)o -(t)g(and)g(supp)q(ort.)957 2760 y(iv)g eop bop 697 221 a fd(Ac)n(kno)n(wledge\ -men)n(ts)108 578 y fl(I)13 b(thank)g(m)o(y)f(advisor,)h(Prof.)19 b(Ralph)14 b -(Johnson,)f(for)f(his)i(supp)q(ort,)f(guidance)h(and)f(patience)h(during)g -(m)o(y)37 634 y(studies)j(at)f(the)g(Univ)o(ersit)o(y)g(of)g(Illinois.)25 b -(I)16 b(learned)h(m)o(uc)o(h)f(from)f(our)h(w)o(eekly)g(Monda)o(y)f(w)o(orkin\ -g)h(lunc)o(hes)37 691 y(and)h(from)f(other)g(feedbac)o(k)h(he)g(ga)o(v)o(e)e -(me.)24 b(I)17 b(w)o(as)f(amazed)g(b)o(y)h(b)q(oth)f(his)i(insigh)o(ts)f(and) -f(his)i(stamina.)23 b(He)37 747 y(in)o(v)o(ested)16 b(his)g(most)f(v)m(aluabl\ -e)i(resource)e(on)g(m)o(y)g(b)q(ehalf:)21 b(his)16 b(time.)108 803 y(I)d(also) -g(thank)g(the)g(other)g(mem)o(b)q(ers)g(of)f(m)o(y)h(committee.)19 b(Prof.)f -(Simon)c(Kaplan)g(w)o(as)e(helpful)j(in)f(p)q(oin)o(t-)37 860 y(ing)j(out)e -(places)h(in)h(sev)o(eral)f(drafts)e(of)i(the)f(thesis)i(where)e(clarit)o(y)h -(could)h(b)q(e)f(impro)o(v)o(ed)g(and)g(claims)g(made)37 916 y(more)j(precise\ -.)32 b(His)19 b(views)g(on)g(supp)q(orting)h(the)e(soft)o(w)o(are)f(design)j -(pro)q(cess)f(fundamen)o(tally)h(in\015uenced)37 973 y(the)d(approac)o(h)f -(I)g(to)q(ok)g(in)h(m)o(y)f(w)o(ork.)22 b(Prof.)g(Sam)16 b(Kamin)h(pro)o(vide\ -d)g(v)m(aluable)h(insigh)o(ts)f(regarding)f(data)37 1029 y(\015o)o(w)f(analys\ -is.)21 b(I)15 b(also)h(thank)f(Prof.)k(Genev)m(a)c(Belford)h(and)g(Prof.)j -(Larry)c(Jones)g(for)g(their)h(input.)108 1086 y(I)k(o)o(w)o(e)g(thanks)g(to) -f(man)o(y)h(others)f(who)h(w)o(ere)g(at)f(the)h(Univ)o(ersit)o(y)h(of)f(Illin\ -ois)j(during)e(m)o(y)e(graduate)37 1142 y(program.)29 b(Prof.)g(Mehdi)19 b -(Harandi)g(and)g(Prof.)28 b(Ro)o(y)19 b(Campb)q(ell)h(pro)o(vided)f(helpful)h -(guidance)g(early)f(in)37 1199 y(m)o(y)c(graduate)f(studies.)21 b(During)15 b -(m)o(y)g(early)g(researc)o(h,)g(P)o(eter)f(Madan)o(y)h(pro)o(vided)h(in)o(v)m -(aluable)h(input)f(from)37 1255 y(his)f(w)o(ork)e(on)h(the)g fi(Choic)n(es)e -fl(\014le)j(system)f(framew)o(ork.)k(Vince)d(Russo)f(w)o(as)f(helpful)j(in)e -(p)q(oin)o(ting)h(me)f(to)o(w)o(ard)37 1312 y(P)o(eter.)19 b(Mic)o(k)12 b(Mur\ -ph)o(y)g(protot)o(yp)q(ed)f(a)h(fron)o(t)f(end)h(to)f(m)o(y)h(refactoring)f -(protot)o(yp)q(e.)18 b(Stev)o(e)12 b(Marc)o(h)g(pro)o(vided)37 1368 y(exp)q -(ert)k(help)h(in)f(mac)o(hine)g(administration)g(of)e(m)o(y)h(w)o(orkstation.) -108 1424 y(Brian)21 b(F)l(o)q(ote)f(w)o(as)f(helpful)k(at)d(sev)o(eral)g(stag\ -es)g(of)g(m)o(y)g(researc)o(h.)35 b(Early)20 b(on,)h(he)g(shared)g(with)f(me) -37 1481 y(what)c(it)g(w)o(as)f(lik)o(e)h(to)g(w)o(ork)e(with)i(Ralph)h(Johnso\ -n.)22 b(Later,)16 b(he)g(w)o(as)f(a)g(go)q(o)q(d)h(sounding)g(b)q(oard)g(for) -f(ideas.)37 1537 y(Throughout,)g(he)g(shared)h(m)o(y)e(liking)j(for)e(m)o(ush\ -ro)q(om)g(pizza.)108 1594 y(I)24 b(also)f(o)o(w)o(e)f(thanks)h(to)f(sev)o(era\ -l)h(curren)o(t)g(and)h(former)e(mem)o(b)q(ers)h(of)g(A)l(T&T)g(Bell)i(Lab)q -(oratories.)37 1650 y(P)o(aul)14 b(Zislis,)g(m)o(y)f(former)f(departmen)o(t)g -(head)i(at)e(Bell)j(Labs,)e(w)o(as)f(instrumen)o(tal)h(in)h(m)o(y)f(b)q(eing) -h(selected)g(for)37 1707 y(A)l(T&T's)g(full-time)h(do)q(ctoral)e(supp)q(ort)g -(program.)18 b(I)c(hold)g(in)g(highest)g(regard)f(his)h(p)q(ersonal)g(in)o -(tegrit)o(y)f(and)37 1763 y(concern)19 b(for)d(his)j(sta\013.)25 b(W)l(arren) -18 b(Mon)o(tgomery)d(serv)o(ed)j(at)f(v)m(arious)h(times)g(as)f(sup)q(ervisor) -h(and)g(men)o(tor.)37 1820 y(Early)i(on,)g(he)g(pro)o(vided)g(helpful)h(advic\ -e)f(as)f(I)h(considered)h(sev)o(eral)e(p)q(ossible)i(researc)o(h)e(topics.)33 -b(Later,)37 1876 y(he)20 b(pro)o(vided)g(w)o(ords)e(of)h(encouragemen)o(t)g -(during)h(di\016cult)h(stages)d(of)h(m)o(y)f(researc)o(h.)32 b(Mo)q(o)q(dy)19 -b(Ahmad,)37 1933 y(John)j(Degan,)f(Mo)q(e)g(Grzelak)o(o)o(wski)f(and)h(Jac)o -(k)g(W)l(ang)f(also)h(pro)o(vided)h(managemen)o(t)e(supp)q(ort)h(for)f(m)o -(y)37 1989 y(w)o(ork.)108 2045 y(I)i(thank)g(Bjarne)g(Stroustrup)g(for)f(his) -i(encouragemen)o(t)f(of)f(m)o(y)h(pursuing)h(this)f(area)f(of)h(researc)o(h.) -37 2102 y(Jim)17 b(V)l(andendorp)q(e,)f(Dew)o(a)o(yne)f(P)o(erry)g(and)g(Jim) -h(Coplien)h(review)o(ed)g(parts)d(of)h(m)o(y)g(thesis.)21 b(Larry)15 b(Ma)o -(yk)m(a)37 2158 y(pro)o(vided)h(exp)q(ert)g(advice)g(in)g(using)g(Common)f -(LISP)h(for)e(m)o(y)h(protot)o(yping.)108 2215 y(A)o(t)e(Drexel)h(Univ)o(ersi\ -t)o(y)l(,)g(Prof.)k(James)c(Maginnis)g(spark)o(ed)f(m)o(y)g(in)o(terest)g(in) -h(man)o(y)f(areas)g(of)g(computer)37 2271 y(science.)29 b(A)o(t)17 b(the)h -(Univ)o(ersit)o(y)g(of)f(Wisconsin,)i(Prof.)26 b(Randy)18 b(Katz)g(spark)o -(ed)f(m)o(y)g(in)o(terest)h(in)h(computer)37 2328 y(science)e(researc)o(h.) -108 2384 y(I)k(thank)f(those)f(man)o(y)h(others)g(not)f(named)i(here)f(who)g -(pro)o(vided)h(encouragemen)o(t)f(and)g(assistance)37 2441 y(during)d(m)o(y)d -(graduate)h(studies.)108 2497 y(I)g(thank)g(m)o(y)f(paren)o(ts)g(for)g(their) -h(supp)q(ort.)20 b(I)15 b(esp)q(ecially)i(appreciated)f(m)o(y)e(father's)g -(w)o(ords)g(of)g(encour-)37 2554 y(agemen)o(t,)e(and)h(his)g(abilit)o(y)h(to) -d(put)i(to)q(da)o(y's)e(`crises')h(in)h(p)q(ersp)q(ectiv)o(e.)21 b(I)13 b(tha\ -nk)f(m)o(y)g(Aun)o(t)g(Nancy)g(for)g(b)q(eing)37 2610 y(an)k(example)g(to)e -(me.)963 2760 y(v)g eop bop 108 42 a fl(I)17 b(am)g(esp)q(ecially)j(thankful) -d(to)f(m)o(y)h(wife)h(Brenda)f(and)g(our)g(c)o(hildren.)27 b(When)17 b(I)h -(b)q(egan)f(m)o(y)f(do)q(ctoral)37 98 y(program,)h(I)h(w)o(as)e(32)h(y)o(ears) -g(old,)h(married,)f(and)h(the)f(father)g(of)g(sev)o(eral)h(presc)o(ho)q(ol)g -(aged)f(c)o(hildren.)28 b(The)37 154 y(transition)16 b(to)f(graduate)f(sc)o -(ho)q(ol)i(w)o(as)e(an)h(adjustmen)o(t)g(for)f(all)i(of)f(us.)108 211 y(I)d -(thank)g(m)o(y)f(c)o(hildren)j(Da)o(vid,)e(Andrew,)g(Jamie)h(and)f(Daniel)h -(for)e(man)o(y)g(encouraging)i(times)f(together,)37 267 y(and)k(for)e(lo)o -(ving)i(me)g(more)e(for)h(who)g(I)g(am)g(than)g(for)g(what)f(I'v)o(e)i(done.) -108 324 y(I)j(am)g(esp)q(ecially)i(thankful)f(to)e(m)o(y)g(wife)h(Brenda)h -(for)e(her)h(supp)q(ort)g(during)g(m)o(y)g(graduate)f(studies.)37 380 y(Witho\ -ut)i(her,)g(I)f(nev)o(er)g(w)o(ould)h(ha)o(v)o(e)f(made)g(it)g(through)g(the) -g(program.)31 b(As)19 b(a)g(wife)h(and)f(mother,)g(she)37 437 y(pic)o(k)o(ed) -14 b(up)g(the)f(slac)o(k)g(and)g(encouraged)g(me)g(in)h(an)f(extraordinary)f -(w)o(a)o(y)l(.)19 b(She)13 b(deserv)o(es)g(an)g(a)o(w)o(ard)f(at)g(least)37 -493 y(as)j(v)m(aluable)i(as)e(m)o(y)g(PhD.)108 550 y(Finally)l(,)g(I)f(am)g -(thankful)g(to)f(Go)q(d)h(for)f(ha)o(ving)h(gran)o(ted)f(me)g(the)h(skills)i -(and)e(opp)q(ortunities)g(that)f(made)37 606 y(this)j(p)q(ossible.)957 2760 y -(vi)g eop bop 728 374 a fd(T)-6 b(able)22 b(of)h(Con)n(ten)n(ts)37 596 y fh -(Chapter)37 698 y(1)43 b(In)o(tro)q(duction)i fk(:)22 b(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)96 b fl(1)106 754 y -(1.1)45 b(The)16 b(Problem)37 b fk(:)23 b(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)60 b fl(1)106 811 y(1.2)45 b(A)15 b(Prop)q -(osed)h(Solution)28 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)h(:)60 b fl(1)106 867 y(1.3)45 b(Con)o(tributions)24 b fk(:)f(:)f(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)60 b fl(5)37 -969 y fh(2)43 b(Motiv)m(ation)k fk(:)23 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)96 b fl(6)106 1026 y(2.1)45 b(Bac) -o(kground:)20 b(Soft)o(w)o(are)14 b(Reuse)45 b fk(:)22 b(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)h(:)60 b fl(6)106 1082 y(2.2)45 b(Bac)o(kground:)20 b(Soft)o(w)o -(are)14 b(Restructuring)29 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)60 b fl(7)106 1139 -y(2.3)45 b(Ob)s(ject-Orien)o(ted)17 b(Programming,)d(Reuse)i(and)f(Restructur\ -ing)h fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)60 b fl(8) -37 1241 y fh(3)43 b(Refactoring)19 b(Application)g(F)l(ramew)o(orks)g fk(:)j -(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)73 b fl(12)106 1297 y(3.1)45 b(Ob)s(ject-Orien)o(ted)17 b(Appl\ -ication)g(F)l(ramew)o(orks)39 b fk(:)22 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(12)106 1353 y(3.2)45 b -(Refactoring)16 b(T)l(o)f(Generalize:)21 b(Creating)15 b(An)g(Abstract)g(Sup) -q(erclass)46 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(13)106 -1410 y(3.3)45 b(Refactoring)16 b(T)l(o)f(Sp)q(ecialize:)23 b(Sub)q(classing) -17 b(and)e(Simplifying)j(Conditionals)35 b fk(:)23 b(:)f(:)g(:)h(:)f(:)h(:)37 -b fl(15)106 1466 y(3.4)45 b(Capturing)16 b(Aggregations)e(and)h(Comp)q(onen)o -(ts)36 b fk(:)22 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(17)106 1523 y(3.5)45 b(Supp)q(orting)16 b -(Refactorings)28 b fk(:)22 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 -b fl(22)106 1579 y(3.6)45 b(Language)15 b(F)l(eatures)g(in)h(Refactoring)h fk -(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(24)106 1636 y(3.7)45 b(Summary:)20 -b(Imp)q(ortance)15 b(&)h(Complexit)o(y)g(of)e(Refactoring)35 b fk(:)23 b(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(25)37 1738 y fh -(4)43 b(Preserving)16 b(Beha)o(vior)h(During)h(Refactoring)43 b fk(:)22 b(:)h -(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)73 -b fl(26)106 1794 y(4.1)45 b(Program)14 b(Prop)q(erties)i(and)f(Beha)o(vior)g -(Preserv)m(ation)36 b fk(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(26)106 1851 y(4.2)45 b(Domains)15 b(of)g -(Refactorings)23 b fk(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl -(30)106 1907 y(4.3)45 b(F)l(unctions)16 b(F)l(or)f(Describing)h(Preconditions) -45 b fk(:)22 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(32)106 1963 y(4.4)45 b(Summary)37 b fk(:) -22 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)h(:)37 b fl(37)37 2065 y fh(5)43 b(Lo)o(w-Lev)o(el)17 b(Refactorings)46 b -fk(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)73 b fl(38)106 2122 y -(5.1)45 b(Creating)15 b(a)g(Program)f(En)o(tit)o(y)42 b fk(:)23 b(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(39)106 2178 y(5.2)45 b(Deleting)16 b(a)f -(Program)f(En)o(tit)o(y)f fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h -(:)37 b fl(41)106 2235 y(5.3)45 b(Changing)16 b(a)f(Program)e(En)o(tit)o(y)25 -b fk(:)e(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(42)106 2291 y(5.4)45 b -(Mo)o(ving)15 b(a)g(Mem)o(b)q(er)g(V)l(ariable)39 b fk(:)23 b(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)h(:)37 b fl(51)106 2348 y(5.5)45 b(Comp)q(osite)15 b(Refac\ -torings)38 b fk(:)22 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl -(52)37 2450 y fh(6)43 b(Refactoring)19 b(T)l(o)e(Generalize:)24 b(Creating)18 -b(an)g(Abstract)g(Sup)q(erclass)11 b fk(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)73 b fl(56)106 2506 y(6.1)45 b(Creating)15 b(a)g(Common)g(Sup)q(erclass)27 -b fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(58)106 2562 y(6.2)45 b(Mak\ -ing)15 b(F)l(unction)h(Signatures)g(Compatible)23 b fk(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl -(59)950 2760 y(vii)g eop bop 106 42 a fl(6.3)45 b(Adding)17 b(F)l(unction)f -(Signatures)f(to)g(the)g(Sup)q(erclass)i(Proto)q(col)d fk(:)22 b(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(63)106 98 y(6.4)45 b(Makin\ -g)15 b(F)l(unction)h(Bo)q(dies)h(Compatible)27 b fk(:)22 b(:)h(:)f(:)g(:)h -(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h -(:)37 b fl(64)106 154 y(6.5)45 b(Making)15 b(V)l(ariables)i(Compatible)26 b fk -(:)c(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(66)106 211 y(6.6)45 b(Migratin\ -g)15 b(V)l(ariables)i(to)d(the)h(Sup)q(erclass)46 b fk(:)23 b(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 -b fl(67)106 267 y(6.7)45 b(Migrating)15 b(Common)g(Co)q(de)g(to)g(the)g(Abstr\ -act)f(Sup)q(erclass)26 b fk(:)d(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)h(:)37 b fl(67)106 324 y(6.8)45 b(Discussion)22 b fk(:)g(:)g(:)h -(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl -(69)37 426 y fh(7)43 b(Refactoring)19 b(T)l(o)e(Sp)q(ecialize:)26 b(Sub)q(cla\ -ssing,)18 b(and)g(Simplifying)h(Conditionals)29 b fk(:)23 b(:)f(:)73 b fl(71) -106 482 y(7.1)45 b(Motiv)m(ation)h fk(:)22 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(71)106 539 y(7.2)45 b(Clas\ -s)15 b(In)o(v)m(arian)o(ts)j fk(:)k(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(72)106 595 y(7.3)45 b(Bac)o(kground:)20 b -(Data)14 b(Flo)o(w)h(Analysis)26 b fk(:)d(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl -(74)106 652 y(7.4)45 b(Chec)o(king)16 b(Whether)f(a)g(Predicate)h(is)g(a)f -(Class)g(In)o(v)m(arian)o(t)33 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(76)106 708 y(7.5)45 b(Refactoring:)20 b -(Create)15 b(Sub)q(classes)i(and)e(Assign)h(In)o(v)m(arian)o(ts)e fk(:)23 b -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(77)106 764 -y(7.6)45 b(Using)16 b(A)f(Class)g(In)o(v)m(arian)o(t)h(T)l(o)f(Simplify)i(A)e -(Conditional)24 b fk(:)e(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)h(:)37 b fl(79)106 821 y(7.7)45 b(Refactoring:)20 b(Migrate)15 b(&)g -(Simplify)j(Conditionals)23 b fk(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(80)106 877 y(7.8)45 b(Using)16 b -(A)f(Class)g(In)o(v)m(arian)o(t)h(T)l(o)f(Sp)q(ecialize)j(Expressions)e(That) -f(Create)f(Instances)43 b fk(:)23 b(:)f(:)h(:)37 b fl(81)106 934 y(7.9)45 b -(Refactoring:)20 b(Sp)q(ecialize)f(Expressions)c(That)g(Create)g(Instances)20 -b fk(:)j(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(82)106 990 y -(7.10)22 b(Discussion)g fk(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(83)37 1092 y fh(8)43 b(Refactoring) -19 b(T)l(o)e(Capture)h(Aggregations)g(&)f(Comp)q(onen)o(ts)27 b fk(:)22 b(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)73 b fl(86)106 1149 y(8.1)45 b(Mot\ -iv)m(ation)h fk(:)22 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)h(:)37 b fl(86)106 1205 y(8.2)45 b(Chec)o(king)16 b(If)g -(A)f(V)l(ariable)h(Quali\014es)h(As)f(A)f(Comp)q(onen)o(t)36 b fk(:)22 b(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(87)106 1262 -y(8.3)45 b(Adding)17 b(A)e(Mem)o(b)q(er)g(V)l(ariable)h(T)l(o)f(The)h(Set)f -(Of)g(Comp)q(onen)o(t)g(V)l(ariables)28 b fk(:)22 b(:)g(:)h(:)f(:)g(:)h(:)f -(:)h(:)37 b fl(91)106 1318 y(8.4)45 b(Remo)o(ving)16 b(A)f(Mem)o(b)q(er)g(V)l -(ariable)i(F)l(rom)d(The)i(Set)f(Of)g(Comp)q(onen)o(t)g(V)l(ariables)29 b fk -(:)22 b(:)g(:)h(:)f(:)h(:)37 b fl(92)106 1374 y(8.5)45 b(Mo)o(ving)15 b(Mem)o -(b)q(ers)g(in)o(to)g(a)g(Comp)q(onen)o(t)g(\(P)o(oin)o(ter)g(to)f(Aggregate)g -(Stored)h(in)h(Comp)q(onen)o(t\))29 b(92)106 1431 y(8.6)45 b(Mo)o(ving)15 b -(Mem)o(b)q(ers)g(in)o(to)g(a)g(Comp)q(onen)o(t)g(\(Aggregate)f(P)o(assed)h -(as)g(F)l(unction)h(Argumen)o(t\))26 b fk(:)37 b fl(97)106 1487 y(8.7)45 b -(Mo)o(ving)15 b(Mem)o(b)q(ers)g(in)o(to)g(Aggregate\(s\))h fk(:)22 b(:)g(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)h(:)37 b fl(99)106 1544 y(8.8)45 b(Discussion:)21 b(Comp)q(onen)o -(ts)15 b(and)h(Refactoring)f(\(Revisited\))22 b fk(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(102)106 1600 y(8.9)45 b(Con)o -(v)o(erting)15 b(an)g(Asso)q(ciation,)h(Mo)q(deled)g(Using)g(Inheritance,)g -(in)o(to)f(an)g(Aggregation)23 b fk(:)f(:)h(:)14 b fl(103)106 1657 y(8.10)22 b -(Discussion)g fk(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)h(:)14 b fl(106)37 1759 y fh(9)43 b(Examples)f fk(:)22 b -(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)50 b fl(108)106 1815 y(9.1)45 b(Generalizing)17 b(&)f(Sp)q(ecializin)q -(g:)22 b(Men)o(u)15 b(Planning)i(Example)40 b fk(:)22 b(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(108)106 1872 y(9.2)45 b(Con)o(v)o -(erting)15 b(to)f(an)i(Aggregation:)j(Matrix)14 b(Example)19 b fk(:)k(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(112) -106 1928 y(9.3)45 b(Summary)37 b fk(:)22 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(116)37 2030 y fh(10)j -(Related)i(Approac)o(hes)12 b fk(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)50 b fl(118)106 2086 y(10.1)22 b(CR)o(C)15 b(Approac)o -(h)g(to)g(Designing)h(Ob)s(ject-Orien)o(ted)h(Systems)27 b fk(:)22 b(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(118)106 2143 y(10.2)22 -b(Designing)16 b(Reusable)h(Classes)37 b fk(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)h(:)14 b fl(119)106 2199 y(10.3)22 b(Ac)o(hieving)17 b(Go)q(o)q -(d)e(St)o(yle)h(in)g(Smalltalk)g(Programs)38 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(119)106 2256 y -(10.4)22 b(Demeter)15 b(Pro)s(ject)38 b fk(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(119)106 2312 y(10.5)22 b(Reorganiz\ -ing)17 b(Generic)f(Applications:)22 b(Ithaca)16 b fk(:)22 b(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl -(121)106 2369 y(10.6)22 b(Managing)15 b(Sc)o(hema)g(Ev)o(olution)h(in)g(an)f -(OODB)27 b fk(:)22 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(122)106 2425 y(10.7)22 b(Program)14 b(T)l -(ransformations)33 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 -b fl(123)106 2482 y(10.8)22 b(Summary)37 b fk(:)22 b(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(124)944 2760 y -(viii)g eop bop 37 42 a fh(11)17 b(Conclusions)26 b fk(:)d(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)50 b fl(125) -106 98 y(11.1)22 b(Summary)15 b(of)g(Con)o(tributions)f fk(:)22 b(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(125)106 154 y(11.2)22 b(Limitations)17 -b(of)d(Approac)o(h)24 b fk(:)e(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h -(:)14 b fl(125)106 211 y(11.3)22 b(Implemen)o(tation)17 b(Considerations)30 b -fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(126)106 267 y(11.4)22 b(Other) -16 b(Areas)f(for)f(F)l(uture)h(Researc)o(h)35 b fk(:)23 b(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f -(:)h(:)14 b fl(131)106 324 y(11.5)22 b(Summary)37 b fk(:)22 b(:)g(:)h(:)f(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(131)37 -465 y fh(Bibliograph)o(y)38 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)50 b fl(134)37 567 y fh(Vita) -19 b fk(:)j(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)50 b fl(142)957 2760 y(ix)g eop bop -776 374 a fd(List)22 b(of)i(Figures)106 596 y fl(3.1)45 b(Creating)15 b(An)h -(Abstract)e(Sup)q(erclass)32 b fk(:)23 b(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl -(14)106 653 y(3.2)45 b(Simplifying)18 b(Mem)o(b)q(er)d(F)l(unction)h fi(optim\ -ize)j fk(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(18)106 709 y(3.3)45 b(Sup)q(erclass)17 b -(Con)o(v)o(erted)d(to)h(Comp)q(onen)o(t)32 b fk(:)22 b(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 -b fl(21)106 807 y(4.1)45 b(Erroneous)15 b(Renaming)h(Of)g(Mem)o(b)q(er)f(F)l -(unction)h(F2)i fk(:)k(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)h(:)37 b fl(27)106 905 y(6.1)45 b(Refactoring)16 b(The)f -(F)l(unction)h fi(mapUnit)23 b fk(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(57)106 961 -y(6.2)45 b(De\014ning)16 b(the)g(Sup)q(erclass)g(Proto)q(col)37 b fk(:)23 b -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g -(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl(61)106 1059 y(7.1)45 b(Simplifying)18 b -(Mem)o(b)q(er)d(F)l(unction)h fi(optimize)j fk(:)k(:)f(:)g(:)h(:)f(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b fl -(74)106 1157 y(8.1)45 b(Class)15 b ff(GraphicalObject)j fl(and)d(its)h(Sub)q -(classes)33 b fk(:)22 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h -(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(103)106 1214 y(8.2)45 b ff(Graphic\ -alObject)18 b fl(and)d ff(ArchitecturalObject)p fl(,)j(After)d(Refactoring)27 -b fk(:)c(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(103)106 1270 y -(8.3)45 b(Migrating)15 b(Mem)o(b)q(ers)g(Bet)o(w)o(een)g(Aggregate)g(and)g -(Comp)q(onen)o(t)g(Classes)44 b fk(:)22 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b -fl(107)106 1368 y(9.1)45 b(Inheritance)17 b(Relationship)h(Bet)o(w)o(een)d -(Classes)g ff(Tw)o(oDim)o(ensionalArra)o(y)d fl(and)k ff(Matrix)48 b fk(:)22 b -(:)h(:)14 b fl(113)106 1466 y(11.1)22 b(Soft)o(w)o(are)14 b(Refactoring)h(Pro) -q(cess)38 b fk(:)22 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)14 b fl(133)963 2760 y -(x)g eop bop 37 353 a fc(Chapter)35 b(1)37 560 y fb(In)m(tro)s(duction)37 801 -y fd(1.1)70 b(The)23 b(Problem)37 903 y fl(Design)15 b(is)f(hard.)20 b(The)14 -b(design)h(of)f(reusable)h(soft)o(w)o(are)d(is)j(esp)q(ecially)h(hard.)k(Reus\ -able)15 b(soft)o(w)o(are)e(usually)i(is)37 959 y(the)g(result)f(of)g(man)o -(y)f(design)i(iterations.)20 b(Some)14 b(of)g(these)g(iterations)g(o)q(ccur)h -(after)e(the)h(soft)o(w)o(are)e(has)i(b)q(een)37 1016 y(reused,)k(and)e(the)h -(resulting)g(c)o(hanges)g(a\013ect)f(not)g(only)h(the)g(design)g(of)f(the)h -(reusable)g(soft)o(w)o(are,)e(but)h(also)37 1072 y(the)d(design)f(of)g(other) -f(soft)o(w)o(are)g(that)g(is)h(using)h(it.)19 b(Making)12 b(soft)o(w)o(are)e -(easier)i(to)g(c)o(hange)f(mak)o(es)h(subsequen)o(t)37 1128 y(design)17 b(ite\ -rations)e(easier,)g(and)h(mak)o(es)e(the)i(soft)o(w)o(are)d(more)i(reusable.) -108 1185 y(Although)k(there)f(ha)o(v)o(e)f(b)q(een)i(no)f(scien)o(ti\014c)i -(studies)e(that)g(v)m(alidate)h(the)f(claim,)h(it)f(is)h(nonetheless)g(a)37 -1241 y(strongly)g(held)h(conclusion)h(among)e(man)o(y)f(practitioners)i(that) -e(ob)s(ject-orien)o(ted)h(soft)o(w)o(are)e(is)j(easier)f(to)37 1298 y(c)o(han\ -ge)c(than)e(con)o(v)o(en)o(tional)i(soft)o(w)o(are)d([79)o(].)19 b(Some)14 b -(c)o(hanges)g(to)f(ob)s(ject-orien)o(ted)h(soft)o(w)o(are)f(can)h(b)q(e)g(mad\ -e)37 1354 y(simply)i(b)o(y)d(adding)i(new)f(sub)q(classes)h(or)e(b)o(y)h(addi\ -ng)h(new)f(op)q(erations)g(on)f(existing)i(classes,)f(while)i(lea)o(ving)37 -1411 y(most)f(of)g(the)g(original)h(soft)o(w)o(are)e(unc)o(hanged.)108 1467 y -(Ho)o(w)o(ev)o(er,)i(ob)s(ject-orien)o(ted)h(soft)o(w)o(are)e(is)j(harder)f -(to)f(c)o(hange)h(than)g(it)g(migh)o(t)g(at)f(\014rst)h(app)q(ear)g(to)f(b)q -(e.)37 1524 y(Changing)h(an)g(ob)s(ject-orien)o(ted)g(system)f(often)g(requir\ -es)i(c)o(hanging)f(the)f(abstractions)h(em)o(b)q(o)q(died)h(in)f fi(ex-)37 -1580 y(isting)12 b fl(ob)s(ject)g(classes)h(and)g(the)g(relationships)h(among) -e(those)h(classes.)19 b(This)14 b(in)o(v)o(olv)o(es)f(structural)f(c)o(hanges) -37 1637 y(suc)o(h)20 b(as)e(mo)o(ving)h(v)m(ariables)h(and)f(functions)h(b)q -(et)o(w)o(een)f(classes)g(and)h(partitioning)f(a)g(complicated)h(class)37 1693 -y(in)o(to)13 b(sev)o(eral)g(classes.)19 b(When)13 b(a)g(structural)f(c)o(hang\ -e)h(is)g(made)f(to)g(a)h(class)g(or)f(set)g(of)g(classes,)h(corresp)q(onding) -37 1749 y(c)o(hanges)18 b(ma)o(y)f(also)h(b)q(e)g(needed)h(elsewhere)g(in)f -(a)g(program,)e(due)j(to)e(naming,)h(t)o(yping)g(and)f(scoping)i(\(in-)37 1806 -y(heritance\))f(dep)q(endencies.)27 b(T)l(rac)o(king)16 b(do)o(wn)h(the)f(dep) -q(endencies)k(b)o(y)c(hand)h(and)g(consisten)o(tly)g(up)q(dating)37 1862 y -(the)f(program)e(can)h(b)q(e)h(time)g(consuming,)f(di\016cult)i(and)e(error)g -(prone.)108 1919 y(The)i(reusabilit)o(y)g(b)q(ene\014ts)g(of)f(ob)s(ject-orie\ -n)o(ted)h(programming)e(can)i(b)q(e)g(di\016cult)g(to)f(realize)h(without)37 -1975 y(some)e(form)g(of)g(automated)f(supp)q(ort)h(for)g(making)g(these)h(str\ -uctural)f(c)o(hanges)g([59)o(,)g(98)o(].)37 2118 y fd(1.2)70 b(A)23 b(Prop)r -(osed)h(Solution)37 2220 y fl(This)16 b(dissertation)g(describ)q(es)h(an)e -(approac)o(h)f(for)h(pro)o(viding)h(automated)e(supp)q(ort)i(for)e(the)h(rest\ -ructuring)37 2276 y(of)g(ob)s(ject-orien)o(ted)h(programs.)108 2333 y(P)o(eop\ -le)e(usually)g(think)f(ab)q(out)g(soft)o(w)o(are)e(c)o(hanges)i(either)g(at)f -(a)h(high)h(lev)o(el,)g(in)g(terms)e(of)g(features)h(to)f(b)q(e)37 2389 y(add\ -ed)17 b(to)e(a)h(system,)f(or)g(at)g(a)g(lo)o(w)h(lev)o(el,)h(in)g(terms)e -(of)g(lines)j(of)d(co)q(de)h(to)f(b)q(e)i(c)o(hanged.)22 b fi(R)n(efactorings) -15 b fl(are)37 2446 y(reorganization)h(plans)h(that)e(supp)q(ort)i(c)o(hange) -f(at)f(an)h(in)o(termediate)h(lev)o(el.)23 b(Consider,)16 b(for)g(example,)g -(the)37 2502 y(refactoring)g(that)f(mo)o(v)o(es)g(a)g(mem)o(b)q(er)h(function) -h(from)e(one)h(class)g(to)f(another.)21 b(The)16 b(reason)g(for)f(applying)37 -2559 y(this)j(refactoring)f(migh)o(t)g(b)q(e)h(to)f(supp)q(ort)g(a)g(new)g -(feature)g(in)h(the)g(system,)f(whic)o(h)h(will)h(b)q(e)f(implemen)o(ted)964 -2760 y(1)g eop bop 37 42 a fl(using)20 b(a)d(class)i(for)f(whic)o(h)h(the)f -(mem)o(b)q(er)h(function)g(is)g(needed.)30 b(This)19 b(refactoring)f(maps)g -(in)o(to)g(lo)o(w)g(lev)o(el)37 98 y(c)o(hanges)d(not)f(only)g(in)h(these)g -(t)o(w)o(o)e(classes)h(but)h(p)q(ossibly)h(also)e(in)h(other)f(classes)g(that) -g(in)o(v)o(ok)o(e)g(the)g(mem)o(b)q(er)37 154 y(function.)108 211 y(Refactori\ -ngs)f(do)g(not)f(c)o(hange)h(the)g(b)q(eha)o(vior)h(of)e(a)h(program;)f(that) -g(is,)h(if)h(the)f(program)e(is)j(called)g(t)o(wice)37 267 y(\(b)q(efore)i -(and)h(after)e(a)h(refactoring\))f(with)h(the)g(same)g(set)g(of)f(inputs,)i -(the)f(resulting)h(set)f(of)g(output)f(v)m(alues)37 324 y(will)20 b(b)q(e)e -(the)g(same.)27 b(Refactorings)18 b(are)g(b)q(eha)o(vior)g(preserving)g(so)g -(that,)f(when)h(their)h(preconditions)g(are)37 380 y(met,)c(they)g(do)g(not)g -(\\break")g(the)g(program.)108 437 y(While)22 b(refactorings)d(do)h(not)g(c)o -(hange)g(the)g(b)q(eha)o(vior)h(of)f(a)g(program,)g(they)g(can)g(supp)q(ort)g -(soft)o(w)o(are)37 493 y(design)12 b(and)f(ev)o(olution)g(b)o(y)g(restructuri\ -ng)f(a)h(program)e(in)j(the)e(w)o(a)o(y)g(that)g(allo)o(ws)g(other)h(c)o(hang\ -es)f(to)g(b)q(e)h(made)37 550 y(more)18 b(easily)l(.)30 b(Complicated)19 b -(c)o(hanges)f(to)f(a)h(program)f(can)h(require)h(b)q(oth)f(refactorings)g(and) -g(additions.)37 606 y(F)l(or)c(example,)h(a)e(new)i(feature)e(migh)o(t)h(b)q -(e)h(added)g(to)e(a)h(program)f(b)o(y)h(\014rst)f(refactoring)h(part)f(of)h -(a)g(complex)37 663 y(class)i(in)o(to)f(a)g(comp)q(onen)o(t)g(class,)h(and)f -(then)h(using)f(the)h(comp)q(onen)o(t)f(class)h(in)g(de\014ning)g(the)g(new)f -(feature.)108 719 y(There)h(are)e(sev)o(eral)i(cases)f(where)g(refactorings)g -(migh)o(t)g(b)q(e)h(applied)h([85)o(]:)93 813 y(1.)22 b fi(Extr)n(acting)17 b -(a)g(r)n(eusable)f(c)n(omp)n(onent.)21 b fl(F)l(or)15 b(example,)i(an)f(indus\ -trial)h(pro)q(cess)f(con)o(trol)g(system)f(had)151 869 y(serv)o(ed)e(user)h -(needs)g(w)o(ell)g(for)f(sev)o(eral)g(y)o(ears.)19 b(Customers)12 b(require)i -(a)f(new)h(pro)q(duct)f(to)g(supp)q(ort)g(new)151 926 y(pro)q(cess)18 b(appro\ -ac)o(hes,)f(but)h(with)g(a)f(user)h(in)o(terface)f(that)g(is)h(compatible)h -(with)f(the)f(older)h(system.)151 982 y(When)12 b(the)f(older)h(system)f(w)o -(as)f(originally)j(designed)f(and)g(implemen)o(ted,)h(it)f(w)o(as)e(factored) -h(suc)o(h)g(that)151 1039 y(the)19 b(user)f(in)o(terface)h(functions)g(w)o -(ere)f(in)o(terw)o(o)o(v)o(en)f(with)i(other,)f(obsolete)h(functions.)30 b -(Extracting)151 1095 y(the)15 b(user)h(in)o(terface)f(comp)q(onen)o(t)h(\014r\ -st)e(requires)i(refactoring)f(the)g(existing)i(soft)o(w)o(are.)93 1189 y(2.) -22 b fi(Impr)n(oving)c(c)n(onsistency)g(among)h(c)n(omp)n(onents.)28 b fl(F)l -(or)17 b(example,)j(t)o(w)o(o)c(comp)q(onen)o(ts)j(of)e(a)h(soft)o(w)o(are) -151 1245 y(system)j(are)f(implemen)o(ted)j(b)o(y)e(di\013eren)o(t)g(pro)s(jec\ -t)f(mem)o(b)q(ers.)37 b(While)23 b(these)e(comp)q(onen)o(ts)g(w)o(ere)151 1302 -y(initially)g(though)o(t)d(to)f(b)q(e)i(distinct,)h(it)e(w)o(as)g(later)g(dis\ -co)o(v)o(ered)h(that)e(they)h(shared)h(a)f(common)f(ab-)151 1358 y(straction.) -25 b(T)l(o)17 b(mak)o(e)f(the)h(design)h(of)f(the)g(system)g(easier)g(to)f -(understand,)i(and)f(to)g(reduce)g(future)151 1415 y(main)o(tenance)g(costs,) -f(it)h(is)f(desirable)i(to)e(refactor)g(the)g(system)g(to)g(mak)o(e)g(more)g -(explicit)i(the)f(com-)151 1471 y(monalities)g(b)q(et)o(w)o(een)e(the)g(t)o -(w)o(o)f(comp)q(onen)o(ts.)93 1565 y(3.)22 b fi(Supp)n(orting)15 b(the)g(iter) -n(ative)g(design)g(of)g(an)g(Obje)n(ct-Oriente)n(d)f(Applic)n(ation)g(F)m(r)n -(amework.)20 b fl(An)14 b(ob)s(ject-)151 1621 y(orien)o(ted)k(application)h -(framew)o(ork)e(is)h(an)f(abstract)g(design)i(of)e(an)g(application,)j(consis\ -ting)e(of)g(an)151 1678 y(abstract)c(class)g(for)g(eac)o(h)h(ma)s(jor)e(comp) -q(onen)o(t.)20 b(It)14 b(is)h(an)g(imp)q(ortan)o(t)f(ob)s(ject-orien)o(ted)g -(tec)o(hnique)i(to)151 1734 y(facilitate)f(design-lev)o(el)i(reuse)d([127)o -(].)19 b(Go)q(o)q(d)14 b(framew)o(orks)e(are)i(usually)h(the)f(result)g(of)g -(man)o(y)g(design)151 1791 y(iterations)i(and)f(a)g(lot)g(of)g(hard)g(w)o(ork\ -,)f(in)o(v)o(olving)i(structural)f(c)o(hanges.)151 1866 y(F)l(or)j(example,)i -(the)f(application)i(framew)o(ork)c(for)h(managing)h(\014les)g(in)h(an)f(op)q -(erating)f(system)h([77)o(])151 1922 y(b)q(egan)i(as)g(an)f(implemen)o(tation) -j(of)d(only)h(one)g(\014le)h(format.)35 b(Then,)23 b(it)e(w)o(as)f(to)g(b)q -(e)h(extended)h(to)151 1979 y(handle)h(additional)g(\014le)f(formats.)37 b -(Unfortunately)l(,)23 b(in)g(the)e(initial)j(implemen)o(tation)e(the)g(more) -151 2035 y(general,)e(common)e(abstractions)g(w)o(ere)g(in)o(tert)o(wined)h -(with)g(features)f(sp)q(eci\014c)j(to)d(the)g(\014le)i(format)151 2092 y(supp) -q(orted.)i(Refactoring)17 b(w)o(as)e(necessary)h(to)f(separate)g(out)g(the)h -(common)g(abstractions)f(in)i(order)151 2148 y(to)e(impro)o(v)o(e)g(the)g(des\ -ign)h(of)f(the)g(framew)o(ork)f(and)h(facilitate)i(reuse.)108 2242 y(The)i -(researc)o(h)f(describ)q(ed)i(here)f(fo)q(cused)g(on)g(the)f(third)h(area;)g -(namely)l(,)h(in)f(ho)o(w)f(these)h(refactorings)37 2298 y(can)j(supp)q(ort)g -(the)g(iterativ)o(e)g(design)g(of)g(ob)s(ject-orien)o(ted)f(application)j(fra\ -mew)o(orks.)38 b(The)21 b(other)h(t)o(w)o(o)37 2355 y(areas)13 b(are)h(co)o -(v)o(ered)f(as)g(w)o(ell,)i(since)g(as)e(a)g(framew)o(ork)f(matures)h(reusabl\ -e)i(comp)q(onen)o(ts)f(are)f(extracted)g(and)37 2411 y(consistency)k(among)d -(comp)q(onen)o(ts)h(is)h(impro)o(v)o(ed.)108 2468 y(There)h(are)g(sev)o(eral) -g(reasons)g(wh)o(y)f(this)i(researc)o(h)e(has)h(fo)q(cuses)h(on)e(refactoring) -h fi(obje)n(ct-oriente)n(d)g fl(sys-)37 2524 y(tems:)964 2760 y(2)g eop bop 93 -42 a fl(1.)22 b(Compared)17 b(with)g(more)g(traditional)h(soft)o(w)o(are)d -(dev)o(elopmen)o(t)j(approac)o(hes,)f(ob)s(ject-orien)o(ted)h(pro-)151 98 y -(gramming)e(mak)o(es)h(refactoring)f fi(mor)n(e)i(fe)n(asible)d fl(b)o(y)i -(making)g(more)f(explicit)j(the)d(structural)h(infor-)151 154 y(mation)e(need\ -ed)i(to)d(refactor)g(a)h(program.)93 248 y(2.)22 b(Refactoring)16 b(is)g fi -(esp)n(e)n(cial)r(ly)g(imp)n(ortant)g fl(in)h(ob)s(ject-orien)o(ted)f(program\ -ming.)21 b(Some)15 b(in)i(the)f(ob)s(ject-)151 305 y(orien)o(ted)i(programmin\ -g)e(culture)i(ha)o(v)o(e)f(placed)h(high)g(v)m(alue)g(in)g(designing)g(and)g -(redesigning)g(soft-)151 361 y(w)o(are)j(to)f(mak)o(e)h(it)g(more)g(reusable) -h([59)o(,)f(98)o(].)38 b(In)22 b(some)f(cases,)h(the)f(b)q(est)h(w)o(a)o(y)e -(to)g(impro)o(v)o(e)h(the)151 418 y(design)15 b(of)e(a)g(program)f(is)i(to)f -(re-write)h(it.)19 b(In)14 b(other)f(cases,)h(restructuring)f(a)h(program)e -(\(rather)h(than)151 474 y(rewriting)j(it\))f(ma)o(y)f(b)q(e)i(a)f(more)g(pra\ -ctical)h(w)o(a)o(y)e(to)h(impro)o(v)o(e)g(its)g(design.)37 596 y fe(1.2.1)56 b -(Dealing)17 b(With)i(the)f(Complexitie)o(s)e(of)j(Refactoring)37 682 y fl(The\ -re)d(are)f(sev)o(eral)g(asp)q(ects)h(that)e(mak)o(e)h(refactoring)f(ob)s(ject\ --orien)o(ted)i(framew)o(orks)d(di\016cult:)93 775 y(1.)22 b(There)f(is)h(no)f -(theory)f(\(i.e.)38 b(systematically)22 b(organized)f(explanation\))h(of)e -(ho)o(w)h(p)q(eople)h(refactor)151 832 y(ob)s(ject-orien)o(ted)15 b(applicati\ -on)i(framew)o(orks)d(and)h(the)h(kinds)g(of)f(refactorings)f(they)i(mak)o(e.) -93 926 y(2.)22 b(Some)15 b(refactoring)f(op)q(erations)g(require)h(design)h -(insigh)o(ts)f(that)e(are)h(hard)h(to)f(obtain)g(b)o(y)g(insp)q(ecting)151 982 -y(the)h(program)f(to)h(b)q(e)h(refactored.)93 1076 y(3.)22 b(Tw)o(o)16 b(\(co\ -n\015icting\))i(ob)s(jectiv)o(es)f(of)f(a)h(set)f(of)h(refactorings)f(are)h -(that)f(they)h(b)q(e)h(b)q(oth)f(b)q(eha)o(vior)g(pre-)151 1132 y(serving)12 b -(and)g(expressiv)o(e.)19 b(They)12 b(should)h(b)q(e)f(p)q(o)o(w)o(erful)g(eno\ -ugh)g(to)f(handle)i(the)e(imp)q(ortan)o(t)h(program)151 1189 y(restructuring) -17 b(tasks)g(at)f(a)h(lev)o(el)i(that)d(shields)j(the)e(user)g(from)g(most)f -(of)h(the)g(complexit)o(y)l(.)27 b(A)o(t)16 b(the)151 1245 y(same)j(time,)g -(they)g(should)h(b)q(e)f(restrictiv)o(e)g(enough)h(to)e(preserv)o(e)h(the)f -(b)q(eha)o(vior)i(of)e(the)h(program.)151 1302 y(In)14 b(shielding)j(complexi\ -t)o(y)d(from)f(the)h(user,)g(the)g(refactorings)f(themselv)o(es)h(b)q(ecome)h -(more)e(complex.)151 1358 y(These)22 b(complexities,)i(and)d(the)g(limitation\ -s)h(in)g(inferring)g(design)g(in)o(ten)o(t,)h(mak)o(e)d(it)i(di\016cult)g(to) -151 1415 y(ensure)16 b(that)e(the)i(in)o(tended)g(b)q(eha)o(vior)g(is)g(prese\ -rv)o(ed.)108 1508 y(A)d(to)q(ol)g(that)f(pro)o(vides)h(automated)e(supp)q(ort) -i(for)f(refactoring)h(should)g(guaran)o(tee)f(that)g(its)h(op)q(erations)37 -1565 y(preserv)o(e)g(the)g(b)q(eha)o(vior)h(of)e(a)g(program.)18 b(One)c(of)e -(the)h(reasons)g(wh)o(y)f(programs)g(are)g(not)h(refactored)f(is)h(that)37 -1621 y(an)o(y)g(c)o(hange)g(to)f(the)h(program)f(runs)h(the)g(risk)g(of)g(in) -o(tro)q(ducing)h(defects)f(in)o(to)g(the)g(program.)18 b(An)13 b(imp)q(ortan) -o(t)37 1678 y(fo)q(cus)i(of)e(this)i(thesis)f(is)h(on)f(ho)o(w)g(to)f(tell)i -(whether)f(a)g(refactoring)g(can)g(b)q(e)g(applied)i(to)e(a)g(program)e(witho\ -ut)37 1734 y(c)o(hanging)17 b(the)f(program's)e(b)q(eha)o(vior.)23 b(A)16 b -(ma)s(jor)f(motiv)m(ation)h(for)f(automating)g(refactoring)h(is)h(to)e(ensure) -37 1791 y(that)g(defects)g(are)g(not)g(in)o(tro)q(duced)i(in)o(to)e(a)g(progr\ -am.)108 1847 y(A)d(refactoring)g(that)g(can)g(b)q(e)h(applied)h(safely)e(to)g -(a)g(program)f(will)j(not)e(necessarily)h(impro)o(v)o(e)f(its)h(design.)37 -1904 y(On)e(the)g(con)o(trary)l(,)f(applying)i(arbitrary)e(refactorings)g(to) -g(a)g(program)f(is)i(more)f(lik)o(ely)i(to)e(corrupt)g(the)h(design)37 1960 y -(rather)17 b(than)h(impro)o(v)o(e)f(it,)h(ev)o(en)g(though)g(the)f(b)q(eha)o -(vior)i(of)e(the)g(program)g(is)h(preserv)o(ed.)27 b(A)18 b(refactoring)37 -2017 y(impro)o(v)o(es)h(design)g(if)g(the)f(resultan)o(t)g(co)q(de)h(units)g -(corresp)q(ond)f(to)g(meaningful)i(abstractions)d(that)h(mak)o(e)37 2073 y -(it)h(easier)g(to)e(re\014ne)i(or)e(extend)i(the)f(program.)28 b(What)18 b -(abstractions)f(are)h(meaningful)i(dep)q(ends)f(on)f(the)37 2129 y(applicatio\ -n)13 b(and)e(on)f(the)h(designer.)19 b(This)12 b(implies)g(that)e(refactoring) -g(tasks,)h(esp)q(ecially)i(the)e(most)f(complex)37 2186 y(tasks,)19 b(require) -h(some)e(in)o(teraction)i(with)f(the)g(designer.)32 b(A)19 b(refactoring)f -(to)q(ol)h(can)g(help)h(a)f(designer)h(b)o(y)37 2242 y(pro)o(viding)13 b(the) -f(righ)o(t)g(set)f(of)g(refactorings,)h(and)g(b)o(y)g(ensuring)g(that)f(eac)o -(h)h(refactoring)g(is)g(applied)h(correctly)l(,)37 2299 y(but)23 b(it)g(canno\ -t)g(decide)h(whic)o(h)g(refactorings)e(to)g(apply)l(.)43 b(Th)o(us,)24 b(refa\ -ctoring)e(cannot)h(b)q(e)g(completely)37 2355 y(automated.)108 2412 y(T)l(o) -17 b(understand)i(ho)o(w)e(p)q(eople)i(refactor)d(programs,)h(related)h(resea\ -rc)o(h)f([9,)g(30)o(,)h(59)o(,)f(71,)g(98)o(])h(w)o(as)e(sur-)37 2468 y(v)o -(ey)o(ed,)22 b(and)e(an)h(analysis)g(w)o(as)f(done)g(of)g(the)h(structural)f -(c)o(hanges)g(made)h(to)f(the)g fi(Choic)n(es)f fl(\014le)j(system)37 2525 y -(framew)o(ork)13 b([77)o(])g(o)o(v)o(er)f(a)h(t)o(w)o(o)g(y)o(ear)g(p)q(erio) -q(d.)20 b(The)14 b fi(Choic)n(es)e fl(\014le)j(system)e(framew)o(ork)f(w)o -(as)h(dev)o(elop)q(ed)i(using)964 2760 y(3)g eop bop 37 42 a fl(the)16 b fi -(C++)e fl(programming)h(language)g([114)o(].)20 b(Based)15 b(on)g(that)g(anal\ -ysis,)g(the)h(follo)o(wing)g(set)f(of)f(eigh)o(t)i(basic)37 98 y(refactorings) -f(w)o(as)g(compiled)i([85)o(]:)648 81 y fs(1)93 185 y fl(1.)22 b(de\014ning) -17 b(an)e(abstract)f(sup)q(erclass)i(of)f(one)h(or)e(more)h(existing)h(classe\ -s)93 277 y(2.)22 b(sp)q(ecializin)q(g)17 b(a)e(class)g(b)o(y)g(de\014ning)i -(sub)q(classes,)e(and)g(using)h(sub)q(classing)h(to)d(eliminate)j(conditional) -151 333 y(tests)93 424 y(3.)22 b(c)o(hanging)17 b(ho)o(w)f(the)h(whole/part)g -(asso)q(ciation)g(b)q(et)o(w)o(een)g(classes)g(is)g(mo)q(deled,)h(from)e(usin\ -g)i(inheri-)151 481 y(tance)d(to)g(using)h(an)f(instance)h(hierarc)o(h)o(y)f -(of)g(aggregates)f(and)h(their)h(comp)q(onen)o(ts)93 572 y(4.)22 b(mo)o(ving) -15 b(a)g(class)h(within)g(and)f(among)g(inheritance)i(hierarc)o(hies)93 663 y -(5.)22 b(mo)o(ving)15 b(mem)o(b)q(er)h(v)m(ariables)g(and)f(functions)93 754 y -(6.)22 b(replacing)17 b(a)e(co)q(de)g(segmen)o(t)g(with)h(a)f(function)h(call) -93 846 y(7.)22 b(c)o(hanging)16 b(the)f(names)g(of)g(classes,)g(v)m(ariables) -i(and)e(functions)93 937 y(8.)22 b(replacing)17 b(unrestricted)f(access)f(to) -g(mem)o(b)q(er)g(v)m(ariables)i(with)e(a)g(more)g(abstract)f(in)o(terface)108 -1024 y(T)l(o)g(someone)g(in)o(terested)h(in)g(adding)g(new)f(features)g(to)f -(an)i(ob)s(ject-orien)o(ted)f(program,)f(some)g(of)h(these)37 1081 y(refactor\ -ings)k(ma)o(y)f(seem)h(lo)o(w)g(lev)o(el)h(and)f(not)g(particularly)h(di\016c\ -ult;)h(ho)o(w)o(ev)o(er,)e(these)g(refactorings)f(re-)37 1137 y(quire)i(atten) -o(tion)e(to)g(man)o(y)h(details)h(regarding)e(the)h(in)o(terrelationships)i -(of)d(parts)g(of)h(a)f(program.)26 b(Some)37 1194 y(of)17 b(these)h(refactori\ -ngs)e(emplo)o(y)i(other,)f(more)g(primitiv)o(e)h(refactorings.)26 b(F)l(or)16 -b(example,)i(de\014ning)h(an)e(ab-)37 1250 y(stract)11 b(sup)q(erclass)i(ma)o -(y)e(in)o(v)o(olv)o(e)i(c)o(hanging)f(the)g(name)g(of)g(mem)o(b)q(ers)g(\(v)m -(ariables)g(and)g(functions\),)h(splitting)37 1307 y(functions)k(and)g(migrat\ -ing)f(common)f(mem)o(b)q(ers)i(to)e(the)h(sup)q(erclass.)24 b(In)17 b(order)e -(to)h(b)q(etter)g(deal)h(with)f(the)37 1363 y(complexit)o(y)h(of)d(the)i(refa\ -ctoring)e(pro)q(cess,)h(the)h(refactorings)e(w)o(ere)h(organized)h(in)o(to:) -106 1450 y fj(\017)22 b fl(a)d(set)h(of)f(t)o(w)o(en)o(t)o(y)f(six)i fi(low-l\ -evel)f fl(refactorings,)h(suc)o(h)g(as)f(renaming)h(a)f(mem)o(b)q(er)h(v)m -(ariable.)34 b(These)151 1507 y(refactorings)15 b(are)g(de\014ned)h(in)g(c)o -(hapter)f(\014v)o(e.)106 1598 y fj(\017)22 b fl(a)10 b(set)g(of)g(three)g(mor\ -e)g(abstract,)g fi(high-level)f fl(refactorings:)17 b(de\014ning)12 b(an)e -(abstract)f(sup)q(erclass,)j(simpli-)151 1655 y(fying)f(conditional)i(stateme\ -n)o(ts)c(with)i(sub)q(classing,)i(and)e(sev)o(eral)g(comp)q(onen)o(t-related) -g(refactorings.)151 1711 y(These)16 b(refactorings)e(are)h(detailed)i(in)f -(c)o(hapters)f(six)h(through)f(eigh)o(t.)108 1798 y(The)k(lo)o(w-lev)o(el)h -(refactorings)e(are)g(simple)i(enough)f(that)f(in)h(most)f(cases)g(it)h(is)g -(trivial)g(to)f(sho)o(w)g(that)37 1855 y(they)g(are)g(b)q(eha)o(vior-preservi\ -ng.)28 b(While)19 b(most)e(of)h(these)g(lo)o(w-lev)o(el)h(op)q(erations)e(ha) -o(v)o(e)h(little)h(theoretical)37 1911 y(di\016cult)o(y)l(,)h(their)e(impleme\ -n)o(tation)h(can)f(b)q(e)h(complicated.)29 b(The)18 b(high-lev)o(el)i(refacto\ -rings)d(are)h(more)f(ex-)37 1968 y(pressiv)o(e)k(and)g(theoretically)g(in)o -(teresting)g(refactorings.)35 b(They)20 b(are)g(constructed)h(using)g(the)f -(lo)o(w-lev)o(el)37 2024 y(refactorings.)37 2145 y fe(1.2.2)56 b(Represen)n -(ting)17 b(Design)h(In)n(ten)n(t)37 2231 y fl(Some)e(of)e(the)h(more)g(p)q -(o)o(w)o(erful)g(refactorings)g(require)h(an)f(explicit)i(represen)o(tation)e -(of)g(design)h(in)o(ten)o(t.)k(F)l(or)37 2287 y(example,)h(if)f(a)f(class)h -(is)g(to)f(b)q(e)h(sp)q(ecialized)j(b)o(y)c(de\014ning)i(new)f(sub)q(classes,) -h(deciding)g(what)e(sub)q(classes)37 2344 y(should)e(b)q(e)f(added)g(dep)q -(ends)h(on)f(the)g(meaningful)g(sp)q(ecializations)j(for)14 b(that)h(applicat\ -ion.)23 b(Tw)o(o)14 b(kinds)j(of)37 2400 y(design)g(information)e(are)g(neede\ -d)h(for)f(some)g(of)g(the)g(high-lev)o(el)i(refactorings:)37 2476 y 750 2 v 89 -2503 a fu(1)107 2519 y fp(The)h(refactorings)i(are)f(describ)q(ed)i(using)f -(C++)e(terms)h(suc)o(h)g(as)g fm(memb)n(er)g(variable)d fp(and)k fm(memb)n -(er)f(function)p fp(,)d(whic)o(h)37 2564 y(corresp)q(ond)21 b(to)e(the)g(Smal\ -ltalk-80)571 2551 y fw(TM)637 2564 y fp([49])g(terms)g fm(instanc)n(e)d(varia\ -ble)h fp(and)i fm(metho)n(d)p fp(.)33 b(Smalltalk-80)22 b(is)e(a)f(trademark) -h(of)37 2610 y(P)o(arcPlace)15 b(Systems.)964 2760 y fl(4)g eop bop 93 42 a fl -(1.)22 b(a)c fi(class)f(invariant)p fl(,)h(whic)o(h)h(is)f(a)f(predicate,)i -(de\014ned)h(on)d(the)h(v)m(alues)h(of)f(mem)o(b)q(er)g(v)m(ariables,)h(that) -151 98 y(is)i(true)f(for)g(the)h(lifetime)h(of)e(an)g(instance)h(of)f(the)h -(class.)36 b(Chapter)20 b(sev)o(en)g(de\014nes)i(refactorings)151 154 y(for) -16 b(simplifying)i(a)e(class)h(b)o(y)f(de\014ning)i(sub)q(classes.)25 b(In)16 -b(mem)o(b)q(er)h(functions)g(of)f(the)g(newly)h(created)151 211 y(sub)q(class\ -es,)f(class)g(in)o(v)m(arian)o(ts)f(are)g(used)h(in)g(simplifying)i(condition\ -al)f(statemen)o(ts.)93 297 y(2.)22 b(a)c fi(list)g(of)g(c)n(omp)n(onent)g(mem\ -b)n(er)h(variables)p fl(,)e(whic)o(h)i(is)f(a)g(subset)g(of)f(the)h(list)h -(of)e(mem)o(b)q(er)h(v)m(ariables)151 353 y(de\014ned)h(in)g(a)e(class.)28 b -(Comp)q(onen)o(t)17 b(mem)o(b)q(er)h(v)m(ariables)h(mo)q(del)g(a)e(sp)q(ecial) -j fi(is-p)n(art-of)e fl(relationship)151 410 y(with)c(the)g(class)g(that)f -(con)o(tains)h(them,)g(referred)g(to)f(as)g(an)h fi(aggr)n(e)n(gate)f fl(clas\ -s.)20 b(Chapter)13 b(eigh)o(t)h(de\014nes)151 466 y(refactorings)h(that)f(in) -o(v)o(olv)o(e)i(comp)q(onen)o(ts)f(and)g(the)g(aggregate)f(classes)h(that)f -(con)o(tain)i(them.)j(Some)151 523 y(of)d(these)h(refactorings)f(require)h -(that)f(the)g(comp)q(onen)o(ts)h(b)q(e)g fi(exclusive)p fl(,)f(that)f(is,)i -(that)f(they)h(not)f(b)q(e)151 579 y(shared)f(among)g(m)o(ultiple)i(aggregate) -d(ob)s(jects.)108 654 y(This)f(design)h(in)o(ten)o(t)e(is)h(not)f(made)h(expl\ -icit)h(\(or)e(enforced\))g(in)i(a)e(language)h(suc)o(h)f(as)g(C++;)i(th)o(us,) -e(a)g(sys-)37 710 y(tem)i(for)e(supp)q(orting)i(refactorings)f(m)o(ust)g(b)q -(e)h(able)g(to)f(certify)h(class)f(in)o(v)m(arian)o(ts)h(and)g(lists)g(of)f -(comp)q(onen)o(ts.)37 767 y(In)i(general,)g(it)f(is)h(undecidable)i(whether)e -(a)f(predicate)h(is)g(a)f(class)g(in)o(v)m(arian)o(t)h(or)f(whether)g(a)g(mem) -o(b)q(er)h(v)m(ari-)37 823 y(able)h(is)f(a)f(comp)q(onen)o(t.)20 b(Since)c -(refactorings)e(m)o(ust)h(b)q(e)g(b)q(eha)o(vior)g(preserving,)g(it)g(is)g -(b)q(etter)g(to)f(mistak)o(enly)37 880 y(decide)g(that)d(a)g(predicate)i(is)f -(not)g(a)f(class)h(in)o(v)m(arian)o(t)g(\(and)g(so)f(not)h(b)q(e)g(able)h(to) -e(p)q(erform)g(a)h(legal)g(refactoring\))37 936 y(than)k(it)h(is)f(to)g(mista\ -k)o(enly)h(decide)g(that)f(a)g(predicate)h(is)f(a)g(class)h(in)o(v)m(arian)o -(t)f(and)h(ev)o(en)o(tually)g(p)q(erform)f(an)37 993 y(illegal)i(refactoring.) -j(Th)o(us,)15 b(a)g(system)g(for)g(supp)q(orting)h(refactorings)f(will)j(use) -d(conserv)m(ativ)o(e)i(algorithms)37 1049 y(for)d(deciding)i(whether)f(a)f -(predicate)h(is)g(a)f(class)g(in)o(v)m(arian)o(t)h(or)f(a)g(mem)o(b)q(er)g -(v)m(ariable)i(is)f(a)f(comp)q(onen)o(t.)19 b(The)37 1106 y(thesis)14 b(will) -h(describ)q(e)g(some)d(conserv)m(ativ)o(e)i(algorithms)f(for)f(b)q(oth)h(prob\ -lems)h(that)e(are)h(based)g(on)g(data-\015o)o(w)37 1162 y(analysis.)37 1302 y -fd(1.3)70 b(Con)n(tributions)37 1403 y fl(The)16 b(ma)s(jor)e(con)o(tribution\ -s)i(of)e(this)i(researc)o(h)f(are:)93 1478 y(1.)22 b(It)d(iden)o(ti\014es)i -(a)e(set)f(of)h(program)f(restructurings)h(\(refactorings\))f(that)g(p)q(eopl\ -e)j(apply)e(to)g(ob)s(ject-)151 1534 y(orien)o(ted)d(application)h(framew)o -(orks.)93 1620 y(2.)22 b(It)16 b(sho)o(ws)f(ho)o(w)g(to)f(automatically)i(sup\ -p)q(ort)g(refactorings)f(in)h(a)g(w)o(a)o(y)e(that)h(preserv)o(es)g(the)h(b)q -(eha)o(vior)151 1677 y(of)f(a)g(program.)93 1763 y(3.)22 b(It)15 b(de\014nes) -i(in)f(detail)g(three)f(of)g(the)g(most)g(complex)h(refactorings.)93 1849 y -(4.)22 b(It)15 b(de\014nes)h(design)f(constrain)o(ts)g(needed)h(in)f(refactor\ -ing,)f(sp)q(eci\014cally)k(class)d(in)o(v)m(arian)o(ts)g(and)g(exclu-)151 1906 -y(siv)o(e)h(comp)q(onen)o(ts.)108 1980 y(The)g(researc)o(h)f(describ)q(ed)i -(here)f(could)h(serv)o(e)e(as)g(the)g(basis)h(for)f(a)g fi(softwar)n(e)i(r)n -(efactory)e fl([85].)20 b(Whereas)37 2037 y(past)c(researc)o(h)f(in)o(to)h -(a)f fi(softwar)n(e)h(factory)h fl(\(for)d(example,)i([110)o(]\))f(has)g(fo)q -(cused)i(on)e(generating)h(a)f(soft)o(w)o(are)37 2093 y(program)10 b(from)g -(sp)q(eci\014cations,)j(this)f(researc)o(h)e(has)h(fo)q(cused)g(on)g(ho)o(w)f -(to)h(restructure)f(an)h(existing)h(program)37 2150 y(to)i(mak)o(e)f(it)h(eas\ -ier)h(to)e(understand,)h(c)o(hange)g(and)h(reuse.)k(Before)14 b(a)g(practical) -h(soft)o(w)o(are)d(refactory)h(can)h(b)q(e)37 2206 y(realized,)k(ho)o(w)o(ev) -o(er,)e(sev)o(eral)g(additional)i(researc)o(h)e(issues)h(need)g(to)f(b)q(e)h -(addressed,)f(as)g(noted)h(in)g(c)o(hapter)37 2262 y(elev)o(en.)108 2319 y -(The)12 b(next)h(t)o(w)o(o)d(c)o(hapters)i(presen)o(t)g(the)g(motiv)m(ation)h -(for)e(restructuring)h(ob)s(ject-orien)o(ted)g(systems,)g(and)37 2375 y(descr\ -ib)q(e)19 b(the)f(refactoring)e(approac)o(h.)26 b(Chapter)17 b(four)f(describ) -q(es)j(sev)o(eral)f(issues)g(related)f(to)g(preserving)37 2432 y(b)q(eha)o -(vior)k(during)g(refactoring.)34 b(Chapter)19 b(\014v)o(e)i(describ)q(es)g -(the)f(lo)o(w-lev)o(el)i(refactorings.)33 b(Chapters)20 b(six)37 2488 y(throu\ -gh)d(eigh)o(t)f(describ)q(e)j(the)d(three)h(highest)g(lev)o(el)h(refactorings\ -,)e(whic)o(h)h(are)g(the)f(most)g(expressiv)o(e)h(and)37 2545 y(most)k(algori\ -thmically)i(complex.)38 b(The)22 b(\014nal)g(three)f(c)o(hapters)g(pro)o(vide) -g(extended)i(examples,)g(surv)o(ey)37 2601 y(closely)14 b(related)f(w)o(ork,) -e(brie\015y)j(discuss)f(an)f(implemen)o(tation)i(of)e(the)g(approac)o(h)g(and) -h(presen)o(t)f(conclusions.)964 2760 y(5)g eop bop 37 353 a fc(Chapter)35 b -(2)37 560 y fb(Motiv)-7 b(ation)37 783 y fl(A)16 b(soft)o(w)o(are)e(pro)s(jec\ -t)h(\\is)h(capable)g(of)g(b)q(ecoming)g(a)g(monster)f(of)g(missed)h(sc)o(hedu\ -les,)h(blo)o(wn)f(budgets)g(and)37 839 y(\015a)o(w)o(ed)j(pro)q(ducts")f([24) -o(].)30 b(One)19 b(approac)o(h)g(to)e(ac)o(hieving)j(meaningful)g(reductions) -g(in)f(soft)o(w)o(are)e(costs)h(is)37 896 y(to)e(acquire)g(an)g(existing)h -(soft)o(w)o(are)d(system)h(rather)h(than)f(dev)o(eloping)j(a)d(new)i(one.)22 b -(Often,)16 b(ho)o(w)o(ev)o(er,)e(the)37 952 y(a)o(v)m(ailable)k(soft)o(w)o -(are)c(systems)i(do)g(not)f(pro)o(vide)i(an)f(exact)g(\014t)f(for)h(the)g(pro\ -blem)h(at)e(hand.)23 b(Soft)o(w)o(are)14 b(that)37 1009 y(solv)o(es)g(a)f fi -(similar)g fl(problem)i(migh)o(t)e(b)q(e)h(a)o(v)m(ailable,)h(but)f(suc)o(h)g -(soft)o(w)o(are)d(ma)o(y)i(need)i(to)d(b)q(e)j(c)o(hanged)e(in)i(some)37 1065 -y(w)o(a)o(y)g(b)q(efore)g(it)h(can)f(b)q(e)h(reused.)k(These)c(c)o(hanges)f -(ma)o(y)g(in)o(v)o(olv)o(e)g(restructuring)h(the)f(soft)o(w)o(are.)108 1122 y -(Ob)s(ject-orien)o(ted)i(programming)e(is)h(often)f(touted)h(as)f(promoting)h -(soft)o(w)o(are)e(reuse)i([45)o(].)21 b(Sometimes)37 1178 y(ho)o(w)o(ev)o(er) -15 b(the)g(b)q(ene\014ts)h(of)f(the)g(ob)s(ject-orien)o(ted)h(approac)o(h)e -(are)h(o)o(v)o(erstated,)f(and)h(claims)h(are)f(made)g(that)37 1235 y(feature\ -s)h(can)f(b)q(e)h(added)g(to)f(an)g(ob)s(ject-orien)o(ted)h(system)f(without) -g(disturbing)i(the)e(existing)h(implemen-)37 1291 y(tation.)j(As)12 b(this)h -(c)o(hapter)f(will)j(sho)o(w,)d(ob)s(ject-orien)o(ted)g(soft)o(w)o(are)f(ofte\ -n)h(needs)h(to)f(b)q(e)h(restructured)f(b)q(efore)37 1347 y(it)k(can)f(b)q -(e)h(reused.)37 1491 y fd(2.1)70 b(Bac)n(kground:)33 b(Soft)n(w)n(are)23 b -(Reuse)37 1592 y fl(The)d(high)g(costs)e(of)h(dev)o(eloping)h(soft)o(w)o(are) -e(motiv)m(ate)g(the)i(reuse)f(and)g(ev)o(olution)h(of)f(existing)h(soft)o(w)o -(are.)37 1649 y(Soft)o(w)o(are)15 b(reuse)i(in)g(its)g(broadest)f(sense)g(in) -o(v)o(olv)o(es)h(reapplying)h(kno)o(wledge)f(ab)q(out)f(one)g(soft)o(w)o(are) -f(system)37 1705 y(to)e(reduce)i(the)e(e\013orts)g(of)g(dev)o(eloping)i(and)e -(main)o(taining)i(another)e(system.)19 b(Closely)14 b(related)g(to)f(soft)o -(w)o(are)37 1761 y(reuse)k(is)g(soft)o(w)o(are)e(main)o(tenance,)i(where)g -(kno)o(wledge)g(ab)q(out)f(a)g(soft)o(w)o(are)f(system)h(is)h(used)g(to)e(dev) -o(elop)j(a)37 1818 y(v)o(ersion)e(that)e(re\014nes)i(or)f(extends)h(it.)697 -1801 y fs(1)108 1874 y fl(Approac)o(hes)e(that)g(supp)q(ort)g(reuse)g(address) -h(one)f(or)f(more)h(of)g(the)g(follo)o(wing)h(four)f(imp)q(ortan)o(t)f(asp)q -(ects)37 1931 y([19]:)93 2025 y(1.)22 b fi(\014nding)13 b fl(a)i(reusable)g -(comp)q(onen)o(t.)20 b(This)15 b(is)h(usually)g(is)f(not)f(as)g(simple)i(as)e -(\014nding)i(an)f(exact)f(matc)o(h,)151 2081 y(but)h(rather)g(in)o(v)o(olv)o -(es)h(\014nding)g(the)g(most)e(similar)i(comp)q(onen)o(t.)93 2175 y(2.)22 b fi -(understanding)d fl(the)g(comp)q(onen)o(t.)31 b(Understanding)20 b(what)f(a)g -(comp)q(onen)o(t)g(do)q(es)g(is)h(imp)q(ortan)o(t)f(in)151 2231 y(order)c(to) -g(use)g(it,)g(but)h(dev)o(eloping)g(that)f(men)o(tal)g(mo)q(del)h(is)g(di\016\ -cult)h([24)o(,)d(88].)37 2315 y 750 2 v 89 2342 a fu(1)107 2358 y fp(Most)d -(\(60%\))f(of)h(the)g(activities)i(analyzed)g(in)e(Osb)q(orne's)g(soft)o(w)o -(are)g(main)o(tenance)i(study)e([80],)g(w)o(ere)f(found)h(neither)h(to)f(b)q -(e)37 2403 y(correctiv)o(e)i(\(that)e(is,)h(diagnosing)i(and)e(\014xing)g(err\ -ors\))g(nor)f(adaptiv)o(e)i(\(c)o(hanging)g(soft)o(w)o(are)e(to)g(w)o(ork)g -(with)h(new)f(hardw)o(are)h(and)37 2449 y(p)q(eripherals\))18 b(but)e(rather) -f(w)o(ere)g fm(p)n(erfe)n(ctive)e fp(activities,)k(where)f(pressure)g(w)o(as) -f(brough)o(t)h(to)f(b)q(ear)h(on)f(dev)o(elop)q(ers)i(to)e(extend)37 2495 y -(and)f(enhance)g(the)g(functionalit)o(y)i(of)c(a)h(system.)18 b(P)o(erfectiv) -o(e)13 b(soft)o(w)o(are)g(main)o(tenance)i(is)f(closely)g(related)h(to)e(soft) -o(w)o(are)f(reuse.)964 2760 y fl(6)g eop bop 93 42 a fl(3.)22 b fi(mo)n(difyi\ -ng)15 b fl(a)g(comp)q(onen)o(t)g(or)f(a)h(set)g(of)g(comp)q(onen)o(ts.)20 b -(Understanding)c(what)e(c)o(hanges)h(are)g(needed)151 98 y(has)20 b(pro)o(v)o -(en)g(to)f(b)q(e)h(h)o(uman-in)o(tensiv)o(e)i(and)e(few)g(to)q(ols)f(ha)o(v)o -(e)h(pro)o(v)o(en)g(v)o(ery)f(helpful.)36 b(As)20 b(will)i(b)q(e)151 154 y -(sho)o(wn)15 b(b)q(elo)o(w,)g(these)h(mo)q(di\014cations)g(often)f(in)o(v)o -(olv)o(e)h(restructuring.)93 246 y(4.)22 b fi(c)n(omp)n(osing)14 b fl(the)h -(comp)q(onen)o(ts)g(together.)k(The)d(comp)q(osition)g(pro)q(cess)f(can)g(b)q -(e)h(di\016cult,)g(esp)q(ecially)151 302 y(when)g(a)e(comp)q(onen)o(t)i(has)e -(the)i(dual)f(purp)q(oses)h(of)f(b)q(eing)h(a)f(useful)h(indep)q(enden)o(t)h -(en)o(tit)o(y)e(and)g(b)q(eing)151 359 y(used)h(to)e(create)h(other)g(comp)q -(osite)h(structures.)108 447 y(While)e(some)f(soft)o(w)o(are)e(reuse)i(tec)o -(hniques)h(ha)o(v)o(e)f(fo)q(cused)g(at)f(the)h(co)q(de)h(lev)o(el,)g(others) -f(ha)o(v)o(e)f(fo)q(cused)i(on)37 503 y(design-lev)o(el)i(reuse.)k(There)13 b -(are)g(limitations)h(on)g(the)f(reuse)g(of)g(co)q(de:)19 b(it)14 b(w)o(orks)e -(b)q(est)h(when)h(the)f(domain)h(is)37 560 y(narro)o(w)e(and)g(w)o(ell)i(unde\ -rsto)q(o)q(d)f(and)g(the)f(underlying)j(tec)o(hnology)d(is)h(v)o(ery)f(static\ -.)19 b(Sometimes)13 b(the)g(design)37 616 y(of)i(soft)o(w)o(are)e(is)j(reusab\ -le)g(ev)o(en)f(when)h(the)f(co)q(de)h(is)f(not.)20 b(Ho)o(w)o(ev)o(er,)14 b -(a)g(ma)s(jor)g(problem)i(with)f(design-lev)o(el)37 673 y(reuse)h(is)g(that)e -(there)i(is)f(no)g(w)o(ell-de\014ned)j(represen)o(tation)d(system)g(for)g(des\ -ign.)108 729 y(Reuse)i(do)q(es)g(not)f(happ)q(en)h(b)o(y)f(acciden)o(t;)h(one) -g(needs)g(to)e(plan)i(to)f(reuse)g(soft)o(w)o(are)f(and)h(lo)q(ok)h(for)e(sof\ -t-)37 786 y(w)o(are)20 b(to)f(reuse.)34 b(Reuse)21 b(requires)f(the)g(righ)o -(t)g(attitude,)g(to)q(ols)g(and)g(tec)o(hniques)h([59)o(,)f(117)o(].)33 b(T)l -(o)q(ols)20 b(and)37 842 y(tec)o(hniques)f(to)e(supp)q(ort)h(soft)o(w)o(are)e -(reuse)i(include)i(comp)q(ositional)f(and)f(generational)g(approac)o(hes)f -([18)o(].)37 899 y(The)d(comp)q(osition-based)h(mo)q(del)g(of)e(reuse)h(is)g -(based)g(on)g(the)f(notion)h(of)f(plugging)i(comp)q(onen)o(ts)f(together,)37 -955 y(with)j(little)g(or)e(no)h(mo)q(di\014cation)h(of)e(those)h(comp)q(onen) -o(ts,)g(in)g(order)g(to)f(create)h(target)e(soft)o(w)o(are)g(systems.)37 1011 -y(The)19 b(comp)q(onen)o(ts)f(migh)o(t)g(b)q(e)h(co)q(de)g(sk)o(eletons)f([32) -o(,)g(68)o(],)g(subroutines)h([32)o(,)f(68)o(,)g(96])f(or)h(functions.)29 b -(The)37 1068 y(generation-based)16 b(approac)o(h,)e(on)h(the)g(other)f(hand,) -h(is)h(aimed)f(at)g(reusing)g(patterns)g(that)f(driv)o(e)h(the)g(cre-)37 1124 -y(ation)k(of)f(sp)q(eci\014c)j(or)d(customized)i(v)o(ersions)f(of)f(themselv) -o(es.)31 b(Application)21 b(generators)c([83])h(and)h(some)37 1181 y(program) -c(transformation)e(systems)i([23)o(,)g(33)o(,)g(43,)f(83])h(are)g(examples)h -(of)e(generation-based)i(systems.)108 1237 y(Soft)o(w)o(are)g(restructuring)i -(relates)f(to)g(eac)o(h)h(of)f(the)g(four)g(imp)q(ortan)o(t)g(asp)q(ects)h -(of)f(reuse)h(listed)g(ab)q(o)o(v)o(e.)37 1294 y(Restructuring)i(a)f(program) -f(can)h(mak)o(e)f(it)i(easier)f(to)f fi(understand)h fl(the)g(design)h(of)f -(a)f(program)g(and)h(can)37 1350 y(assist)12 b(in)h fi(\014nding)d fl(reusabl\ -e)j(comp)q(onen)o(ts.)19 b(Some)11 b(restructurings)h fi(mo)n(dify)g fl(a)g -(comp)q(onen)o(t)g(to)f(mak)o(e)g(it)h(more)37 1407 y(reusable;)k(suc)o(h)f -(comp)q(onen)o(ts)f(can)h(b)q(e)g(easier)g(to)f fi(c)n(omp)n(ose)g fl(togethe\ -r)g(for)g(an)h(application.)21 b(The)15 b(follo)o(wing)37 1463 y(section)h -(discusses)h(soft)o(w)o(are)c(restructuring.)37 1605 y fd(2.2)70 b(Bac)n(kgro\ -und:)33 b(Soft)n(w)n(are)23 b(Restructuring)37 1707 y fl(Soft)o(w)o(are)18 b -(sometimes)h(needs)g(to)f(b)q(e)i(restructured)f(b)q(efore)g(it)g(is)g(reused\ -.)31 b(Arnold)20 b([3)o(])e(de\014nes)i(soft)o(w)o(are)37 1763 y(restructurin\ -g)f(as)f(\\the)h(mo)q(di\014cation)h(of)e(soft)o(w)o(are)f(to)h(mak)o(e)g(the) -g(soft)o(w)o(are)f(\(1\))h(easier)h(to)f(understand)37 1820 y(and)e(to)e(c)o -(hange)i(or)e(\(2\))h(less)g(susceptible)j(to)c(error)h(when)g(future)h(c)o -(hanges)f(are)g(made.")108 1876 y(A)20 b(ma)s(jor)f(goal)h(of)g(soft)o(w)o -(are)e(restructuring)j(is)g(to)e(preserv)o(e)i(or)e(increase)j(the)e(v)m(alue) -h(of)f(a)g(piece)i(of)37 1933 y(soft)o(w)o(are.)28 b(Restructuring)20 b(a)e -(system)g(ma)o(y)g(mak)o(e)g(it)g(p)q(ossible)i(to)e(add)h(more)f(features)g -(to)g(the)g(existing)37 1989 y(system,)12 b(or)e(mak)o(e)h(the)g(soft)o(w)o -(are)e(more)i(reusable)g(in)h(other)f(systems.)18 b(Soft)o(w)o(are)10 b(restr\ -ucturing)h(approac)o(hes)37 2045 y(ha)o(v)o(e)k(b)q(ecome)i(increasingly)g -(attractiv)o(e)d(as)h(the)h(cost)e(of)h(programmer)f(time)i(relativ)o(e)g(to) -f(computer)g(time)37 2102 y(has)j(increased.)27 b(Soft)o(w)o(are)16 b(restruc\ -turing)i(is)g(most)e(often)h(used)h(during)g(soft)o(w)o(are)e(main)o(tenance,) -i(where)37 2158 y(the)i(lac)o(k)g(of)f(soft)o(w)o(are)e(structure)j(often)f -(is)h(most)f(eviden)o(t)h(and)g(exp)q(ensiv)o(e.)34 b(Ho)o(w)o(ev)o(er,)19 b -(it)h(can)f(also)h(b)q(e)37 2215 y(applied)e(in)e(the)f(earlier)h(design)g -(and)g(dev)o(elopmen)o(t)f(phases.)108 2271 y(Soft)o(w)o(are)g(structure)i -(can)f(b)q(e)i(broadly)f(de\014ned)h(as)e(a)g(collection)j(of)d(soft)o(w)o -(are)f(attributes)h(that)g(mak)o(e)37 2328 y(sense)i(to)f(the)h(p)q(erceiv)o -(er)g([3].)26 b(Since)18 b(programmers')e(p)q(erceptions)j(di\013er)f(from)e -(eac)o(h)i(other,)f(and)g(a)h(pro-)37 2384 y(grammer's)c(p)q(erception)j(can) -e(c)o(hange)g(o)o(v)o(er)g(time,)g(the)g(notion)h(of)e(soft)o(w)o(are)g(struc\ -ture)h(is)g(dynamic.)108 2441 y(Man)o(y)j(factors)g(can)i(con)o(tribute)f(to) -f(p)q(o)q(or)h(soft)o(w)o(are)f(structure.)31 b(These)19 b(factors)f(include) -j(an)e(inade-)37 2497 y(quate)d(design)g(metho)q(dology)g([14)o(],)f(absence) -h(of)f(dev)o(elopmen)o(t)h(and)g(main)o(tenance)g(standards)f([2],)g(buggy)37 -2554 y(optimizations)j([113)o(])f(and)g(exp)q(edien)o(t)h(but)g(p)q(o)q(orly) -f(conceiv)o(ed)h(c)o(hanges)f(made)g(to)g(the)g(soft)o(w)o(are)e(system)37 -2610 y(to)g(re\015ect)h(c)o(hanges)f(in)h(the)f(en)o(vironmen)o(t)h(in)g(whic) -o(h)g(it)f(op)q(erates)g([25)o(].)964 2760 y(7)g eop bop 108 42 a fl(W)l(ein) -o(b)q(erg)12 b(in)f([123)o(])f(suggests)g(that)g(v)o(ery)h(small)g(c)o(hanges) -g(to)f(a)h(soft)o(w)o(are)e(system)h(are)g(m)o(uc)o(h)h(more)f(prone)37 98 y -(to)15 b(error)f(than)g(larger)h(c)o(hanges,)f(b)q(ecause)i(p)q(eople)g(tend) -f(to)f(tak)o(e)g(v)o(ery)h(small)g(c)o(hanges)g(less)g(seriously)h(and)37 154 -y(are)g(therefore)g(less)g(lik)o(ely)i(to)d(test)g(them)h(adequately)l(.)23 b -(The)16 b(lo)o(w)o(er)f(lev)o(el)i(refactorings)f(describ)q(ed)h(in)g(this)37 -211 y(thesis)f(are)e(examples)h(of)f(small)i(c)o(hanges)e(that)g(if)h(not)f -(done)h(carefully)h(can)e(lead)i(to)e(errors)f(in)j(a)e(program.)108 267 y -(Impro)o(ving)e(a)f(programmer's)f(p)q(erception)j(of)e(the)h(structure)f(of) -g(a)h(soft)o(w)o(are)d(system)j(do)q(esn't)f(necessar-)37 324 y(ily)j(require) -g(mo)q(difying)g(the)f(co)q(de.)19 b(Design)14 b(reco)o(v)o(ery)e(is)h(a)f -(soft)o(w)o(are)f(reengineering)k(approac)o(h)d(that)g(recre-)37 380 y(ates)g -(design)h(abstractions)f(from)g(a)f(collection)k(of)c(co)q(de,)i(existing)h -(do)q(cumen)o(tation,)e(general)h(kno)o(wledge)g(of)37 437 y(the)i(domain)f -(and)h(heuristic)g(reasoning)g([17)o(,)e(34].)19 b(Design)14 b(reco)o(v)o(ery) -g(has)g(b)q(een)h(prop)q(osed)g(using)g(program)37 493 y(structures)k(\()p fi -(cliches)p fl(\))f(and)h(graph)g(parsing)h([97)o(],)f(a)g(heuristic-based)i -(concept-recognition)g(mec)o(hanism)37 550 y(with)d(m)o(ultiple)h(views)e(of) -f(program)g(kno)o(wledge)i([55)o(],)e(and)i(an)e(approac)o(h)h(using)h(an)e -(in)o(termediate)i(mo)q(d-)37 606 y(ular)h(in)o(terconnection)g(language)g -(to)e(generate)h(design)h(descriptions)g([35)o(].)28 b(None)19 b(of)e(these)i -(approac)o(hes)37 663 y(in)o(v)o(olv)o(e)13 b(co)q(de)f(c)o(hanges.)18 b(Also\ -,)12 b(they)g(do)f(not)g(directly)i(address)f(ho)o(w)f(to)f(c)o(hange)i(the)f -(implemen)o(tation)i(once)37 719 y(the)k(existing)g(structure)f(is)g(understo) -q(o)q(d;)h(although)f(clearly)i(the)e(kno)o(wledge)g(gathered)g(during)h(soft) -o(w)o(are)37 775 y(reengineering)h(should)e(help)g(a)f(dev)o(elop)q(er)h(dete\ -rmine)h(where)e(c)o(hanges)g(need)h(to)f(b)q(e)h(made.)108 832 y(Man)o(y)i -(other)f(soft)o(w)o(are)g(restructuring)h(approac)o(hes)g(in)o(v)o(olv)o(e)h -(co)q(de)g(c)o(hanges.)29 b(A)18 b(ma)s(jor)f(purp)q(ose)i(of)37 888 y(these) -h(c)o(hanges)g(is)g(to)e(infuse)j(the)e(co)q(de)h(with)g(structure,)g(making) -g(the)f(\015o)o(w)g(of)g(con)o(trol)g(in)h(a)g(program)37 945 y(more)e(explic\ -it.)29 b(Approac)o(hes)18 b(ha)o(v)o(e)f(b)q(een)i(prop)q(osed)f(based)g(on)g -(co)q(de)g(insp)q(ections)h(and)f(w)o(alk)g(throughs)37 1001 y([42,)j(47],)i -(adherence)g(to)e(soft)o(w)o(are)f(metrics)i([11],)g(main)o(tainabilit)o(y)i -(measures)e([26)o(])g(or)f(other)h(criteria)37 1058 y([29,)14 b(52)o(,)g(65,) -g(68,)g(78)o(,)g(87,)g(88)o(,)h(90)o(,)f(112)o(].)20 b(Man)o(y)14 b(of)g(the) -h(earliest)g(commercial)g(pro)q(ducts)g(in)h(this)f(area)f(w)o(ere)37 1114 y -(dev)o(elop)q(ed)j(for)e(restructuring)g(COBOL)i(programs)d([75)o(,)g(82,)h -(121)o(].)108 1171 y(Sev)o(eral)g(tec)o(hniques)g(ha)o(v)o(e)e(b)q(een)i(dev) -o(elop)q(ed)h(based)e(on)g(structured)g(programming)g(guidelines;)i(these)37 -1227 y(include)h(goto)d(elimination)i([4)o(,)f(20)o(,)f(128)o(],)g(case)g(sta\ -temen)o(t)g(re\014nemen)o(t)h([73)o(])f(and)g(other)g(tec)o(hniques)i(\(e.g.,) -37 1284 y([29]\).)h(P)o(arnas)10 b([87)o(])g(giv)o(es)h(principles)j(for)c -(partitioning)h(a)g(system)f(in)o(to)h(mo)q(dules)g(to)f(increase)i(its)f(mai\ -n)o(tain-)37 1340 y(abilit)o(y)l(.)21 b(Ly)o(ons)12 b([75)o(])g(and)g(Morgan) -f([82)o(])h(describ)q(e)i(to)q(ols)e(that)g(reduce)h(gotos,)e(remo)o(v)o(e)g -(dead)i(\(unreac)o(hable\))37 1396 y(co)q(de,)g(con)o(v)o(ert)e(notes)h(to)f -(commen)o(ts,)h(ph)o(ysically)h(group)f(I/O,)g(and)g(highligh)o(t)h(lo)q(opin\ -g)g(conditions.)20 b(Other)37 1453 y(to)q(ols)c(to)e(supp)q(ort)h(soft)o(w)o -(are)f(restructuring)h(include)j(prett)o(y)c(prin)o(ters)h(and)h(co)q(de)g -(formatters,)d(in)o(tegrated)37 1509 y(programming)i(en)o(vironmen)o(ts)g([10\ -,)f(122])g(and)i(rule-based)g(program)e(transformation)g(systems)h([91)o(].) -108 1566 y(Soft)o(w)o(are)f(restructuring)h(con)o(tin)o(ues)h(to)e(b)q(e)i -(an)f(imp)q(ortan)o(t)g(area)g(of)g(soft)o(w)o(are)e(engineering)k(researc)o -(h.)37 1709 y fd(2.3)70 b(Ob)t(ject-Orien)n(ted)19 b(Programming,)j(Reuse)g -(and)h(Restructuring)37 1810 y fl(Ob)s(ject-orien)o(ted)18 b(programming)d -(is)i(often)g(touted)f(as)g(promoting)g(soft)o(w)o(are)f(reuse)h([45].)23 b -(Ho)o(w)o(ev)o(er,)15 b(it)i(is)37 1867 y(not)i(a)f(panacea.)30 b(This)19 b -(section)g(discusses)h(some)e(of)g(the)h(strengths)e(of)i(ob)s(ject-orien)o -(ted)f(programming)37 1923 y(regarding)e(reuse,)f(and)g(some)g(of)g(its)g(lim\ -itations.)37 2045 y fe(2.3.1)56 b(F)-5 b(eatures)18 b(of)h(Ob)s(ject-Orien)n -(ted)e(Systems)g(That)i(Supp)r(ort)f(Reuse)37 2131 y fl(Most)d(ob)s(ject-orie\ -n)o(ted)g(languages)h(com)o(bine)g(sev)o(eral)f(features)g(that)g(supp)q(ort) -g(reuse:)21 b(data)14 b(abstraction,)37 2187 y(class)i(inheritance)h(and)e -(p)q(olymorphism.)108 2244 y(Most)21 b(ob)s(ject-orien)o(ted)g(languages)h -(pro)o(vide)g fi(data)h(abstr)n(action)e fl(using)h(classes.)39 b(Class)22 b -(de\014nitions)37 2300 y(pro)o(vide)f(encapsulation)g(and)e(in)i(some)e(cases) -g(pro)o(vide)h(information)g(hiding,)i(and)e(can)f(often)h(serv)o(e)f(as)37 -2357 y(reusable)e(comp)q(onen)o(ts.)108 2413 y fi(Class)f(inheritanc)n(e)f fl -(allo)o(ws)h(the)g(op)q(erations)g(and)g(p)q(ossibly)h(the)f(in)o(ternal)h -(structure)f(of)g(a)f(class)h(to)g(b)q(e)37 2470 y(inherited)f(and)d(reused)h -(b)o(y)f(its)h(sub)q(classes.)20 b(Inheritance)14 b(is)f(sometimes)f(used)h -(to)f(represen)o(t)g(sp)q(ecialization)37 2526 y(hierarc)o(hies,)17 b(where)e -(the)g(sub)q(classes)h(are)f(sp)q(ecializations)j(of)d(the)g(sup)q(erclass.) -21 b(Another)15 b(common)f(use)i(of)964 2760 y(8)g eop bop 37 42 a fl(inherit\ -ance)18 b(is)e(to)f(supp)q(ort)h(programming)f(b)o(y)h(di\013erence;)h(one)f -(w)o(a)o(y)e(to)h(reuse)h(the)g(existing)h(soft)o(w)o(are)d(is)37 98 y(to)h -(create)g(a)g(sub)q(class)h(and)g(represen)o(t)f(the)g(di\013erences)h(in)g -(the)g(newly)g(de\014ned)g(sub)q(class.)108 154 y fi(Polymorphism)i fl(is)h -(another)f(p)q(o)o(w)o(erful)g(tec)o(hnique)h(of)f(ob)s(ject-orien)o(ted)g -(languages.)28 b(P)o(olymorphism)37 211 y(is)15 b(the)f(notion)g(that)f(a)g -(pro)q(cedure)i(can)f(b)q(e)g(in)o(v)o(ok)o(ed)g(on)g(an)f(ob)s(ject)h(withou\ -t)f(kno)o(wing)h(its)g(exact)g(t)o(yp)q(e.)19 b(An)37 267 y(example)f(of)e -(a)h(p)q(olymorphic)h(op)q(eration)f(is)g(an)f(op)q(eration)h(to)f(\014nd)i -(the)e(maximal)h(elemen)o(t)h(in)f(an)g(arra)o(y)l(.)37 324 y(The)i(op)q(erat\ -ion)g(could)g(b)q(e)h(de\014ned)f(in)h(the)e(arra)o(y)g(class)g(as)h(a)f(seri\ -es)h(of)f(pairwise)h(comparisons)g(on)f(the)37 380 y(elemen)o(ts)g(in)h(the)e -(arra)o(y)l(.)25 b(In)18 b(an)f(ob)s(ject-orien)o(ted)g(system,)g(this)h(coul\ -d)g(b)q(e)g(implemen)o(ted)h(as)e(a)g(series)h(of)37 437 y(calls)h(to)e(arra) -o(y)g(elemen)o(ts)h(to)g(compare)f(themselv)o(es)h(with)h(another)e(elemen)o -(t)h(and)g(return)g(the)g(maximal)37 493 y(elemen)o(t.)23 b(The)16 b(op)q(era\ -tion)g(could)h(b)q(e)g(de\014ned)g(once)f(on)g(the)g(arra)o(y)f(class)h(and)g -(then)g(reused)h(on)e(arra)o(ys)g(of)37 550 y(di\013eren)o(t)k(t)o(yp)q(es,)f -(as)f(long)h(as)g(eac)o(h)g(t)o(yp)q(e)g(of)f(arra)o(y)g(elemen)o(t)i(underst\ -o)q(o)q(d)f(ho)o(w)f(to)h(compare)f(itself)i(with)37 606 y(another)c(arra)o -(y)f(elemen)o(t)i(of)f(that)f(t)o(yp)q(e.)108 663 y(This)j(com)o(bination)g -(of)e(features)h(is)h(supplemen)o(ted)h(in)f(Smalltalk)g(and)g(some)f(other)f -(ob)s(ject-orien)o(ted)37 719 y(languages)f(with)g(a)f(sophisticated)h(user)f -(in)o(terface)h(and)f(bro)o(wsing)h(facilities)h(that)e(help)h(mak)o(e)f(expl\ -icit)i(the)37 775 y(inheritance)i(relationships)f(among)e(classes)i(and)f(the) -f(proto)q(col)h(\(set)f(of)h(op)q(erations\))f(supp)q(orted)i(b)o(y)e(eac)o -(h)37 832 y(class.)20 b(These)14 b(features)f(encourage)g(the)h(iden)o(tifyin\ -g)h(and)f(reusing)g(of)f(existing)h(co)q(de)g(rather)f(than)g(writing)37 888 y -(new)j(co)q(de)g(from)e(scratc)o(h.)37 1010 y fe(2.3.2)56 b(Ob)s(ject-Orien)n -(ted)17 b(Application)h(F)-5 b(ramew)n(orks)18 b(and)h(Reuse)37 1096 y fl(Whi\ -le)c(ob)s(ject-orien)o(ted)e(programming)g(mak)o(es)f(program)g(comp)q(onen)o -(ts)i(more)e(reusable,)i(in)g(the)g(long)f(run)37 1152 y(reusing)j(the)e(desi\ -gn)h(of)f(an)h(application)h(is)f(more)e(imp)q(ortan)o(t)h(than)h(reusing)g -(the)f(implemen)o(tation)i(of)e(an)o(y)37 1209 y(one)i(of)g(its)f(comp)q(onen) -o(ts.)22 b(Biggersta\013)14 b(and)i(Ric)o(h)o(ter)g(note)g(that)f(the)h(funda\ -men)o(tal)g(problem)g(prev)o(en)o(ting)37 1265 y(successful)g(design)f(lev)o -(el)h(reuse)e(is)h(\014nding)h(the)e(righ)o(t)g(represen)o(tation)g(of)g(desi\ -gn.)21 b(Suc)o(h)15 b(a)e(represen)o(tation)37 1322 y(should)k([16)o(]:)106 -1416 y fj(\017)22 b fl(represen)o(t)15 b(kno)o(wledge)h(ab)q(out)f(implemen)o -(tation)i(structures)d(in)j(a)d(factored)h(form)106 1509 y fj(\017)22 b fl -(p)q(ermit)16 b(partial)g(sp)q(eci\014cations)h(that)d(can)h(b)q(e)h(incremen) -o(tally)h(extended)106 1603 y fj(\017)22 b fl(allo)o(w)16 b(\015exible)h(coup\ -lings)g(b)q(et)o(w)o(een)e(a)g(design)h(and)g(its)f(v)m(arious)h(in)o(terpret\ -ations)106 1697 y fj(\017)22 b fl(supp)q(ort)15 b(degrees)h(of)f(abstraction) -f(and)i(precision.)108 1791 y(An)21 b(imp)q(ortan)o(t)g(ob)s(ject-orien)o(ted) -g(tec)o(hnique)h(for)e(facilitate)i(design-lev)o(el)h(reuse)e(is)h(an)f fi -(applic)n(ation)37 1847 y(fr)n(amework.)f fl(An)12 b(application)h(framew)o -(ork)c(represen)o(ts)j(the)f(design)h(of)f(an)h(application;)i(it)d(consists) -h(of)f(a)g(set)37 1904 y(of)i(classes)g(\(man)o(y)f(of)g(whic)o(h)i(ma)o(y)e -(b)q(e)h(abstract\),)e(eac)o(h)i(represen)o(ting)g(a)g(ma)s(jor)e(comp)q(onen) -o(t.)19 b(F)l(ramew)o(orks)37 1960 y(capture)13 b(the)g(designs)g(of)f(in)o -(terfaces)h(and)g(the)f(w)o(a)o(y)g(functionalit)o(y)h(is)g(divided)i(among)d -(comp)q(onen)o(ts,)h(whic)o(h)37 2017 y(Deutsc)o(h)i(argues)e(are)h(the)g(k)o -(ey)g(in)o(tellectual)j(con)o(ten)o(t)d(of)f(soft)o(w)o(are)g([40)o(].)19 b -(F)l(ramew)o(orks)13 b(de\014ne)i(an)f fi(external)37 2073 y(interfac)n(e)h fl -(that)f(is)h(constan)o(t)f(across)g(all)i(uses)f(of)f(a)h(framew)o(ork,)e(and) -i(an)g fi(internal)g(interfac)n(e)f fl(that)g(is)h(a)g(set)37 2129 y(of)g(con\ -strain)o(ts)g(on)g(sub)q(class)h(co)q(de)g(or)f(a)g(comp)q(onen)o(t)g(ob)s -(ject's)f(proto)q(col.)108 2186 y(A)d(framew)o(ork)f(is)i(a)f(mixture)h(of)f -(abstract)f(and)i(concrete)f(classes.)19 b(One)12 b(of)f(the)h(main)f(c)o(har\ -acteristics)h(of)37 2242 y(a)i(framew)o(ork)e(is)i(that)f(it)h(is)g(designed) -h(to)e(b)q(e)h(re\014ned.)20 b(It)14 b(can)f(b)q(e)i(re\014ned)f(b)o(y)g(c)o -(hanging)g(the)f(con\014guration)37 2299 y(of)h(its)g(comp)q(onen)o(ts)h(or)e -(b)o(y)h(creating)g(new)h(kinds)g(of)e(comp)q(onen)o(ts)h(\(i.e.)20 b(new)14 b -(classes,)h(often)f(as)f(sub)q(classes)37 2355 y(of)k(existing)g(classes\).) -24 b(A)16 b(mature)g(framew)o(ork)f(will)k(ha)o(v)o(e)d(a)g(large)g(class)h -(library)g(of)g(concrete)f(sub)q(classes)37 2412 y(of)i(eac)o(h)g(abstract)e -(class,)j(so)e(that)g(most)g(of)g(the)h(time)g(an)g(application)h(can)f(b)q -(e)h(plugged)f(together)f(from)37 2468 y(existing)j(comp)q(onen)o(ts.)28 b -(Ev)o(en)18 b(when)h(new)f(sub)q(classes)h(are)f(needed,)i(they)e(are)g(easy) -f(to)h(pro)q(duce;)i(their)37 2525 y(abstract)h(sup)q(erclass)i(pro)o(vides)g -(their)f(design)h(and)f(m)o(uc)o(h)g(of)f(their)i(co)q(de,)g(and)f(the)g(alre\ -ady)g(existing)37 2581 y(concrete)16 b(sub)q(classes)g(pro)o(vide)g(examples) -g(of)f(ho)o(w)f(to)h(sub)q(class)h(from)f(the)g(abstract)f(sup)q(erclass.)964 -2760 y(9)g eop bop 108 42 a fl(Th)o(us,)21 b(an)f(ob)s(ject-orien)o(ted)h(app\ -lication)h(framew)o(ork)d(is)h(a)g(represen)o(tation)h(that)e(supp)q(orts)i -(design)37 98 y(lev)o(el)16 b(reuse)f(b)o(y)g(represen)o(ting)g(kno)o(wledge) -g(in)h(a)e(factored)g(form,)g(p)q(ermitting)h(partial)g(sp)q(eci\014cations,) -h(and)37 154 y(supp)q(orting)23 b(degrees)e(of)g(abstraction.)38 b(F)l(urther\ -more,)22 b(sub)q(classing)h(can)e(b)q(e)h(used)g(in)h(an)e(application)37 211 -y(framew)o(ork)14 b(to)h(mo)q(del)h(v)m(arious)g(concrete)f(represen)o(tation\ -s)g(of)g(a)g(common)g(abstraction.)37 333 y fe(2.3.3)56 b(Reusing)18 b(&)g -(Refactoring)g(Ob)s(ject-Orien)n(ted)f(Soft)n(w)n(are)37 418 y fl(One)22 b -(migh)o(t)e(b)q(e)h(tempted)f(to)g(conclude)i(that)e(an)g(ob)s(ject-orien)o -(ted)h(system,)g(once)f(dev)o(elop)q(ed,)j(can)e(b)q(e)37 475 y(reused)e(or)f -(extended)h(simply)g(b)o(y)g(com)o(bining)g(comp)q(onen)o(ts)f(of)g(existing) -h(classes)g(in)g(di\013eren)o(t)f(w)o(a)o(ys,)g(b)o(y)37 531 y(adding)h(op)q -(erations)e(to)g(existing)h(classes)g(or)f(b)o(y)g(sub)q(classing)i(from)e -(existing)h(classes.)27 b(Often,)18 b(ho)o(w)o(ev)o(er,)37 588 y(ob)s(ject-or\ -ien)o(ted)f(soft)o(w)o(are)d(cannot)i(b)q(e)h(reused)g(without)f(\014rst)g -(b)q(eing)h(restructuring.)23 b(There)16 b(are)g(sev)o(eral)37 644 y(reasons) -f(for)g(this)g([31,)f(59]:)93 738 y(1.)22 b(When)16 b(dev)o(eloping)h(a)e(sof\ -t)o(w)o(are)f(application,)j(it)f(is)g(di\016cult)h(to)e(determine)h fi(a)h -(priori)f fl(what)f(classes)151 794 y(em)o(b)q(o)q(dy)e(the)f(imp)q(ortan)o -(t)g(concepts)h(for)e(that)h(application)i(and)e(ho)o(w)g(they)g(in)o(terrela\ -te.)20 b(Exp)q(erience)151 851 y(has)f(sho)o(wn)f(that)g(a)h(useful)h(taxonom) -o(y)d(of)h(classes)i(is)f(disco)o(v)o(ered)g(through)g(an)f(iterativ)o(e)h -(pro)q(cess)151 907 y(of)c(exploration.)21 b(As)16 b(an)f(understanding)i(of) -e(the)g(application)i(impro)o(v)o(es,)e(the)h(system)f(often)g(needs)151 964 y -(to)20 b(b)q(e)h(restructured)g(and)f(the)h(abstractions)f(em)o(b)q(o)q(died) -i(in)f(existing)h(classes)e(often)h(need)g(to)f(b)q(e)151 1020 y(c)o(hanged.) -93 1114 y(2.)i(Ev)o(en)15 b(after)f(a)h(system)g(has)f(matured)h(through)g -(sev)o(eral)g(iterations,)g(sw)o(eeping)h(structural)e(c)o(hanges)151 1171 y -(migh)o(t)19 b(still)i(b)q(e)f(necessary)l(.)32 b(The)20 b(soft)o(w)o(are)d -(system)i(m)o(ust)g(op)q(erate)g(in)h(an)f(en)o(vironmen)o(t)g(that)g(is)151 -1227 y(constan)o(tly)14 b(c)o(hanging,)h(and)f(the)g(soft)o(w)o(are)f(system) -g(m)o(ust)h(satisfy)g(user)g(needs)h(that)f(are)g(constan)o(tly)151 1283 y -(c)o(hanging)i(as)f(w)o(ell.)93 1377 y(3.)22 b(When)c(attempts)f(are)g(made)h -(to)f(reuse)h(soft)o(w)o(are)e(across)h(pro)s(jects,)h(new)g(issues)g(arise.) -28 b(A)18 b(system)151 1434 y(ma)o(y)e(need)h(to)f(b)q(e)h(partitioned)h(di\ -\013eren)o(tly)l(,)f(due)g(to)f(organizational)h(and)g(other)f(factors,)f(in) -j(order)151 1490 y(for)d(a)g(new)g(pro)s(ject)f(to)h(reuse)h(it.)k(Th)o(us,) -14 b(some)h(restructuring)h(ma)o(y)e(b)q(e)i(needed)h(to)d(e\013ect)h(reuse.) -93 1584 y(4.)22 b(Sub)q(classing)d(in)e(an)f(ob)s(ject-orien)o(ted)g(system)g -(can)h(sim)o(ultaneously)h(serv)o(e)e(sev)o(eral)g(purp)q(oses,)h(lik)o(e)151 -1640 y(co)q(de)22 b(sharing,)h(t)o(yp)q(e)e(v)m(alidation)i(and)e(mo)q(deling) -i(generalization/sp)q(eciali)q(zation)h(relationships.)151 1697 y(It)18 b(can) -g(b)q(e)h(di\016cult)h(to)d(reconcile)j(all)f(of)e(these)i(purp)q(oses)f(with\ -out)g(some)g(restructuring)g(when)h(a)151 1753 y(c)o(hange)c(is)h(prop)q(osed\ -.)108 1847 y(None)k(of)f(these)h(issues)h(is)f(exclusiv)o(e)h(to)e(ob)s(ject-\ -orien)o(ted)h(systems.)33 b(The)20 b(fourth)f(issue)i(applies)g(to)37 1904 y -(languages)h(that)e(ha)o(v)o(e)g(subt)o(yp)q(es;)k(the)d(other)g(three)g(issu\ -es)h(apply)g(more)e(generally)l(.)39 b(The)21 b(imp)q(ortan)o(t)37 1960 y(p)q -(oin)o(t)15 b(here)g(is)g(that)f(these)h(issues)g(do)f(not)g(disapp)q(ear)i -(when)f(ob)s(ject-orien)o(ted)f(tec)o(hnology)h(is)g(in)o(tro)q(duced.)37 2017 -y(One)21 b(of)e(the)h(essen)o(tial)h(di\016culties)h(in)f(dev)o(eloping)g(sof\ -t)o(w)o(are)d(is)j(that)e(the)h(soft)o(w)o(are)e(m)o(ust)h(conform)g(to)37 -2073 y(h)o(uman)i(institutions)g(and)g(systems)f(that)f(in)o(terface)i(with)g -(it,)g(and)g(that)f(those)g(forces)g(are)g(constan)o(tly)37 2129 y(c)o(hangin\ -g)c([24)o(].)108 2186 y(Nonetheless,)i(the)e(motiv)m(ation)h(to)f(restructure) -g(ob)s(ject-orien)o(ted)g(programs)g(is)h(somewhat)e(di\013eren)o(t)37 2242 y -(from)21 b(the)g(motiv)m(ation)h(for)f(man)o(y)g(soft)o(w)o(are)e(restructuri\ -ng)j(approac)o(hes)f(in)h(the)f(past.)38 b(Man)o(y)20 b(of)h(the)37 2299 y -(soft)o(w)o(are)15 b(restructuring)i(tec)o(hniques)h(describ)q(ed)h(earlier)f -(w)o(ere)e(motiv)m(ated)h(b)o(y)f(the)h(need)h(to)e(understand)37 2355 y(and) -c(ev)o(olv)o(e)f(unstructured)h(or)f(p)q(o)q(orly)h(structured)f(programs.)18 -b(Ho)o(w)o(ev)o(er,)10 b(with)i(ob)s(ject-orien)o(ted)f(systems,)37 2412 y -(some)k(structural)g(information)h(is)f(already)h(explicit)h(within)g(the)e -(class)h(and)f(inheritance)i(structures;)d(the)37 2468 y(in)o(tegrated)j(dev) -o(elopmen)o(t)g(en)o(vironmen)o(ts)g(for)f(Smalltalk)h(and)g(other)f(ob)s(jec\ -t-orien)o(ted)g(languages)h(mak)o(e)37 2525 y(understanding)12 b(a)e(program) -f(structure)h(easier)h(b)o(y)f(pro)o(viding)i(facilities)g(for)e(abstracting) -g(and)g(bro)o(wsing)g(the)37 2581 y(program.)25 b(With)17 b(ob)s(ject-orien)o -(ted)g(systems)g(refactoring)g(is)g(needed)i(not)d(so)h(m)o(uc)o(h)g(to)g(inf\ -use)h(structure)952 2760 y(10)g eop bop 37 42 a fl(in)o(to)22 b(a)f(p)q(o)q -(orly)h(structured)g(program,)f(but)h(rather)f(to)g(re\014ne)h(the)g(design)g -(of)f(an)h(already)f(structured)37 98 y(program,)14 b(and)i(mak)o(e)e(it)i -(easier)f(to)g(reuse.)108 154 y(The)e(need)g(to)f(in)o(v)o(estigate)h(approac) -o(hes)f(for)g(soft)o(w)o(are)f(restructuring)i(has)f(b)q(een)i(motiv)m(ated)f -(b)o(y)f(sev)o(eral)37 211 y(sources)g(within)g(the)g(ob)s(ject-orien)o(ted)f -(comm)o(unit)o(y)l(.)19 b(These)12 b(include)h(w)o(ork)e(in)h(ob)s(ject-orien) -o(ted)f(databases,)37 267 y(and)16 b(researc)o(h)f(in)o(to)g(impro)o(ving)h -(the)g(st)o(yle)f(of)g(ob)s(ject-orien)o(ted)g(programs)g(to)f(increase)i(the\ -ir)g(reusabilit)o(y)l(.)37 324 y(These)g(e\013orts)e(are)h(brie\015y)h(discus\ -sed)h(b)q(elo)o(w)f(and)f(further)g(detailed)i(in)f(c)o(hapter)f(ten.)108 380 -y(Ob)s(ject-orien)o(ted)21 b(databases)f(require)i(structural)e(c)o(hanges)h -(for)f(man)o(y)g(of)g(the)h(same)f(reasons)g(that)37 437 y(ob)s(ject-orien)o -(ted)d(programs)e(do:)21 b(users)16 b(often)g(need)h(to)e(view)i(the)f(databa\ -se)g(sc)o(hema)g(\(structure\))f(di\013er-)37 493 y(en)o(tly)l(,)g(and)f(the) -g(same)f(user)h(ma)o(y)f(need)i(to)e(view)i(the)e(sc)o(hema)h(di\013eren)o -(tly)h(at)e(di\013eren)o(t)h(times.)20 b(The)14 b(issues)37 550 y(and)h(appro\ -ac)o(hes)f(for)g(sc)o(hema)g(ev)o(olution)i(in)f(ob)s(ject-orien)o(ted)f(data\ -bases)g(are)g(discussed)i(in)g([66)o(])e(and)g(the)37 606 y(references)i(ther\ -ein.)108 663 y(Sev)o(eral)g(e\013orts)e(ha)o(v)o(e)h(b)q(een)h(underw)o(a)o -(y)f(to)g(understand)h(go)q(o)q(d)f(st)o(yle)g(for)g(ob)s(ject-orien)o(ted)g -(programs,)37 719 y(to)c(supp)q(ort)f(their)h(ev)o(olution)h(and)f(reuse.)18 b -(Ro)q(c)o(hat)11 b([98)o(])f(discusses)i(the)f(imp)q(ortance)g(of)g(go)q(o)q -(d)f(programming)37 775 y(st)o(yle)i(in)h(Smalltalk)g(and)e(prop)q(oses)h(sev) -o(eral)g(seman)o(tic)g(and)g(syn)o(tactic)f(guidelines.)22 b(Lieb)q(erherr)13 -b(and)f(others)37 832 y(in)g(the)f(Demeter)g(pro)s(ject)f([71)o(])g(ha)o(v)o -(e)h(prop)q(osed)g(an)g(approac)o(h)f(for)h(hiding)h(the)f(structure)g(of)f -(a)h(class)g(in)h(order)37 888 y(to)18 b(increase)g(main)o(tainabilit)o(y)l -(.)30 b(Johnson)18 b(and)g(F)l(o)q(ote)g([59)o(])f(prop)q(ose)h(design)h(rule\ -s)f(to)g(supp)q(ort)g(reusable)37 945 y(classes.)33 b(The)20 b(authors)e(argu\ -e)h(that)g(restructuring)g(an)g(ob)s(ject-orien)o(ted)h(program)e(in)i(line)h -(with)e(these)37 1001 y(guidelines)f(will)f(impro)o(v)o(e)e(its)h(reusabilit) -o(y)g(and)g(main)o(tainabilit)o(y)l(.)108 1058 y(V)l(ery)k(recen)o(t)g(resear\ -c)o(h)g(has)f(in)o(v)o(estigated)h(some)g(of)f(the)h(issues)h(in)o(v)o(olv)o -(ed)f(in)h(restructuring)f(ob)s(ject)37 1114 y(orien)o(ted)d(programs)e([15)o -(,)g(31].)22 b(Those)16 b(e\013orts)f(ha)o(v)o(e)g(tended)i(to)e(fo)q(cus)i -(on)e(inheritance,)j(to)d(ac)o(hiev)o(e)i(suc)o(h)37 1171 y(goals)e(as)f(elim\ -inating)i(duplicate)h(de\014nitions)f(of)e(a)g(v)m(ariable)i(in)f(a)f(program\ -.)19 b(Refactoring)14 b(is)h(m)o(uc)o(h)g(more)37 1227 y(complex)g(that)e(thi\ -s,)h(ho)o(w)o(ev)o(er.)k(Refactoring)c(not)f(only)h(in)o(v)o(olv)o(es)h(manip\ -ulating)g(inheritance)g(hierarc)o(hies)37 1284 y(but)d(also)f(in)o(v)o(olv)o -(es)h(suc)o(h)f(tasks)g(as)g(renaming)g(a)g(class,)h(splitting)h(up)f(classes) -f(and)h(functions,)g(and)g(remo)o(ving)37 1340 y(conditional)i(statemen)o(ts.) -j(Also,)c(some)e(refactorings)g(in)o(v)o(olv)o(e)h(not)f(only)h(inheritance)i -(hierarc)o(hies)f(but)e(also)37 1396 y(instance)17 b(hierarc)o(hies,)f(where) -f(an)g(instance)h(of)f(one)g(class)h(is)g(a)f(comp)q(onen)o(t)g(of)g(another) -f(class)i([59)o(].)108 1453 y(The)j(follo)o(wing)h(c)o(hapter)f(in)o(tro)q -(duces)h(the)f(set)f(of)h(refactorings,)g(pro)o(viding)h(examples)g(of)e(the) -h(three)37 1509 y(high-lev)o(el)f(refactorings.)952 2760 y(11)g eop bop 37 353 -a fc(Chapter)35 b(3)37 560 y fb(Refactoring)42 b(Application)37 685 y(F)-10 b -(ramew)m(orks)37 926 y fd(3.1)70 b(Ob)t(ject-Orien)n(ted)20 b(Application)g -(F)-6 b(ramew)n(orks)37 1027 y fl(An)16 b(imp)q(ortan)o(t)e(ob)s(ject-orien)o -(ted)h(tec)o(hnique)h(to)f(facilitate)g(design-lev)o(el)j(reuse)d(is)g(an)g fi -(applic)n(ation)h(fr)n(ame-)37 1084 y(work,)22 b fl(whic)o(h)e(is)g(an)g(abst\ -ract)f(design)h(of)g(an)f(application,)j(consisting)f(of)e(an)h(abstract)e -(class)i(for)f(eac)o(h)37 1140 y(ma)s(jor)f(comp)q(onen)o(t.)30 b(F)l(ramew)o -(orks)17 b(are)i(an)g(emerging)g(tec)o(hnique;)i(there)e(is)g(still)h(m)o(uc) -o(h)f(to)f(b)q(e)h(learned)37 1197 y(concerning)e(the)e(design,)h(con\014gura\ -tion,)f(and)g(arc)o(hitecture-lev)o(el)i(description)g(of)d(framew)o(orks.)19 -b(Among)37 1253 y(the)d(earliest)h(examples)f(of)f(ob)s(ject-orien)o(ted)h -(application)h(framew)o(orks)d(w)o(ere)i(the)f(Lisa)i(T)l(o)q(olkit)f([57)o -(])f(and)37 1309 y(Smalltalk)f(Mo)q(del/View/Con)o(troller)f([48)o(].)18 b -(More)12 b(recen)o(tly)l(,)h(sev)o(eral)f(pro)s(jects)g(ha)o(v)o(e)f(b)q(een) -j(undertak)o(en)e(at)37 1366 y(the)k(Univ)o(ersit)o(y)g(of)f(Illinois)j(at)d -(Urbana-Champaign)h(to)f(design)h(framew)o(orks;)e(these)h(include)j(the)e fi -(T)m(yp)n(e)n(d)37 1422 y(Smal)r(ltalk)h fl(\(TS\))g(optimizing)i(compiler)f -(framew)o(ork)e(for)h(co)q(de)h(generation)f(and)h(optimization)g([60)o(],)f -(the)37 1479 y(F)o(OIBLE)d(framew)o(ork)d(for)h(visual)i(programming)f([58)o -(])f(and)h(the)g fi(Choic)n(es)f fl(ob)s(ject-orien)o(ted)g(op)q(erating)h -(sys-)37 1535 y(tem.)20 b fi(Choic)n(es,)13 b fl(written)i(in)g(C++,)g(is)g -(more)f(than)g(just)h(an)f(op)q(erating)h(system;)f(it)g(is)h(really)h(an)e -(op)q(erating)37 1592 y(system)k(framew)o(ork)f(consisting)h(of)g(in)o(terlo) -q(c)o(king)h(framew)o(orks)e(for)g(\014le)i(systems)e([77],)g(virtual)i(memor\ -y)37 1648 y([103)o(],)c(comm)o(unication)h([129)n(],)f(and)g(pro)q(cess)h(sc) -o(heduling)h([102)o(].)108 1705 y(Go)q(o)q(d)h(framew)o(orks)e(are)h(usually) -i(the)f(result)g(of)f(man)o(y)g(design)i(iterations)f(and)g(a)f(lot)h(of)f -(hard)g(w)o(ork)37 1761 y(in)o(v)o(olving)e(structural)d(c)o(hanges)h([59)o -(,)f(85].)19 b(These)13 b(c)o(hanges)g(ma)o(y)f(in)o(v)o(olv)o(e)h(a)f(single) -j(refactoring,)d(or)g(a)h(series)37 1818 y(of)e(related)g(refactorings.)18 b -(The)11 b(follo)o(wing)g(sections)g(describ)q(e)i(examples)e(of)f(sev)o(eral) -h(common)f(refactorings.)37 1874 y(They)i(are)e(mostly)h(based)g(on)g(the)g -(analysis)h(of)e(c)o(hanges)h(made)g(during)h(the)f(iterativ)o(e)g(design)h -(of)e(the)h fi(Choic)n(es)37 1930 y fl(\014le)i(system)f(framew)o(ork.)17 b -(That)11 b(analysis)i(w)o(as)e(based)h(on)g(a)f(series)h(of)g(t)o(w)o(elv)o -(e)f(snapshots)h(of)f(the)h(framew)o(ork)37 1987 y(co)o(v)o(ering)k(a)f(t)o -(w)o(o-y)o(ear)e(p)q(erio)q(d.)108 2043 y(T)l(o)19 b(motiv)m(ate)g(the)g(prac\ -tical)h(imp)q(ortance)f(of)g(refactoring)f(in)i(designing)h(application)f(fra\ -mew)o(orks,)37 2100 y(the)15 b(examples)h(presen)o(ted)f(in)g(the)g(c)o(hapte\ -r)f(are)g fi(r)n(e)n(al)p fl(;)g(that)g(is,)h(the)f(examples)i(describ)q(e)g -(refactorings)e(that)37 2156 y(w)o(ere)j(actually)g(applied)i(\(man)o(ually\)) -d(to)g(impro)o(v)o(e)h(application)h(framew)o(orks)d(in)i(the)g fi(Choic)n -(es)e fl(op)q(erating)37 2213 y(system)20 b(and)h fi(T)m(yp)n(e)n(d)e(Smal)r -(ltalk)h fl(pro)s(jects.)34 b(This)21 b(has)f(the)g(disadv)m(an)o(tage)g(that) -g(the)g(examples)h(include)37 2269 y(some)f(extraneous)f(detail)h(and)g(compl\ -exit)o(y)l(,)h(but)e(has)h(the)f(adv)m(an)o(tage)g(that)g(the)g(examples)h -(sho)o(w)f(ho)o(w)37 2326 y(refactorings)c(are)g(applied)i(in)f(actual)g(desi\ -gn)g(tasks.)962 2309 y fs(1)108 2382 y fl(The)e(relationships)h(among)d(class\ -es)i(b)q(ecome)g(more)f(explicit)i(and)f(their)g(in)o(terfaces)f(b)q(ecome)h -(more)f(ab-)37 2439 y(stract)e(as)h(a)g(framew)o(ork)e(matures.)18 b(A)12 b -(shallo)o(w)h(\(almost)e(\015at\))g(hierarc)o(h)o(y)i(of)e(classes)i(ev)o(olv) -o(es)f(in)o(to)g(a)f(deep)q(er)37 2522 y 750 2 v 89 2548 a fu(1)107 2564 y fp -(Chapter)16 b(nine)i(describ)q(es)g(t)o(w)o(o)e(simpler,)i(alb)q(eit)g(less)f -(practical,)i(examples)f(that)e(sho)o(w)h(ho)o(w)f(refactorings)i(de\014ned)g -(in)37 2610 y(earlier)d(c)o(hapters)f(can)f(b)q(e)h(used)f(together.)952 2760 -y fl(12)g eop bop 37 42 a fl(class)17 b(hierarc)o(h)o(y)l(.)23 b(Instance)17 b -(hierarc)o(hies)h(emerge,)e(where)g(an)g(instance)h(of)f(one)g(class)h(is)g -(a)f(comp)q(onen)o(t)g(of)37 98 y(another)j(class)g([59)o(].)30 b(Often,)20 b -(as)e(instance)i(hierarc)o(hies)g(are)e(de\014ned)i(the)f(inheritance)h(hiera\ -rc)o(hies)g(also)37 154 y(c)o(hange)e(and)g(b)q(ecome)h(easier)f(to)f(underst\ -and.)28 b(Refactorings)18 b(to)f(generalize)j(and)e(sp)q(ecialize)i(classes)f -(in)37 211 y(an)d(inheritance)g(hierarc)o(h)o(y)l(,)g(or)e(to)h(recognize)h -(and)f(restructure)g(instance)h(hierarc)o(hies,)g(can)f(supp)q(ort)g(this)37 -267 y(maturation)g(of)g(an)g(application)i(framew)o(ork.)37 411 y fd(3.2)70 b -(Refactoring)22 b(T)-6 b(o)23 b(Generalize:)k(Creating)22 b(An)h(Abstract)f -(Sup)r(er-)194 485 y(class)37 587 y fl(As)16 b(the)g(design)g(of)g(an)f(appli\ -cation)i(framew)o(ork)d(matures,)h(general)h(concepts)g(are)g(usually)h(deriv) -o(ed)f(from)37 643 y(sp)q(eci\014c)k(examples.)27 b(Often,)19 b(these)e(examp\ -les)i(are)e(implemen)o(ted)i(in)f(concrete)g(classes)g(that)f(in)o(tert)o(win\ -e)37 700 y(the)h(case-sp)q(eci\014c)h(b)q(eha)o(vior)f(with)g(more)e(general,) -i(common)f(abstractions.)26 b(As)17 b(common)g(abstractions)37 756 y(are)g -(determined,)g(it)g(is)g(useful)g(to)f(separate)g(these)h(abstractions)f(from) -f(the)i(example-sp)q(eci\014c)i(b)q(eha)o(vior.)37 813 y(One)d(w)o(a)o(y)d -(to)h(do)g(this)h(is)g(to)f(de\014ne)h(an)f(abstract)g(sup)q(erclass)h(for)f -(a)g(set)g(of)g(concrete)h(classes,)f(and)h(migrate)37 869 y(the)j(common)f -(b)q(eha)o(vior)h(to)e(that)h(sup)q(erclass.)27 b(This)18 b(refactoring)f(not) -g(only)g(clari\014es)i(the)e(design)i(of)d(the)37 925 y(framew)o(ork,)10 b -(but)h(b)q(etter)f(ensures)h(consistency)h(b)o(y)e(de\014ning)i(the)e(abstrac\ -tion)g(in)i(one)e(place.)20 b(The)10 b(concrete)37 982 y(classes)16 b(retain) -g(the)f(b)q(eha)o(vior,)g(although)h(it)f(is)h(no)o(w)f(inherited)i(rather)d -(than)h(b)q(eing)i(lo)q(cally)g(de\014ned.)108 1038 y(Abstract)d(classes)i -(represen)o(t)f(the)g fi(pr)n(oto)n(c)n(ol)g fl(of)f(an)h(ob)s(ject,)g(whic)o -(h)g(is)h(a)f(k)o(ey)g(part)f(of)h(its)g(sp)q(eci\014cation.)37 1095 y(An)20 b -(ob)s(ject's)e(proto)q(col)h(is)g(the)g(set)g(of)f(messages)h(that)f(it)h(wil\ -l)i(accept.)1308 1078 y fs(2)1359 1095 y fl(Standard)e(proto)q(cols)f(supp)q -(ort)37 1151 y(in)o(terc)o(hangeable)f(comp)q(onen)o(ts)e(and)g(assist)g(prog\ -rammers)f(in)i(comm)o(unicating)g(with)g(one)f(another.)108 1208 y(Abstract)d -(classes)h(nev)o(er)g(ha)o(v)o(e)f(instances,)i(and)e(often)h(do)f(not)h(ha)o -(v)o(e)f(instance)h(v)m(ariables.)20 b(They)13 b(de\014ne)37 1264 y fi(b)n -(ehavior)21 b fl(in)h(terms)e(of)g(a)g(few)h(unde\014ned)h(metho)q(ds)f(imple\ -men)o(ted)h(in)g(the)e(sub)q(classes.)37 b(In)22 b(a)e(mature)37 1321 y(inher\ -itance)f(hierarc)o(h)o(y)l(,)f(the)f(leaf)g(classes)g(are)g(concrete)g(and)g -(the)g(classes)h(closer)f(to)f(the)h(ro)q(ot)f(are)h(more)37 1377 y(abstract.) -i(When)14 b(de\014ning)h(a)f(new)g(class,)g(it)g(is)g(usually)i(desirable)f -(to)e(inherit)i(from)e(an)h(abstract)f(class,)h(to)37 1434 y(inherit)j(the)e -(proto)q(col)h(but)f(not)g(b)q(e)h(tied)f(to)g(a)g(particular)h(data)e(repres\ -en)o(tation.)108 1490 y(Creating)g(an)g(abstract)g(class)g(is)h(imp)q(ortan)o -(t)f(but)g(not)g(easy)l(.)20 b(Bec)o(k)14 b(observ)o(ed)g(that,)g(among)f(Sma\ -lltalk)37 1546 y(researc)o(hers,)21 b(useful)f(abstractions)g(are)f(usually)i -(created)f(b)o(y)f(programmers)g(who)g(are)h(willing)h(to)f(redo)37 1603 y -(their)15 b(co)q(de)g(sev)o(eral)f(times)h(to)e(pro)q(duce)i(easy-to-understa\ -nd)g(and)f(easy-to-sp)q(ecialize)j(classes)d([86)o(].)20 b(Cre-)37 1659 y(ati\ -ng)c(reusable)h(abstract)d(classes)j(often)e(in)o(v)o(olv)o(es)h(examining)h -(an)f(existing)g(implemen)o(tation)h(to)e(\014nd)i(an)37 1716 y(abstraction)c -(hidden)j(in)e(a)f(concrete)g(class)h(\(or)e(classes\),)i(and)g(reorganizing) -g(the)f(class)h(hierarc)o(h)o(y)f(to)g(mak)o(e)37 1772 y(that)i(abstraction)g -(explicit)i([59)o(].)108 1829 y(Consider)f(the)f(example,)g(sho)o(wn)g(in)g -(Figure)g(3.1,)f(of)g(an)h(abstract)f(class)h(created)g(for)g(the)g fi(Choic) -n(es)e fl(\014le)37 1885 y(system)18 b(framew)o(ork)e([76)o(].)26 b(One)18 b -(of)f(the)h(cen)o(tral)f(classes)h(in)h(that)d(framew)o(ork)1425 1869 y fs -(3)1461 1885 y fl(is)i ff(Memo)o(r)o(yObject)e fl([104)o(].)37 1942 y(A)f ff -(Memo)o(r)o(yObject)f fl(is)h(a)g(sequence)h(of)e(iden)o(tically)j(sized)f -(blo)q(c)o(ks.)21 b(It)14 b(also)h(is)g(resp)q(onsible)i(for)d(main)o(taining) -37 1998 y(the)20 b(n)o(um)o(b)q(er)h(of)e(blo)q(c)o(ks)i(it)f(con)o(tains.)34 -b(The)20 b(k)o(ey)g(op)q(erations)g(pro)o(vided)g(b)o(y)g ff(Memo)o(r)o(yObje\ -cts)f fl(are)h fi(r)n(e)n(ad)p fl(,)37 2055 y fi(write)p fl(,)d(and)g fi(size) -p fl(.)23 b(Man)o(y)16 b(parts)g(of)g(the)g(\014le)i(system)e(are)g ff(Memo)o -(r)o(yObjects)p fl(,)g(suc)o(h)h(as)f(\014les)i(and)f(disks.)24 b(An)37 2111 y -ff(Ino)q(de)140 2095 y fs(4)177 2111 y fl(con)o(tains)16 b(a)g(description)h -(of)f(the)g(disk)h(la)o(y)o(out)e(of)h(a)f(\014le)i(and)g(other)e(information) -h(suc)o(h)h(as)e(the)h(\014le)37 2167 y(o)o(wner,)d(access)g(p)q(ermissions)i -(and)e(access)g(times)h([6)o(].)19 b(In)14 b(the)f fi(Choic)n(es)f fl(\014le) -i(system)f(framew)o(ork,)e ff(Ino)q(de)j fl(w)o(as)37 2224 y(represen)o(ted)i -(as)f(a)g(sub)q(class)h(of)f ff(Memo)n(ryObject)p fl(.)37 2305 y 750 2 v 89 -2332 a fu(2)107 2348 y fp(The)e(sp)q(eci\014cation)i(of)e(an)g(ob)r(ject)h -(also)g(includes)h(class)f(in)o(v)n(arian)o(ts)i(and)d(the)g(relationshi)q -(ps)j(with)d(other)h(ob)r(jects.)89 2378 y fu(3)107 2393 y fp(The)g(\014le)h -(system)g(has)g(a)f(la)o(y)o(ered)i(structure)f(that)g(is)g(m)o(uc)o(h)g(more) -f(comprehensiv)o(e)j(than)e(what)g(is)g(presen)o(ted)g(here;)g(see)37 2439 y -([76)q(].)89 2469 y fu(4)107 2485 y fp(Ino)q(de)f(is)g(standard)g(UNIX)523 -2468 y fw(R)514 2469 y fn(\015)565 2485 y fp(op)q(erating)h(system)f(terminol\ -ogy;)i(it)d(is)h(a)g(con)o(traction)h(of)e(the)g(term)h fm(index)e(no)n(de.)k -fp(UNIX)37 2530 y(is)e(a)f(registered)h(trademark)g(of)f(UNIX)f(Systems)i(Lab) -q(oratories,)g(Inc.)952 2760 y fl(13)g eop bop 327 0 a - 20458128 16050749 10196172 19076710 30654300 35127459 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Times-Bold Helvetica-Bold -%%Pages: 1 -%%BoundingBox: 155 290 466 534 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t u -%I -525 453 525 453 Line -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 67.2285 -4.33734 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 142 666 ] concat -%I -[ -(BEFORE:) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 131 631 ] concat -%I -[ -(MemoryObject) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 5 6 ] concat -%I -155 626 155 626 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 6 6 ] concat -%I -167 613 167 575 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 155 578 ] concat -%I -[ -(Inode \(BSD\)) -] Text -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 457.217 660.988 ] concat -%I -[ -(DURING:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 313.048 15.494 ] concat -%I -155 626 155 626 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 406.048 573.952 ] concat -%I -[ -(BSDInode) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 489.048 574.952 ] concat -%I -[ -(SystemVInode) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -40.952 45.9518 ] concat -%I -510 565 471 532 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -34.952 46.9518 ] concat -%I -518 566 565 530 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -34.952 46.9518 ] concat -%I -529 560 529 560 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 441.53 627.036 ] concat -%I -[ -(MemoryObject) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 13.012 -6.50604 ] concat - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 1.08434 122.53 ] concat -%I -267 437 351 437 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 292.578 613.976 ] concat -%I -[ -(Steps 1 & 2:) -] Text -End - -End %I eop - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -21.687 42.2891 ] concat - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t u -%I -472 439 472 439 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 331.108 475.241 ] concat -%I -[ -(AFTER:) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 316.108 441.241 ] concat -%I -[ -(MemoryObject) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 189.108 -176.759 ] concat -%I -155 626 155 626 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 282.108 337.241 ] concat -%I -[ -(BSDInode) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 365.108 338.241 ] concat -%I -[ -(SystemVInode) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -164.892 -190.759 ] concat -%I -510 565 471 532 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -158.892 -189.759 ] concat -%I -518 566 565 530 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -158.892 -189.759 ] concat -%I -529 560 529 560 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 337.108 389.241 ] concat -%I -[ -(Inode) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 188.108 -184.759 ] concat -%I -167 613 167 575 Line -End - -End %I eop - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -1.08435 -15.1808 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 464.228 530.808 ] concat -%I -[ -(Steps 3 & 4:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 3.25301 135.542 ] concat -%I -449 384 391 345 Line -End - -End %I eop - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 514 1145 a fh(Figure)18 b(3.1)p fl(:)h(Creating)c(An)h(Abstrac\ -t)e(Sup)q(erclass)108 1278 y(An)j(early)f(v)o(ersion)h(of)f(the)g fi(Choic)n -(es)f fl(\014le)j(system)d(framew)o(ork)g(only)i(supp)q(orted)g(the)f(BSD)h -(UNIX)g([37)o(])37 1334 y(op)q(erating)f(system)g(functions)g(and)g(formats.) -k(Th)o(us,)c(instances)g(of)g(the)f ff(Ino)q(de)i fl(class)f(represen)o(ted)g -(ino)q(des)37 1391 y(for)f(BSD)h(UNIX)g(\014le)g(systems.)21 b(A)15 b(series) -h(of)f(c)o(hanges,)g(sho)o(wn)g(in)i(Figure)e(3.1,)f(w)o(ere)i(made)f(to)g -(generalize)37 1447 y(the)h ff(Ino)q(de)g fl(class)f(in)h(order)f(to)g(supp)q -(ort)g(b)q(oth)g(BSD)h(UNIX)g(and)f(UNIX)h(System)f(V)g([5])f(\014le)j(format\ -s:)93 1554 y(1.)22 b(the)15 b ff(Ino)q(de)h fl(class)g(w)o(as)e(renamed)i(to) -e ff(BSDIno)q(de)p fl(,)93 1647 y(2.)22 b(the)14 b ff(SystemVIno)q(de)f fl -(class)h(w)o(as)f(added)h(as)g(a)f(sub)q(class)i(of)e ff(Memo)o(r)o(yObject;) -g fl(v)m(ariables)i(and)f(functions)151 1704 y(w)o(ere)h(copied)h(from)f(the) -g ff(BSDIno)q(de)i fl(class,)e(and)g(mo)q(di\014ed,)93 1798 y(3.)22 b(the)14 b -ff(Ino)q(de)h fl(class)g(w)o(as)e(added)i(as)f(a)f(sub)q(class)j(of)d ff(Memo) -o(r)o(yObject)g fl(and)i(as)e(an)i(abstract)e(sup)q(erclass)i(of)151 1854 y ff -(BSDIno)q(de)h fl(and)g ff(SystemVIno)q(de)p fl(,)93 1948 y(4.)22 b(the)14 b -(v)m(ariables)i(and)e(functions)h(common)f(to)g ff(BSDIno)q(de)h fl(and)g ff -(SystemVIno)q(de)e fl(w)o(ere)h(migrated)g(up)h(to)151 2004 y(their)h(common) -f(sup)q(erclass.)108 2111 y(During)e(the)g(fourth)g(step,)g(b)q(efore)g(some) -g(of)f(the)i(common)e(mem)o(b)q(ers)h(could)h(b)q(e)g(mo)o(v)o(ed,)e(sev)o -(eral)h(struc-)37 2167 y(tural)h(mo)q(di\014cations)h(to)f(the)f(sub)q(classe\ -s)j(w)o(ere)d(needed.)21 b(F)l(or)13 b(example,)i(o)o(v)o(er)e(90)g(p)q(ercen) -o(t)h(of)g(the)g(co)q(de)g(for)37 2224 y(the)h fi(mapUnit)f fl(function)h(in) -h(the)e ff(SystemVIno)q(de)g fl(class)g(w)o(as)g(the)g(same)g(as)g(the)h fi -(mapUnit)f fl(function)h(de\014ned)37 2280 y(in)k(the)e ff(BSDIno)q(de)h fl -(class.)27 b(Ho)o(w)o(ev)o(er,)16 b(the)h(co)q(de)h(for)f(getting)g(and)g(set\ -ting)g(a)g(logical)i(blo)q(c)o(k)f(n)o(um)o(b)q(er)f(w)o(as)37 2337 y(di\013e\ -ren)o(t)g(b)q(et)o(w)o(een)f(the)g(t)o(w)o(o)e(\014le)j(system)e(formats,)g -(hence)h(there)g(w)o(ere)g(a)f(few)h(di\013erences)h(in)g(the)f(imple-)37 2393 -y(men)o(tation)g(of)f(the)h fi(mapUnit)g fl(functions.)22 b(Before)16 b(the)g -(function)h(could)g(b)q(e)f(migrated)g(to)f(the)h(sup)q(erclass,)37 2449 y -(these)e(di\013erences)g(needed)h(to)e(b)q(e)h(tak)o(en)f(out)f(of)h(the)h -(sub)q(class)g(de\014nitions)h(of)e(the)g fi(mapUnit)h fl(function.)20 b(T)l -(o)37 2506 y(handle)d(this,)e(the)h(follo)o(wing)f(structural)h(c)o(hanges)f -(w)o(ere)g(made:)55 2600 y fh(4a\))24 b fl(new)15 b(functions)h(w)o(ere)f(de\ -\014ned)h(in)g(eac)o(h)g(sub)q(class)g(to)f(capture)g(the)g(di\013erences)952 -2760 y(14)g eop bop 55 42 a fh(4b\))23 b fl(in)e(the)f(de\014nitions)i(of)d -(the)h fi(mapUnit)g fl(function,)i(the)e(di\013ering)g(co)q(de)h(w)o(as)e(rep\ -laced)i(b)o(y)f(calls)h(to)151 98 y(these)16 b(functions.)55 192 y fh(4c\))23 -b fl(the)15 b(sub)q(class)h(de\014nitions)g(of)e(the)h fi(mapUnit)f fl(functi\ -on)i(no)o(w)e(matc)o(hed,)g(and)h(the)g(function)g(could)h(b)q(e)151 248 y -(migrated)f(to)g(the)g(sup)q(erclass.)108 342 y(Note)e(that)g(of)g(the)h(four) -f(steps)h(listed)h(ab)q(o)o(v)o(e)e(for)g(de\014ning)i(the)e(abstract)g(class) -h(and)g(adding)g(System)f(V)37 399 y(features,)k(only)g(in)g(step)g(t)o(w)o -(o)e(w)o(as)h(the)g(functionalit)o(y)i(of)e(the)h(system)f(c)o(hanged.)24 b -(The)17 b(other)f(three)h(steps)37 455 y(w)o(ere)i(refactorings.)29 b(Step)19 -b(one,)g(where)f(the)h(class)g(w)o(as)e(renamed,)j(w)o(as)d(clearly)j(needed) -g(to)d(distinguish)37 511 y(the)d(old)h(\014le)g(format)d(from)h(the)h(new)h -(format,)d(added)j(in)f(step)g(t)o(w)o(o.)k(Steps)c(three)g(and)g(four)g(adde\ -d)g(no)g(new)37 568 y(features)h(to)f(the)i(system,)e(but)h(w)o(ere)g(applied) -i(to)d(pro)q(duce)i(an)f(abstraction)f(that)h(allo)o(w)o(ed)g(additional)h -(\014le)37 624 y(system)e(formats)e(to)i(b)q(e)g(more)g(easily)h(added)f(late\ -r.)20 b(The)14 b(\014le)h(system)e(framew)o(ork)g(follo)o(w)o(ed)h(an)g(ev)o -(olution)37 681 y(t)o(ypical)19 b(of)e(application)i(framew)o(orks:)24 b(as) -17 b(the)h(framew)o(ork)e(matured)h(and)h(reusable)h(abstractions)e(w)o(ere) -37 737 y(made)e(explicit,)h(new)e(features)f(suc)o(h)i(as)e(supp)q(ort)h(for) -g(the)g ff(MS-DOS)1231 721 y fw(TM)1304 737 y fl(\014le)h(system)f(format)e -(and)i(supp)q(ort)37 794 y(for)h(p)q(ersisten)o(t)h(ob)s(jects)e(w)o(ere)h -(more)g(easily)h(in)o(tegrated)f(in)o(to)g(the)h(framew)o(ork)1411 777 y fs -(5)1429 794 y fl(.)108 850 y(Note)e(also)g(that)f(in)i(the)f(ab)q(o)o(v)o(e)g -(example,)h(steps)f(three)g(and)g(four)g(could)h(ha)o(v)o(e)f(come)g(b)q(efor\ -e)g(step)g(t)o(w)o(o;)37 907 y(an)20 b(abstract)e(sup)q(erclass)i(could)g(ha) -o(v)o(e)f(b)q(een)h(de\014ned)g(and)g(some)e(mem)o(b)q(ers)i(migrated)f(b)q -(efore)g(the)g(new)37 963 y(class)i(w)o(as)e(added.)34 b(The)20 b(imp)q(ortan) -o(t)g(p)q(oin)o(t)g(here)g(is)h(that)e(restructurings)h(are)f(a)h(critical)h -(part)f(of)f(this)37 1020 y(high-lev)o(el)g(op)q(eration,)d(and)h(that)e(the) -i(refactorings)e(can)i(b)q(e)g(separated)f(from)f(the)h(op)q(erations)h(that) -e(add)37 1076 y(or)g(c)o(hange)g(functionalit)o(y)i(in)f(the)f(implemen)o(tat\ -ion.)108 1132 y(Chapter)g(six)h(de\014nes)g(the)f(high-lev)o(el)j(op)q(eratio\ -ns)d(for)g(de\014ning)h(an)f(abstract)g(sup)q(erclass.)37 1276 y fd(3.3)70 b -(Refactoring)33 b(T)-6 b(o)34 b(Sp)r(ecializ)o(e:)48 b(Sub)r(classing)33 b -(and)i(Simplifyi)o(ng)194 1350 y(Conditionals)37 1452 y fl(Sometimes)14 b(a)f -(program)f(con)o(tains)h(a)g(class)g(that)g(em)o(b)q(o)q(dies)h(a)f(general)h -(abstraction)e(and)i fi(sever)n(al)f(di\013er)n(ent)37 1508 y fl(concrete)23 b -(cases.)40 b(In)23 b(this)f(case,)i(the)e(design)h(of)f(an)g(application)i -(framew)o(ork)c(ma)o(y)i(b)q(e)g(impro)o(v)o(ed)h(b)o(y)37 1565 y(sp)q(eciali\ -zi)q(ng;)k(that)21 b(is,)j(b)o(y)e(de\014ning)h(sub)q(classes)g(corresp)q(ond\ -ing)g(to)e(the)h(cases,)h(and)f(migrating)f(case)37 1621 y(sp)q(eci\014c)d -(b)q(eha)o(vior)d(do)o(wn)g(to)g(the)g(sub)q(classes.)108 1678 y(In)o(teresti\ -ngly)l(,)25 b(while)f(refactoring)f(to)e(sp)q(ecialize)26 b(is)d(di\013eren)o -(t)g(in)g(sev)o(eral)g(imp)q(ortan)o(t)f(w)o(a)o(ys)f(from)37 1734 y(refactor\ -ing)h(to)g(generalize)i(\(discussed)f(in)g(the)g(prior)f(section\),)i(the)e -(end)h(results)g(of)f(applying)h(these)37 1791 y(t)o(w)o(o)18 b(refactorings) -h(are)f(v)o(ery)h(similar.)32 b(Generalizing)21 b(using)f(abstract)d(classes,) -j(and)g(sp)q(ecializing)i(using)37 1847 y(sub)q(classing,)c(b)q(oth)e(can)g -(b)q(e)h(used)f(to)g(capture)g(a)f(common)h(abstraction)g(in)g(an)g(abstract) -f(sup)q(erclass)i(and)37 1903 y(capture)f(the)f(case-sp)q(eci\014c)i(b)q(eha) -o(vior)f(in)g(the)f(sub)q(classes.)108 1960 y(In)i(order)f(to)g(appreciate)h -(the)g(need)g(for)f(this)g(refactoring,)g(it)h(is)g(imp)q(ortan)o(t)f(to)g -(understand)h(the)f(role)37 2016 y(of)f(subt)o(yping)g(for)f(sp)q(ecializatio\ -n.)23 b(A)14 b fi(typ)n(e)h fl(c)o(haracterizes)g(the)g(b)q(eha)o(vior)g(of)g -(its)f(instances)i(b)o(y)f(describing)37 2073 y(the)k(op)q(erations)f(that)f -(can)h(manipulate)h(those)f(ob)s(jects)f([53)o(].)28 b(A)18 b(program)f(with) -h(a)g(w)o(ell-designed)i(t)o(yp)q(e)37 2129 y(structure)c(will)h(minimize)h -(and)d(lo)q(calize)j(the)d(dep)q(endencie)q(s)j(among)d(t)o(yp)q(es,)g(enhanc\ -ing)i(main)o(tainabilit)o(y)37 2186 y(and)11 b(extensibilit)o(y)l(.)21 b(A)11 -b fi(typ)n(e)h(hier)n(ar)n(chy)f fl(is)g(comp)q(osed)g(of)f(subt)o(yp)q(es)h -(and)f(sup)q(ert)o(yp)q(es.)19 b(The)11 b(in)o(tuitiv)o(e)h(notion)37 2242 y -(of)i(a)g(subt)o(yp)q(e)g(is)h(one)f(whose)g(ob)s(jects)f(pro)o(vide)i(all)g -(the)f(b)q(eha)o(vior)h(of)e(another)h(t)o(yp)q(e)g(\(the)g(sup)q(ert)o(yp)q -(e\))g(plus)37 2299 y(something)19 b(extra.)29 b(Subt)o(yping)20 b(is)f(most) -f(frequen)o(tly)h(used)g(to)f(mo)q(del)h(conceptual)h(hierarc)o(hies.)31 b -(When)37 2355 y(used)14 b(in)h(this)e(w)o(a)o(y)l(,)g(a)g(subt)o(yp)q(e)h(des\ -crib)q(es)h(a)e(t)o(yp)q(e)g(that)g(is)h(more)f(sp)q(eci\014c)i(than)e(a)g -(sup)q(ert)o(yp)q(e;)i(the)e(subt)o(yp)q(e)37 2412 y(is)j(a)f(sp)q(ecializati\ -on)j(of)d(the)g(sup)q(ert)o(yp)q(e)h([53)o(,)f(74)o(].)37 2495 y 750 2 v 89 -2522 a fu(5)107 2538 y fp(MS-DOS)e(is)h(a)f(trademark)h(of)e(Microsoft)i(Corp) -q(oration.)952 2760 y fl(15)g eop bop 108 42 a fl(Inheritance)15 b(can)e(b)q -(e)g(used)h(in)g(sev)o(eral)f(w)o(a)o(ys;)f(some)h(clarify)h(the)f(design)h -(of)e(a)h(framew)o(ork)e(while)k(others)37 98 y(can)k(mak)o(e)f(a)h(framew)o -(ork)e(more)h(di\016cult)i(to)f(understand.)30 b(One)20 b(use)f(of)f(inherita\ -nce)j(is)e(to)f(mo)q(del)h(the)37 154 y(t)o(yp)q(e)f(hierarc)o(h)o(y)f(-)g -(that)g(is,)g(represen)o(t)g(the)g(sup)q(ert)o(yp)q(e)h(as)f(a)g(sup)q(erclas\ -s)h(and)f(a)g(subt)o(yp)q(e)g(as)g(a)g(sub)q(class.)37 211 y(Ho)o(w)o(ev)o -(er,)k(inheritance)h(can)e(b)q(e)h(used)g(in)g(other)f(w)o(a)o(ys.)35 b(Inher\ -itance)22 b(is)e(sometimes)h(used)g(to)e(supp)q(ort)37 267 y(programming-b)o -(y-di\013erence,)e(where)f(the)g(programmer)f(dev)o(elops)i(a)e(new)h(class)h -(b)o(y)e(c)o(ho)q(osing)i(a)e(similar)37 324 y(existing)j(class,)g(inheriting) -h(implemen)o(tation)f(from)e(it)h(and)g(implemen)o(ting)i(the)e(di\013erences) -h(in)g(the)f(new)37 380 y(sub)q(class.)k(In)15 b(this)g(case,)f(the)g(sub)q -(class)i(ma)o(y)d(not)h(b)q(e)h(a)f(sp)q(ecialization)j(of)d(the)g(sup)q(ercl\ -ass)i(-)e(the)g(resulting)37 437 y(class)20 b(hierarc)o(h)o(y)f(ma)o(y)g(not) -g(mo)q(del)h(an)o(y)e(meaningful)j(concept)e(\(other)g(than)g(exp)q(edien)o -(t)i(co)q(de)e(cop)o(ying\))37 493 y(and)d(can)f(b)q(e)h(di\016cult)h(to)d -(understand.)108 550 y(Lisk)o(o)o(v)f([74)o(])f(argues)g(that)f(using)i(inher\ -itance)h(to)e(mo)q(del)h(the)g(t)o(yp)q(e)f(hierarc)o(h)o(y)h(supp)q(orts)f -(data)g(abstrac-)37 606 y(tion,)19 b(whic)o(h)g(can)f(simplify)h(program)e -(main)o(tenance.)29 b(Lisk)o(o)o(v)18 b(notes)g(sev)o(eral)g(uses)g(of)f(sup) -q(ert)o(yping)i(and)37 663 y(subt)o(yping)d(in)g(ob)s(ject-orien)o(ted)g(syst\ -ems,)e(including:)106 756 y fj(\017)22 b fl(de\014ning)17 b(a)d(sup)q(ert)o -(yp)q(e)i(to)e(capture)h(the)h(design)f(insigh)o(t)h(that)e(a)h(set)g(of)f -(existing)i(t)o(yp)q(es)f(are)g(related)106 850 y fj(\017)22 b fl(incremen)o -(tally)d(re\014ning)g(the)f(design)g(of)f(a)h(system)f(b)o(y)g(in)o(tro)q(duc\ -ing)i(subt)o(yp)q(e\(s\))f(that)e(are)i(re\014ne-)151 907 y(men)o(ts)d(of)g -(a)g(common)f(abstraction.)108 1000 y(Exp)q(erience)f(with)f(ob)s(ject-orien) -o(ted)g(application)h(framew)o(orks)d(has)h(suggested)h(that,)f(while)i(subt) -o(yping)37 1057 y(is)h(useful)h(for)e(sp)q(ecializing,)j(the)e(class)f(b)q -(eing)i(sp)q(ecialized)h(often)e(do)q(es)f(not)g(start)f(out)h(b)q(eing)i(abs\ -tract,)d(but)37 1113 y(rather)17 b(is)g(a)f(concrete)h(class)g(that)f(con)o -(tains)h(a)g(reusable)g(abstraction.)24 b(A)17 b(class)g(sometimes)g(em)o(b)q -(o)q(dies)h(a)37 1170 y(general)d(abstraction)f(and)h fi(sever)n(al)f(di\013e\ -r)n(ent)g fl(concrete)g(cases)g(whic)o(h)h(are)f(candidates)i(for)d(sp)q(ecia\ -lization.)37 1226 y(Often)g(the)f(b)q(eha)o(vior)g(that)g(distinguishes)i(the) -e(concrete)g(examples)h(is)f(enco)q(ded)i(on)d(the)h(state)g(of)f(an)h(ob)s -(ject)37 1283 y(as)h(\015ags,)g(tags)g(and)g(conditions.)20 b(As)14 b(Stroust\ -up)f(notes)g(in)h([114)o(],)f(represen)o(ting)g(the)h(b)q(eha)o(vior)g(in)g -(this)f(w)o(a)o(y)37 1339 y(ma)o(y)h(w)o(ork)g(\014ne)h(for)f(small)h(program\ -s)e(written)h(b)o(y)h(a)f(single)i(p)q(erson,)e(but)h(has)f(a)g(fundamen)o -(tal)h(w)o(eakness:)37 1396 y(it)j(dep)q(ends)h(on)e(the)h(programmer)e(manip\ -ulating)j(the)e(sp)q(ecializations)j(\(t)o(yp)q(es\))d(in)h(a)f(w)o(a)o(y)f -(that)h(cannot)37 1452 y(b)q(e)g(c)o(hec)o(k)o(ed)f(b)o(y)f(the)g(compiler.) -22 b(Problems)16 b(arise)g(if)g(the)f(programmer)f(fails)j(to)d(test)h(a)g -(t)o(yp)q(e)h(\015ag,)f(or)g(fails)37 1509 y(to)h(include)j(all)e(the)g(t)o -(yp)q(es)f(in)h(conditional)h(statemen)o(ts.)23 b(Co)q(de)16 b(that)g(include\ -s)j(the)d(explicit)j(conditional)37 1565 y(tests)c(can)g(b)q(e)h(large)g(and) -f(di\016cult)i(to)d(read.)108 1621 y(When)e(the)f(functions)h(de\014ned)g(in) -g(a)f(class)g(ha)o(v)o(e)g(conditional)i(statemen)o(ts)d(that)g(eac)o(h)h(tes\ -t)g(for)g(the)g(same)37 1678 y(set)19 b(of)g(conditions,)h(this)f(ma)o(y)g -(suggest)f(that)g(sub)q(classes)i(should)g(b)q(e)f(de\014ned)i(corresp)q(ondi\ -ng)e(to)g(those)37 1734 y(conditions.)j(Or,)15 b(stated)g(more)g(precisely)l -(,)i(when)e(the)h(functions)g(de\014ned)h(in)f(the)f(class)h(ha)o(v)o(e)f(con\ -ditional)37 1791 y(statemen)o(ts)i(that)g(eac)o(h)h(test)f(for)h(the)f(same)h -(set)g(of)f(conditions,)i(a)f(set)f(of)h(sub)q(classes)h(could)g(b)q(e)f(de\ -\014ned)37 1847 y(eac)o(h)g(of)f(whose)h(corresp)q(onding)g(abstraction)g(imp\ -lies)h(an)f(elemen)o(t)g(in)h(the)e(set)h(of)f(conditions.)28 b(In)18 b(eac)o -(h)37 1904 y(newly)e(de\014ned)g(sub)q(class,)f(the)f(functions)h(can)g(b)q -(e)g(simpli\014ed)i(b)o(y)d(replacing)i(the)f(conditional)h(statemen)o(ts)37 -1960 y(with)g(just)f(the)g(co)q(de)h(segmen)o(t)f(for)f(the)i(condition)g(cor\ -resp)q(onding)g(to)f(\(implied)i(b)o(y\))e(the)g(sub)q(class.)108 2017 y(Ther\ -e)d(are)g(sev)o(eral)g(examples)h(of)f(this)g(t)o(yp)q(e)g(of)g(restructuring) -g(that)f(o)q(ccurred)i(in)g(the)f fi(T)m(yp)n(e)n(d)g(Smal)r(ltalk)37 2073 y -fl([60])f(pro)s(ject)f(and)i(the)g fi(Choic)n(es)e fl(op)q(erating)i(system)f -(pro)s(ject;)g(it)h(w)o(as)f(also)g(useful)i(in)f(con)o(v)o(erting)f(a)h(prog\ -ram)37 2130 y(written)k(in)g(the)f(C)g(programming)g(language)g(to)g(C++.)108 -2186 y(The)h fi(T)m(yp)n(e)n(d)f(Smal)r(ltalk)g fl(\(TS\))f(pro)s(ject)h(is)h -(dev)o(eloping)h(an)e(optimizing)i(compiler)g(for)d(a)i(t)o(yp)q(ed)f(v)o(ers\ -ion)37 2242 y(of)i(Smalltalk.)25 b(In)17 b(the)f(TS)h(compiler,)h(instances)f -(of)f(the)h ff(Flo)o(wNo)q(de)g fl(class,)f(represen)o(ting)i(a)e(basic)h(blo) -q(c)o(k,)37 2299 y(are)g(con)o(tainers)g(of)g(a)f(sequence)i(of)f(straigh)o -(t)f(line)j(co)q(de)e(\(assignmen)o(ts\))f(ending)i(with)g(a)e(statemen)o(t)g -(that)37 2355 y(alters)h(the)f(\015o)o(w)f(of)h(con)o(trol.)23 b(The)16 b(end\ -ing)h(statemen)o(t)e(in)i(the)g(sequence)g(could)g(b)q(e)g(a)f(return)g(state\ -men)o(t,)37 2412 y(a)21 b(conditional)h(jump)e(statemen)o(t)g(or)g(an)g(uncon\ -ditional)j(jump)e(statemen)o(t.)34 b(As)21 b(the)f(implemen)o(tation)37 2468 y -(progressed,)g(sev)o(eral)f(functions)g(needed)h(to)f(test)f(the)h(t)o(yp)q -(e)g(of)f(the)h(ending)h(statemen)o(t.)30 b(F)l(or)18 b(example,)37 2525 y -(one)h(function)g(tested)g(if)g(the)f(ending)i(statemen)o(t)d(w)o(as)h(a)g -(conditional)i(jump;)g(if)f(so,)f(and)h(the)f(condition)37 2581 y(w)o(as)h -(an)g(in)o(v)m(arian)o(t)h(for)f(the)g(en)o(tire)h(sequence)g(represen)o(ted) -g(b)o(y)f(the)h ff(Flo)o(wNo)q(de)p fl(,)g(the)f(conditional)i(jump)952 2760 y -(16)g eop bop 37 42 a fl(could)22 b(b)q(e)f(con)o(v)o(erted)f(to)g(an)g(uncon\ -ditional)j(jump.)35 b(Another)21 b(function)g(tested)f(whether)h(the)f(ending) -37 98 y(statemen)o(t)e(w)o(as)g(an)g(unconditional)j(jump)e(to)f(a)g(sequence) -i(represen)o(ted)f(b)o(y)f(another)g ff(Flo)o(wNo)q(de)p fl(;)i(if)f(so,)37 -154 y(the)d(t)o(w)o(o)e ff(Flo)o(wNo)q(des)h fl(could)i(b)q(e)e(merged)h(and) -f(replaced)h(b)o(y)g(a)e(single)j ff(Flo)o(wNo)q(de)p fl(.)108 211 y(In)d(the) -g(early)g(designs,)h(it)f(had)g(not)f(b)q(een)i(clear)f(that)f(the)h(t)o(yp)q -(e)g(of)f(the)h(ending)h(statemen)o(t)d(w)o(as)h(an)h(im-)37 267 y(p)q(ortan) -o(t)g(discriminator)i(among)e ff(Flo)o(wNo)q(des)p fl(.)20 b(Ho)o(w)o(ev)o -(er,)14 b(as)g(the)h(design)g(matured,)f(the)h(implemen)o(tation)37 324 y(of) -j ff(Flo)o(wNo)q(de)f fl(w)o(as)g(man)o(ually)i(refactored:)24 b ff(Flo)o(wNo) -q(de)18 b fl(b)q(ecame)g(an)f(abstract)g(sup)q(erclass)i(and)e(the)h(con-)37 -380 y(crete)g(sub)q(classes)h ff(UncondJumpFlo)o(wNo)q(de)p fl(,)f ff(CondJum\ -pFlo)o(wNo)q(de)g fl(and)f ff(ReturnFlo)o(wNo)q(de)j fl(w)o(ere)d(added.)37 -437 y(The)j(conditional)g(statemen)o(ts)e(w)o(ere)g(simpli\014ed.)34 b(This) -19 b(refactoring)g(made)f(the)h(design)h(easier)f(to)g(read)37 493 y(and)d -(mo)q(dify)l(.)108 550 y(A)c(similar)g(refactoring)g(w)o(as)e(applied)k(at)d -(sev)o(eral)g(stages)g(in)h(the)g(ev)o(olution)g(of)g(the)f fi(Choic)n(es)g fl -(\014le)h(system.)37 606 y(In)i(an)e(early)h(v)o(ersion,)h(the)e ff(MSDOSEntr\ -y)i fl(class)f(de\014ned)h(directory)f(en)o(tries)g(in)h(the)f(MSDOS)g(format\ -.)k(The)37 663 y fi(mapUnit)e fl(mem)o(b)q(er)f(function)h(included)i(a)d(con\ -ditional)i(to)e(handle)h(the)g(case)f(when)h(the)f(\014le)h(w)o(as)f(the)g -(ro)q(ot)37 719 y(directory)l(.)32 b(A)19 b(man)o(ual)g(refactoring)f(of)h -(the)g(co)q(de)g(included)j(adding)e(a)e(new)h(sub)q(class)h(called)h ff(MSDO\ -S-)37 775 y(Ro)q(otEntry)e fl(and)f(streamlining)h(the)e fi(mapUnit)h fl(func\ -tion)g(in)h(the)e ff(MSDOSEntry)i fl(and)f ff(MSDOSRo)q(otEntry)37 832 y fl -(classes.)j(Later,)14 b(in)h(the)f ff(P)o(ersistentMemo)o(ryObject)g fl(class) -h(there)g(w)o(as)e(a)h(conditional)i(that)e(tested)g(whether)37 888 y(or)f -(not)f(a)g(con)o(tainer)h(attribute)f(w)o(as)g(n)o(ull.)20 b(T)l(o)12 b(discr\ -iminate)j(b)q(et)o(w)o(een)e(the)f(cases,)h(a)f(new)h(sub)q(class)h ff(FileOb\ --)37 945 y(ject)f fl(w)o(as)e(added.)19 b(These)13 b(c)o(hanges)e(made)h(the) -g(design)h(of)e(the)h(Choices)g(File)h(System)f(easier)g(to)f(understand.)108 -1001 y(Another)17 b(b)q(ene\014t)h(that)f(is)g(sometimes)g(realized)i(b)o(y)e -(replacing)h(conditional)h(tests)d(with)i(sub)q(classing)37 1058 y(is)f(that) -e(the)h(run)g(time)g(p)q(erformance)g(ma)o(y)f(impro)o(v)o(e,)g(as)h(rep)q -(orted)g(b)o(y)f(Russo)i(and)f(Kaplan)g([105)o(].)21 b(They)37 1114 y(p)q(ort\ -ed)16 b(a)e(Sc)o(heme)i(in)o(terpreter)f(from)g(the)g(C-language)g(to)f(C++.) -21 b(In)15 b(a)g(traditional)h(C)f(implemen)o(tation,)37 1171 y(the)k(corners\ -tones)f(are)g(a)g(discrimination)j(union)f(and)e(a)g(pro)q(cedure)i(b)q(o)q -(dy)f(that)f(is)h(essen)o(tially)h(a)e(gian)o(t)37 1227 y(switc)o(h)h(stateme\ -n)o(t.)27 b(In)19 b(their)f(C++)h(implemen)o(tation,)g(they)f(distributed)i -(the)e(switc)o(h)g(statemen)o(t)f(o)o(v)o(er)37 1284 y(classes)h(represen)o -(ting)f(the)g(cases,)g(and)g(found)h(that)e(this)h(made)g(the)g(co)q(de)g(mor\ -e)g(mo)q(dular)g(and)g(reduced)37 1340 y(main)o(tenance)f(e\013ort,)e(while)j -fi(sp)n(e)n(e)n(ding)d(up)i fl(the)f(in)o(terpreter.)108 1396 y(Th)o(us,)d -(sub)q(classing,)i(and)f(reducing)g(the)f(conditional)i(statemen)o(ts,)d(ma)o -(y)g(impro)o(v)o(e)h(b)q(oth)g(the)g(clarit)o(y)h(of)37 1453 y(the)f(design)g -(and)f(the)g(run-time)h(p)q(erformance.)19 b(While)13 b(this)e(refactoring)g -(is)h(useful,)g(there)g(are)f(complexities)37 1509 y(with)16 b(it,)g(as)f(ill\ -ustrated)i(in)g(the)e(Figure)h(3.2,)e(based)i(on)g(the)g(ab)q(o)o(v)o(e)f(dis\ -cussion)i(of)e ff(Flo)o(wNo)q(des)h fl(in)h(the)e(TS)37 1566 y(compiler.)108 -1622 y(In)f(the)f(example,)h(sub)q(classes)g(are)e(added)i(corresp)q(onding)g -(to)e(the)h(conditions.)21 b(Put)13 b(another)f(w)o(a)o(y)l(,)g(the)37 1679 y -ff(Flo)o(wNo)q(de)g fl(class)g(co)o(v)o(ered)g(a)f(large)h(n)o(um)o(b)q(er)g -(of)g(states,)f(and)h(the)f(newly)i(de\014ned)g(sub)q(classes)g(partition)f -(that)37 1735 y(state)17 b(space.)26 b(While)19 b(in)f(this)g(example)g(it)f -(ma)o(y)g(b)q(e)h(in)o(tuitiv)o(ely)h(ob)o(vious)f(to)e(the)i(programmer)e -(ho)o(w)g(the)37 1792 y(optimize)h(function)g(should)g(b)q(e)f(simpli\014ed)j -(in)e(eac)o(h)e(sub)q(class,)i(it)f(w)o(ould)g(not)g(b)q(e)g(ob)o(vious)g(to) -g(a)f(compiler)37 1848 y(or)20 b(a)f(restructuring)h(to)q(ol.)33 b(In)20 b fi -(C++)f fl(there)h(is)g(no)g(easy)f(w)o(a)o(y)g(to)g(describ)q(e)i(the)f(condi\ -tion)h(\(i.e.)33 b(set)20 b(of)37 1905 y(states\))f(co)o(v)o(ered)g(b)o(y)g -(a)g(class.)33 b(F)l(or)19 b(refactoring,)h(this)g(design)g(information)g(is) -g(represen)o(ted)f(as)g(a)h fi(class)37 1961 y(invariant)p fl(,)c(whic)o(h)h -(is)g(a)e(predicate)i(kno)o(wn)f(to)f(b)q(e)i(true)f(throughout)g(the)g(lifet\ -ime)h(of)f(eac)o(h)g(instance)h(of)f(a)37 2017 y(class.)29 b(In)19 b(refactor\ -ing,)f(a)g(class)g(in)o(v)m(arian)o(t)h(is)g(assigned)f(to)g(eac)o(h)g(sub)q -(class,)h(and)g(the)f(class)g(in)o(v)m(arian)o(t)h(is)37 2074 y(used)f(to)e -(simplify)j(the)e(conditional)h(statemen)o(t.)24 b(In)18 b(general,)f(the)g -(problems)g(of)g(determining)h(if)g(a)e(class)37 2130 y(in)o(v)m(arian)o(t)h -(holds)f(for)f(a)g(class,)h(and)g(simplifying)i(a)d(conditional)j(statemen)o -(t)c(giv)o(en)i(a)g(class)g(in)o(v)m(arian)o(t,)g(are)37 2187 y(undecidable.) -22 b(F)l(ortunately)l(,)13 b(these)g(problems)g(are)f(decidable)j(for)d(man)o -(y)g(common)g(cases.)19 b(Chapter)12 b(sev)o(en)37 2243 y(de\014nes)17 b(this) -e(refactoring.)37 2386 y fd(3.4)70 b(Capturing)23 b(Aggregations)h(and)g(Comp) -r(onen)n(ts)37 2488 y fl(The)19 b(t)o(w)o(o)d(previous)j(sections)f(discussed) -i(refactorings)d(that)g(re\014ne)i(an)f(inheritance)h(hierarc)o(h)o(y)l(.)29 b -(Inheri-)37 2544 y(tance)16 b(is)g(a)f(p)q(o)o(w)o(erful)h(tec)o(hnique,)h -(but)e(in)i(mo)q(deling)g(the)f(relationships)h(among)e(classes)h(it)f(is)h -(sometimes)952 2760 y(17)g eop bop 73 0 a - 28483502 22365798 5920358 28680847 34403860 51046645 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Helvetica-Bold Courier-Bold -%%Pages: 1 -%%BoundingBox: 90 436 523 776 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 348 966 ] concat -%I -[ -(BEFORE:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 1 -6 ] concat -%I -158 461 158 461 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 195 937 ] concat -%I -[ -(FlowNode:) -( enum {conditional_jump, unconditional_jump,) -( return_statement} final_statement;) -( void optimize\(\) {) -( if \(final_statement == conditional_jump\)) -( <code segment S1>) -( else if \(final_statement == unconditional_jump\)) -( <code segment S2>) -( else if \(final_statement == return_statement\)) -( <code segment S3>) -( }) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 351 794 ] concat -%I -[ -(AFTER:) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 348 763 ] concat -%I -[ -(FlowNode) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 114.711 718.229 ] concat -%I -[ -( CondJumpFlowNode:) -() -( \(class invariant:) -( final_statement ==) -( conditional_jump\)) -() -( void optimize\(\) {) -( <code segment S1>) -( }) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -1 -14 ] concat -%I -332 773 201 741 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -12 -14 ] concat -%I -431 774 561 742 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -1 -14 ] concat -%I -460 770 460 771 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 9 -4 ] concat -%I -460 770 460 771 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -1 -14 ] concat -%I -376 763 376 677 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 300.458 653.494 ] concat -%I -[ -( UncondJumpFlowNode:) -() -( \(class invariant:) -( final_statement ==) -( unconditional_jump\)) -() -( void optimize\(\) {) -( <code segment S2>) -( }) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 477.53 718.88 ] concat -%I -[ -( ReturnFlowNode:) -() -( \(class invariant:) -( final_statement ==) -( return_statement\)) -() -( void optimize\(\) {) -( <code segment S3>) -( }) -] Text -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 455 1545 a fh(Figure)18 b(3.2)p fl(:)h(Simplifying)f(Mem)o(b)q -(er)e(F)l(unction)g fi(optimize)37 1678 y fl(o)o(v)o(erused)22 b(and)g(incorr\ -ectly)h(used.)40 b(This)22 b(section)g(considers)h(refactorings)e(to)g(supp)q -(ort)h fi(aggr)n(e)n(gations)p fl(,)37 1734 y(whic)o(h)17 b(mo)q(del)f(some)f -(whole-part)g(asso)q(ciations)g(b)q(et)o(w)o(een)h(ob)s(jects.)108 1791 y(An) -k(aggregate)e(ob)s(ject,)i(sometimes)f(called)i(a)f(comp)q(osite)g(ob)s(ject) -f(or)g(a)g(con)o(tainer,)h(is)g(made)g(up)g(of)37 1847 y(comp)q(onen)o(ts.)g -(Comp)q(onen)o(ts)15 b(are)g(stored)g(as)f(mem)o(b)q(er)i(v)m(ariables)g(in)g -(the)f(aggregate)f(ob)s(ject;)g(ho)o(w)o(ev)o(er,)g(as)37 1904 y(describ)q -(ed)k(b)q(elo)o(w,)e(not)g(all)h(mem)o(b)q(er)e(v)m(ariables)j(store)d(comp)q -(onen)o(t)h(ob)s(jects.)21 b(One)16 b(imp)q(ortan)o(t)g(qualit)o(y)g(of)37 -1960 y(comp)q(onen)o(ts)f(needed)h(in)f(refactoring)f(is)h(that)e(a)h(comp)q -(onen)o(t)h(ob)s(ject)f(cannot)g(b)q(e)h(assigned)g(to)f(more)g(than)37 2017 y -(one)i(aggregate)e(ob)s(ject)g(at)h(a)g(time.)108 2073 y(Whole-part)20 b(rela\ -tionships)g(among)f(ob)s(jects)g(are)g(sometimes)g(not)g(ob)o(vious)h(un)o -(til)g(implemen)o(tation)37 2130 y(is)e(underw)o(a)o(y)l(.)24 b(A)17 b(relati\ -onship)i(migh)o(t)d(\014rst)h(b)q(e)g(mo)q(deled)i(using)e(inheritance)i(and) -e(later)f(is)i(re\014ned)f(in)o(to)37 2186 y(an)g(aggregation.)k(Refactorings) -16 b(can)h(help)g(mak)o(e)f(aggregations)f(more)g(explicit,)j(and)f(mak)o(e)e -(comp)q(onen)o(t)37 2243 y(classes)h(more)f(reusable.)108 2299 y(The)c(follo) -o(wing)g(sections)h(describ)q(e)g(mo)q(deling)g(whole-part)f(relationships,)i -(mo)o(ving)d(mem)o(b)q(ers)h(b)q(et)o(w)o(een)37 2355 y(aggregate)i(and)h(com\ -p)q(onen)o(t)g(classes,)g(and)g(con)o(v)o(erting)g(a)f(relationship)j(mo)q -(deled)f(using)g(inheritance)g(in)o(to)37 2412 y(an)h(aggregation.)952 2760 y -(18)g eop bop 37 42 a fe(3.4.1)56 b(Bac)n(kground:)25 b(Mo)r(deling)17 b(Whol\ -e-P)n(art)h(Relationships)37 127 y fl(As)h(Wirfs-Bro)q(c)o(k,)h(Wilk)o(erson) -f(and)g(Wiener)h(note)f([126)o(],)g(inheritance)h(is)g(a)e(natural)h(w)o(a)o -(y)f(to)g(represen)o(t)37 184 y(some)12 b(but)h(not)f(all)h(in)o(terclass)g -(relationships.)20 b(They)13 b(discuss)g(three)f(imp)q(ortan)o(t)g(relationsh\ -ips)i(to)e(examine)37 240 y(when)k(structuring)g(an)f(ob)s(ject-orien)o(ted)g -(system:)93 347 y(1.)22 b fi(is-kind-of)93 440 y fl(2.)g fi(is-analo)n(gous-t\ -o)93 534 y fl(3.)g fi(is-p)n(art-of)108 640 y fl(If)13 b(ob)s(jects)e(of)h -(class)g ff(A)h fl(are)f(a)g(kind)h(of)f ff(B)p fl(,)g(this)g(suggests)g(repr\ -esen)o(ting)h ff(A)f fl(as)g(a)g(sub)q(class)h(of)f ff(B.)g fl(If)g(ob)s(ject\ -s)37 697 y(of)19 b(class)g ff(A)g fl(are)g(analogous)f(to)g(ob)s(jects)g(of)h -(class)g ff(B)p fl(,)g(this)g(ma)o(y)f(suggest)g(de\014ning)j(a)d(common)h -(abstract)37 753 y(sup)q(erclass)f(that)f(captures)g(their)g(commonalities.) -26 b(Ho)o(w)o(ev)o(er,)16 b(if)i(an)e(ob)s(ject)h(of)f(class)h ff(A)h fl(is)f -(a)g(part)f(of)h(an)37 810 y(ob)s(ject)e(of)g(class)g ff(B)p fl(,)h(inheritan\ -ce)h(is)e(not)g(a)g(natural)g(w)o(a)o(y)f(to)h(represen)o(t)g(this.)108 866 y -(Supp)q(ose,)22 b(for)d(example,)i(a)e(framew)o(ork)f(is)i(b)q(eing)h(designe\ -d)g(to)e(sim)o(ulate)h(automobile)h(design)f(and)37 923 y(man)o(ufacture.)42 b -(The)23 b(ob)s(jects)f fi(c)n(ar,)i(do)n(or,)i(r)n(o)n(of)c fl(and)h fi(tir)n -(e)f fl(are)h(recognized)g(to)f(b)q(e)h(imp)q(ortan)o(t)g(in)g(this)37 979 y -(application)18 b(and)d(classes)h(are)f(de\014ned)i(for)d(them.)21 b(These)16 -b(ob)s(jects)e(ma)o(y)h(share)g(common)g(c)o(haracteristics)37 1036 y(suc)o -(h)20 b(as)e(color)h(and)g(materials)g(used)g(in)g(their)h(man)o(ufacture,)e -(but)h(it)g(is)h(unnatural)f(to)f(think)h(of)g(a)f(tire)37 1092 y(or)h(a)g -(do)q(or)g(as)f(a)h(sp)q(ecialization)j(of)d(an)g(automobile)h(-)f(rather,)g -(they)g(are)g(parts)f(of)h(an)g(automobile.)32 b(A)37 1148 y(mec)o(hanism)16 b -(is)g(needed)h(for)d(represen)o(ting)i(this)g(whole/part)f(relationship.)108 -1205 y(The)h(whole-part)f(relationship)j(is)d(a)h(sp)q(ecial)h(asso)q(ciation) -f(b)q(et)o(w)o(een)f(ob)s(jects,)g(often)g(called)i(an)e fi(aggr)n(e-)37 1261 -y(gation)p fl(.)20 b(There)c(are)f(man)o(y)f(examples)i([66)o(,)f(126)o(])g -(of)g(aggregations:)106 1368 y fj(\017)22 b fl(a)15 b(car)g(and)g(its)h(autom\ -otiv)o(e)e(parts)106 1461 y fj(\017)22 b fl(a)15 b(compan)o(y)g(and)g(its)h -(departmen)o(ts)106 1555 y fj(\017)22 b fl(a)15 b(dra)o(wing)g(and)h(its)f -(dra)o(wing)g(elemen)o(ts)106 1649 y fj(\017)22 b fl(a)15 b(program)f(and)h -(its)h(program)e(fragmen)o(ts)106 1743 y fj(\017)22 b fl(a)15 b(desk)h(lamp)f -(and)h(the)f(parts)f(used)i(in)g(its)g(man)o(ufacture.)37 1849 y(Sev)o(eral)g -(tests)f(ma)o(y)f(indicate)j(whether)e(an)g(asso)q(ciation)h(b)q(et)o(w)o(een) -g(ob)s(jects)e(is)i(an)f(aggregation)f([101)o(]:)106 1955 y fj(\017)22 b fl -(Is)16 b(one)f(ob)s(ject)g(part)f(of)h(the)g(other?)106 2049 y fj(\017)22 b fl -(Are)15 b(some)g(op)q(erations)h(on)f(the)g(\\whole")g(applied)i(to)e(its)g -(\\parts"?)106 2143 y fj(\017)22 b fl(Are)15 b(some)g(attribute)g(v)m(alues)i -(propagated)d(from)h(the)g(whole)h(to)e(its)i(parts?)106 2237 y fj(\017)22 b -fl(Is)16 b(there)g(an)f(in)o(trinsic)i(asymmetry)e(to)g(the)g(asso)q(ciation,) -h(where)g(one)g(ob)s(ject)f(class)g(is)i(sub)q(ordinate)151 2293 y(to)e(the)g -(other?)108 2400 y(The)k(aggregate)d(ob)s(ject,)i(sometimes)h(called)g(a)f -(comp)q(osite)h(ob)s(ject)f(or)f(a)h(con)o(tainer,)h(is)g(made)f(up)h(of)37 -2456 y(comp)q(onen)o(ts.)26 b(The)17 b(aggregate)f(ob)s(ject)g(can)i(b)q(e)f -(treated)g(as)g(a)f(unit)i(for)f(man)o(y)f(op)q(erations.)26 b(One)18 b(asym-) -37 2513 y(metric)g(asp)q(ect)g(of)f(an)h(aggregation)e(is)j(that)e(the)g(aggr\ -egate)f(ob)s(ject)h(usually)i(needs)g(to)e(kno)o(w)g(ab)q(out)g(its)37 2569 y -(comp)q(onen)o(ts,)f(but)h(less)f(often)g(do)q(es)h(a)e(comp)q(onen)o(t)i(nee\ -d)g(to)e(kno)o(w)h(either)g(ab)q(out)g(the)g(aggregate)f(ob)s(ject)952 2760 y -(19)g eop bop 37 42 a fl(that)12 b(con)o(tains)h(it,)g(or)f(ab)q(out)h(other) -f(comp)q(onen)o(ts.)19 b(During)13 b(design,)h(recognizing)g(that)e(an)h(asso) -q(ciation)g(b)q(e-)37 98 y(t)o(w)o(een)g(ob)s(jects)g(is)h(an)f(aggregation)f -(can)i(help)g(determine)g(where)g(the)f(b)q(eha)o(vior,)h(and)g(the)f(resp)q -(onsibilitie)q(s)37 154 y(for)i(main)o(taining)h(information,)f(ough)o(t)g -(to)f(b)q(e)i(placed.)108 211 y(The)j(decision)i(to)e(mo)q(del)h(an)f(asso)q -(ciation)h(as)e(an)i(aggregation)e(is)h(a)g(matter)f(of)h(judgemen)o(t.)32 b -(As)19 b(is)37 267 y(t)o(ypical)d(in)h(mo)q(deling,)f(there)f(are)g(few)g(har\ -d)g(and)h(fast)e(rules)i([101)o(].)108 324 y fi(While)e(it)g(is)g(c)n(ommon)g -(to)g(r)n(epr)n(esent)f(the)h(c)n(omp)n(onents)f(of)h(an)g(aggr)n(e)n(gate)g -(obje)n(ct)f(as)h(memb)n(er)g(variables,)37 380 y(not)e(al)r(l)g(memb)n(er)g -(variables)f(ne)n(c)n(essarily)f(r)n(epr)n(esent)h(c)n(omp)n(onents.)17 b fl -(F)l(or)10 b(example,)i(mem)o(b)q(er)e(v)m(ariables)i(in)g(an)37 437 y ff(Aut\ -omobile)h fl(class)i(migh)o(t)f(represen)o(t)h(its)f(color,)h(age)f(or)g(the) -g(n)o(um)o(b)q(er)h(of)f(passengers)g(it)h(w)o(ould)g(accommo-)37 493 y(date.) -27 b(These)18 b(mem)o(b)q(er)f(v)m(ariables)i(represen)o(t)e(attributes)g(of) -g(an)h(automobile)g(but)f(are)g(not)g(comp)q(onen)o(ts)37 550 y(of)i(it,)h -(in)g(the)g(sense)f(that)g(a)g(tire)g(is)h(a)f(comp)q(onen)o(t)g(of)g(an)g -(automobile.)32 b(Other)20 b(asso)q(ciations)f(b)q(et)o(w)o(een)37 606 y(ob)s -(jects)14 b(that)f(do)g(not)h(necessarily)h(imply)g(an)f(aggregation)f(are)g -(the)h(dep)q(ends-up)q(on)i(and)e(needs-to-kno)o(w-)37 663 y(ab)q(out)g(relat\ -ionships.)21 b(F)l(or)13 b(example,)i(in)g(a)e(pro)s(ject)g(managemen)o(t)g -(application,)j(an)e(ob)s(ject)f(represen)o(ting)37 719 y(a)i(pro)s(ject)g -(task)f(ma)o(y)h(hold)h(p)q(oin)o(ters)f(to)g(other)g(task)f(ob)s(jects)h(tha\ -t)f(dep)q(end)j(up)q(on)f(its)f(completion;)h(when)37 775 y(its)h(task)e(comp\ -letes)h(it)g(send)h(messages)e(to)g(activ)m(ate)i(those)e(ob)s(jects.)21 b -(Other)c(ob)s(jects)e(handling)i(the)f(user)37 832 y(in)o(terface)h(ma)o(y)e -(hold)i(p)q(oin)o(ters)g(to)e(the)i(task)e(ob)s(jects,)h(so)f(that)h(they)g -(can)g(query)h(the)f(task)f(ob)s(jects)h(when)37 888 y(a)f(status)e(graph)i -(is)g(requested)f(b)o(y)h(the)f(user.)20 b(In)15 b(eac)o(h)g(of)f(these)h(cas\ -es,)f(the)g(asso)q(ciation)h(b)q(et)o(w)o(een)g(ob)s(jects)37 945 y(is)h(di\ -\013eren)o(t)g(from)e(the)h(whole/part)g(relationship.)108 1001 y(There)h(are) -g(di\013eren)o(t)g(kinds)g(of)g(comp)q(onen)o(ts.)21 b(A)16 b(k)o(ey)g(distin\ -ction)h(is)g(whether)f(a)f(comp)q(onen)o(t)h(ob)s(ject)37 1058 y(m)o(ust)i -(b)q(e)h(exclusiv)o(e)h(to)e(one)h(aggregate)e(ob)s(ject,)h(or)g(whether)g -(it)h(can)g(b)q(e)g(shared)f(b)o(y)g(sev)o(eral)h(aggregate)37 1114 y(ob)s -(jects.)37 b(F)l(or)20 b(example,)j(in)f(a)f(pro)s(ject)f(managemen)o(t)g(app\ -lication,)k(tasks)c(and)h(emplo)o(y)o(ees)h(are)e(b)q(oth)37 1171 y(comp)q -(onen)o(ts)13 b(of)g(a)f(pro)s(ject.)19 b(While)14 b(a)f(task)f(w)o(ould)h -(probably)h(b)q(e)f(exclusiv)o(e)i(to)d(one)h(pro)s(ject,)f(an)h(emplo)o(y)o -(ee)37 1227 y(ma)o(y)21 b(b)q(e)i(shared)f(among)f(sev)o(eral)g(pro)s(jects.) -39 b(Refactorings)22 b(in)o(v)o(olving)h(aggregate)d(ob)s(jects)h(and)h(their) -37 1284 y(comp)q(onen)o(ts)16 b(require)g(that)f(a)h(comp)q(onen)o(t)f(ob)s -(ject)g(b)q(e)h(exclusiv)o(e)i(to)d(one)g(aggregate)f(ob)s(ject,)h(for)g(reas\ -ons)37 1340 y(describ)q(ed)j(b)q(elo)o(w.)37 1460 y fe(3.4.2)56 b(Mo)n(ving) -18 b(Mem)n(b)r(ers)f(Bet)n(w)n(een)i(Aggregate)f(and)h(Comp)r(onen)n(t)f(Clas\ -ses)37 1546 y fl(When)d(an)g(aggregation)e(is)i(recognized,)h(it)e(can)h(help) -h(in)f(partitioning)h(b)q(eha)o(vior)f(b)q(et)o(w)o(een)f(classes.)21 b(If)14 -b(the)37 1602 y(classes)i(are)f(already)h(implemen)o(ted)h(b)q(efore)f(the)f -(aggregation)f(is)i(recognized,)g(the)f(design)i(of)e(the)g(system)37 1658 y -(ma)o(y)g(b)q(e)h(impro)o(v)o(ed)f(b)o(y)g(mo)o(ving)g(mem)o(b)q(ers)g(b)q -(et)o(w)o(een)h(an)f(aggregate)f(ob)s(ject)g(and)h(its)h(comp)q(onen)o(t\(s\)\ -.)j(F)l(or)37 1715 y(example,)c(w)o(arran)o(t)o(y)d(information)i(stored)g -(in)g(the)g(tire)g(comp)q(onen)o(t)g(ma)o(y)g(more)f(appropriately)i(b)q(elon\ -g)g(in)37 1771 y(its)i(aggregate)f(ob)s(ject)g(\(a)g(car\))g(if)i(the)e(resp) -q(onsibili)q(t)o(y)j(for)d(managing)g(v)o(ehicle)j(main)o(tenance)f(is)f(assi\ -gned)37 1828 y(to)f(the)f(car)h(class.)21 b(If)16 b(the)g(tires)g(are)f(comp) -q(onen)o(ts)h(of)f(sev)o(eral)h(di\013eren)o(t)g(\(otherwise)f(unrelated\))i -(classes)1880 1811 y fs(6)1900 1828 y fl(,)37 1884 y(mo)o(ving)f(b)q(eha)o -(vior)g(out)f(of)g(the)g(tire)h(class)g(ma)o(y)e(in)o(v)o(olv)o(e)i(adding)g -(it)g(to)f fi(sever)n(al)f fl(aggregate)g(classes,)i(whic)o(h)37 1941 y(can)g -(b)q(e)g(complicated.)108 1997 y(F)l(or)c(example,)h(mo)o(ving)g(a)f(v)m(aria\ -ble)i(from)e(an)g(aggregate)f(class)i(to)f(the)g(class)h(of)f(one)h(of)f(its) -g(comp)q(onen)o(ts)37 2054 y(is)22 b(b)q(eha)o(vior)f(preserving)g(only)g(whe\ -re)g(is)g(a)f(one-to-one)h(relationship)h(b)q(et)o(w)o(een)f(eac)o(h)g(instan\ -ce)g(of)f(the)37 2110 y(aggregate)e(class)i(and)g(instances)g(of)f(the)h(clas\ -s)g(to)e(whic)o(h)j(the)e(v)m(ariable)i(is)f(b)q(eing)h(mo)o(v)o(ed.)32 b(Oth\ -erwise,)37 2167 y(if)23 b(a)e(comp)q(onen)o(t)h(ob)s(ject)f(w)o(ere)g(shared) -h(among)f(more)h(than)f(one)h(aggregate)e(ob)s(ject)h(then)h(the)g(single)37 -2223 y(new)c(v)m(ariable)i(in)e(the)g(\(shared\))f(comp)q(onen)o(t)h(w)o(ould) -g(b)q(e)h(replacing)g(a)e(set)h(of)f(v)m(ariables,)j(one)d(in)i(eac)o(h)f(of) -37 2279 y(the)f(aggregate)e(ob)s(jects)g(that)h(con)o(tained)h(the)g(comp)q -(onen)o(t;)f(information)h(could)g(b)q(e)g(lost)f(and)h(hence)g(the)37 2336 y -(refactoring)e(w)o(ould)h(not)f(b)q(e)h(b)q(eha)o(vior)f(preserving.)108 2392 -y fi(In)c(or)n(der)i(for)f(r)n(efactorings)f(involving)g(aggr)n(e)n(gates)g -(and)h(their)h(c)n(omp)n(onents)d(to)j(b)n(e)e(b)n(ehavior)i(pr)n(eserving,) -37 2449 y(e)n(ach)k(c)n(omp)n(onent)f(must)h(b)n(e)f(exclusive)g(to)h(one)g -(aggr)n(e)n(gate)f(obje)n(ct.)22 b fl(The)16 b(reasons)f(for)g(this)h(are)f -(detailed)j(in)37 2522 y 750 2 v 89 2548 a fu(6)107 2564 y fp(F)m(or)11 b(exa\ -mple,)i(tires)f(are)g(used)g(b)q(oth)g(in)g(automobiles)j(and)d(in)g(automati\ -c)h(baseball)h(pitc)o(hing)g(mac)o(hines;)f(these)f(t)o(w)o(o)f(uses)37 2610 y -(are)j(otherwise)g(unrelated.)952 2760 y fl(20)g eop bop 37 42 a fl(c)o(hapte\ -r)16 b(eigh)o(t.)21 b(Before)15 b(a)g(mem)o(b)q(er)h(v)m(ariable)h(can)f(b)q -(e)g(designated)g(as)f(a)h(comp)q(onen)o(t,)f(it)h(m)o(ust)f(b)q(e)h(sho)o -(wn)37 98 y(that)c(an)o(y)h(instances)g(assigned)g(to)f(it)h(are)g(not)f(sim) -o(ultaneously)i(assigned)f(to)f(another)h(v)m(ariable)h(designated)37 154 y -(as)h(a)g(comp)q(onen)o(t.)20 b(A)15 b(metho)q(d)h(for)e(c)o(hec)o(king)i(the\ -se)g(constrain)o(ts)f(is)g(describ)q(ed)i(in)f(c)o(hapter)f(eigh)o(t.)37 273 y -fe(3.4.3)56 b(Con)n(v)n(erting)13 b(Asso)r(ciations)g(Mo)r(deled)f(Using)h -(Inheritance)f(In)n(to)i(Aggregations)37 359 y fl(Sometimes)22 b(an)g(aggrega\ -tion)e(is)i(not)f(ob)o(vious)g(un)o(til)i(after)e(the)g(implemen)o(tation)i -(is)f(underw)o(a)o(y)l(.)38 b(The)37 415 y(\\whole")11 b(ma)o(y)f(b)q(ear)h -(some)f(b)q(eha)o(vioral)h(similarities)i(to)d(its)h(parts,)f(and)h(those)f -(similarities)j(ma)o(y)d(initially)j(b)q(e)37 472 y(mo)q(deling)k(using)g(inh\ -eritance.)22 b(A)15 b(useful)i(refactoring)e(to)g(supp)q(ort)g(framew)o(ork)f -(ev)o(olution)j(is)f(con)o(v)o(erting)37 528 y(a)f(sup)q(erclass/sub)q(class) -i(relationship)g(in)o(to)f(an)f(aggregation,)e(as)i(sho)o(wn)g(in)h(Figure)f -(3.3.)269 583 y - 22300017 23089398 8288501 15458713 30588518 38548111 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Helvetica-Bold Courier-Bold -%%Pages: 1 -%%BoundingBox: 126 235 465 586 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -8.6747 62.8916 ] concat - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -240.723 -247.229 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 564.119 668.105 ] concat -%I -[ -(AFTER:) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 1.08432 27.1084 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 623.751 614.316 ] concat -%I -[ -(MemoryObject) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 143.909 -0.947388 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 298.684 615.263 ] concat -%I -[ -(MemoryObjectContainer) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 206.632 -9.73685 ] concat -%I -167 613 167 575 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 206.632 -9.73685 ] concat -%I -155 626 155 626 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 337.632 560.263 ] concat -%I -[ -(InodeSystem) -] Text -End - -End %I eop - -End %I eop - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 290.928 0.325287 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 181.33 553.088 ] concat -%I -[ -(InodeSystem) -() -( Protected:) -() -( MemoryObject * objectState) -( MemoryObject * objectData) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 283.916 565.738 ] concat -%I -[ -(* * * ) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 194.515 -12.8016 ] concat -%I -158 461 158 461 Line -End - -End %I eop - -End %I eop - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 10.8434 0 ] concat - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -16.2646 -3.25296 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 187.474 667.105 ] concat -%I -[ -(BEFORE:) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 3.25302 24.9397 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 172.474 617.105 ] concat -%I -[ -(MemoryObject) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 46.4737 -7.89471 ] concat -%I -167 613 167 575 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 46.4737 -7.89471 ] concat -%I -155 626 155 626 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 177.474 562.105 ] concat -%I -[ -(InodeSystem) -] Text -End - -End %I eop - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 441.914 661.925 ] concat -%I -[ -(DURING:) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 170.241 -4.33731 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 181.33 553.088 ] concat -%I -[ -(InodeSystem) -() -( Protected:) -() -( MemoryObject * objectState) -( MemoryObject * objectData) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 283.916 565.738 ] concat -%I -[ -(* * * ) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 194.515 -12.8016 ] concat -%I -158 461 158 461 Line -End - -End %I eop - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 254.06 19.8433 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 172.474 617.105 ] concat -%I -[ -(MemoryObject) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 46.4737 -7.89471 ] concat -%I -167 613 167 575 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 46.4737 -7.89471 ] concat -%I -155 626 155 626 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 177.474 562.105 ] concat -%I -[ -(InodeSystem) -] Text -End - -End %I eop - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 112.771 120.361 ] concat -%I -155 450 212 450 Line -End - -End %I eop - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 1.08434 122.53 ] concat -%I -450 301 397 277 Line -End - -End %I eop - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 480 2174 a fh(Figure)i(3.3)p fl(:)j(Sup)q(erclass)c(Con)o(v)o -(erted)f(to)g(Comp)q(onen)o(t)108 2271 y(In)h(the)g fi(Choic)n(es)e fl(\014le) -j(system,)e(an)g ff(Ino)q(deSystem)g fl(managed)g(the)g(creation)h(of)f(and)h -(access)f(to)g ff(Memo)o(r)o(y-)37 2328 y(Objects)p fl(.)41 b(It)21 b(managed) -h(sev)o(eral)f(high-lev)o(el)j(op)q(erations)d(regarding)h(a)f(\014le)h(syste\ -m;)i(these)d(op)q(erations)37 2384 y(required)e(lo)o(w)e(lev)o(el)i(supp)q -(ort)f(\()p fi(i.e.)26 b fl(read)17 b(and)h(write)f(op)q(erations\))g(for)g -(accessing)h(and)g(storing)f(p)q(oin)o(ters)37 2441 y(to)h(its)g ff(Memo)o -(r)o(yObjects)p fl(.)28 b(In)18 b(an)g(early)g(v)o(ersion)h(of)e(the)h(\014le) -h(system)f(framew)o(ork,)f ff(Ino)q(deSystem)g fl(w)o(as)g(de-)37 2497 y(\014\ -ned)k(as)e(a)g(sub)q(class)h(of)f ff(Memo)o(r)o(yObject)p fl(,)g(to)g(inherit) -i(lo)o(w)e(lev)o(el)i(op)q(erations)e(suc)o(h)h(as)f(read)g(and)h(write.)37 -2554 y(Ho)o(w)o(ev)o(er,)c ff(Ino)q(deSystem)f fl(really)i(represen)o(ted)g -(a)f(di\013eren)o(t)g(abstraction)g(from)f(a)h ff(Memo)o(r)o(yObject)p fl(.) -22 b(As)16 b(the)37 2610 y(design)21 b(of)f(the)g(framew)o(ork)e(w)o(as)h(re\ -\014ned,)j(comp)q(onen)o(t)e(mem)o(b)q(er)g(v)m(ariables,)i(whic)o(h)f(w)o -(ere)e(instances)i(of)952 2760 y(21)g eop bop 37 42 a fl(the)15 b ff(Memo)o -(r)o(yObject)f fl(class,)h(w)o(ere)f(added)h(to)f ff(Ino)q(deSystem)g fl(to)g -(pro)o(vide)h(the)g(lo)o(w)g(lev)o(el)h(supp)q(ort)f(for)f(its)g(\014le)37 98 -y(system)k(op)q(erations.)29 b(The)18 b(high)h(lev)o(el)g(op)q(erations)f(de\ -\014ned)i(in)f ff(Ino)q(deSystem)e fl(w)o(ere)h(c)o(hanged)g(to)f(in)o(v)o -(ok)o(e)37 154 y(b)q(eha)o(vior)j(in)f(the)f(new)h(comp)q(onen)o(ts.)30 b(It) -18 b(w)o(as)g(no)o(w)g(no)g(longer)h(necessary)g(for)f ff(Ino)q(deSystem)f fl -(to)h(inherit)37 211 y(the)d(lo)o(w)g(lev)o(el)h(op)q(erations)f(from)f ff -(Memo)o(r)o(yObject)p fl(.)19 b(The)c(sup)q(erclass)h(of)e ff(Ino)q(deSystem) -g fl(w)o(as)g(c)o(hanged.)20 b(The)37 267 y(notion)14 b(of)g(a)f ff(Memo)o -(r)o(yObjectContainer)h fl(w)o(as)e(in)o(tro)q(duced.)21 b ff(Memo)o(r)o(yObj\ -ectContainers)14 b fl(k)o(ept)f(trac)o(k)g(of)h(par-)37 324 y(titioning)20 b -(a)e(large)h ff(Memo)n(ryObject)e fl(in)o(to)h(a)g(set)h(of)f(smaller)h ff -(Memo)n(ryObjects)e fl(\(i.e.)30 b(a)18 b(disk)h(in)o(to)g(a)f(set)g(of)37 380 -y(\014les\).)j ff(Ino)q(deSystem)12 b fl(w)o(as)h(really)i(a)e(sp)q(ecializat\ -ion)k(of)c ff(Memo)n(ryObjectContainer)p fl(,)g(and)h(b)q(ecame)g(one)g(of)f -(its)37 437 y(sub)q(classes.)108 493 y(Both)k(b)q(efore)h(and)g(after)e(the)i -(refactorings)f(w)o(ere)g(applied,)i(the)f ff(Memo)o(r)o(yObject)e fl(class)i -(pro)o(vided)g(op-)37 550 y(erations)i(to)e(the)h ff(Ino)q(deSystem)g fl(clas\ -s.)32 b(Before)19 b(the)g(refactoring,)g(the)g(services)h(w)o(ere)f(inherited) -i(b)o(y)e(the)37 606 y ff(Ino)q(deSystem)c fl(class;)g(later,)g(they)g(w)o -(ere)g(pro)o(vided)h(b)o(y)f(its)h(comp)q(onen)o(ts.)108 663 y(F)l(rom)21 b -(a)h(soft)o(w)o(are)e(engineering)j(viewp)q(oin)o(t,)i(there)d(are)f(adv)m -(an)o(tages)g(in)i(using)g(aggregations)d(and)37 719 y(comp)q(onen)o(ts,)d -(as)f(opp)q(osed)h(to)f(inheritance,)i(to)e(accomplish)h(reuse.)24 b(Data)16 b -(abstraction)g(supp)q(orts)g(reuse)37 775 y([74].)22 b(An)16 b(aggregate)f -(ob)s(ject)g(only)i(sees)g(the)f(public)i(in)o(terface)e(of)g(its)g(comp)q -(onen)o(ts,)h(whereas)f(a)f(sub)q(class)37 832 y(sees)h(the)g(in)o(ternals)h -(\(i.e.)k(a)15 b(less)i(abstract)d(view\))i(of)f(its)h(sup)q(erclass.)22 b -(T)l(o)16 b(use)g(the)g(terminology)f(from)g(the)37 888 y(soft)o(w)o(are)d -(testing)i(literature,)559 872 y fs(7)593 888 y fl(inheritance)h(pro)o(vides) -f(a)f(white)h(b)q(o)o(x)g(\(or)f(p)q(ossibly)i(a)e(grey)g(b)q(o)o(x\))h(in)o -(terface,)37 945 y(whereas)g(the)f(in)o(terface)h(pro)o(vided)g(b)o(y)f(a)g -(comp)q(onen)o(t)h(to)e(its)i(aggregate)e(ob)s(ject)g(is)i(more)f(t)o(ypicall\ -y)i(a)e(blac)o(k)37 1001 y(b)q(o)o(x)h(in)o(terface.)20 b(Blac)o(k)14 b(b)q -(o)o(x)g(in)o(terfaces)g(pro)o(vide)g(b)q(etter)g(encapsulation)h(and)f(abstr\ -action)g(than)f(do)h(white)37 1058 y(b)q(o)o(x)i(or)e(grey)h(b)q(o)o(x)g(in)o -(terfaces)h([59)o(].)108 1114 y(Th)o(us,)j(while)i(inheritance)f(pla)o(ys)f -(an)g(imp)q(ortan)o(t)g(role)g(in)g(an)g(application)i(framew)o(ork,)d(so)g -(to)q(o)g(can)37 1171 y(aggregations)d(and)g(comp)q(onen)o(ts.)108 1227 y(The\ -re)f(are)f(some)g(complexities)i(in)g(con)o(v)o(erting)e(a)g(sub)q(class/sup) -q(erclass)i(relationship)h(to)c(an)i(aggrega-)37 1284 y(tion.)20 b(Chec)o(ks) -13 b(are)g(needed)i(to)e(ensure)g(that)g(t)o(yp)q(e)g(requiremen)o(ts)h(on)f -(v)m(ariable)i(assignmen)o(ts)e(and)h(function)37 1340 y(calls)20 b(are)f(sti\ -ll)h(satis\014ed.)32 b(Previously)19 b(inherited)i(b)q(eha)o(vior)f(ma)o(y)e -(need)h(to)g(b)q(e)g(copied)h(in)o(to)f(one)g(of)f(the)37 1396 y(classes.)j -(Chapter)15 b(eigh)o(t)g(describ)q(es)i(sev)o(eral)e(high-lev)o(el)j(op)q(era\ -tions)d(in)o(v)o(olving)i(aggregations.)37 1540 y fd(3.5)70 b(Supp)r(orting) -24 b(Refactorings)37 1641 y fl(The)19 b(prior)f(three)g(sections)h(fo)q(cused) -g(on)f(the)g(three)g(highest)h(lev)o(el)g(refactorings:)25 b(creating)18 b -(an)h(abstract)37 1698 y(sup)q(erclass,)14 b(sub)q(classing)g(and)f(simplifyi\ -ng)i(conditions,)e(and)g(creating)f(aggregations)g(and)g(reusable)i(com-)37 -1754 y(p)q(onen)o(ts.)22 b(As)15 b(noted)h(in)h(c)o(hapter)e(one,)g(the)h(hig\ -h-lev)o(el)i(refactorings)d(are)g(supp)q(orted)i(b)o(y)e(a)g(set)h(of)f(t)o -(w)o(en)o(t)o(y)37 1810 y(six)h(lo)o(w-lev)o(el)h(refactorings,)d(whic)o(h)i -(are)f(listed)i(b)q(elo)o(w.)108 1867 y(All)j(but)f(the)f(\014nal)i(category) -d(of)i(the)f(supp)q(orting)i(refactorings)e(listed)i(b)q(elo)o(w)f(are)f fi -(atomic)p fl(;)i(that)e(is,)37 1923 y(they)i(are)f(the)g(most)f(primitiv)o -(e)j(refactorings.)32 b(The)19 b(atomic)g(refactorings)g(create,)h(delete)g -(c)o(hange)f(and)37 1980 y(mo)o(v)o(e)h(en)o(tities.)36 b(The)20 b(\014nal)h -(category)f(of)g(less)g(primitiv)o(e)i(\(comp)q(osite\))e(refactorings)g(supp) -q(ort)g(sligh)o(tly)37 2036 y(more)15 b(p)q(o)o(w)o(erful)h(refactoring)f(op) -q(erations,)f(suc)o(h)i(as)f(abstracting)g(access)g(to)f(a)h(mem)o(b)q(er)h -(v)m(ariable.)93 2143 y(1.)22 b(Creating)15 b(a)g(Program)f(En)o(tit)o(y:)170 -2236 y(\(a\))22 b(creating)16 b(an)f(empt)o(y)g(class)168 2309 y(\(b\))22 b -(creating)16 b(a)e(mem)o(b)q(er)i(v)m(ariable)173 2383 y(\(c\))22 b(creating) -16 b(a)e(mem)o(b)q(er)i(function.)37 2466 y 750 2 v 89 2493 a fu(7)107 2509 y -fp(In)h(the)g(soft)o(w)o(are)g(testing)h(literature,)i(blac)o(k)f(b)q(o)o(x)e -(denotes)h(functional)i(testing)e(and)g(white)g(b)q(o)o(x)g(denotes)g(structu\ -ral)37 2555 y(testing.)h(The)12 b(t)o(w)o(o)h(t)o(yp)q(es)h(of)e(testing)i -(are)f(compared)h(in)g([13].)952 2760 y fl(22)g eop bop 93 42 a fl(2.)22 b -(Deleting)16 b(a)f(Program)f(En)o(tit)o(y:)170 135 y(\(a\))22 b(deleting)17 b -(an)e(unreferenced)i(class)168 208 y(\(b\))22 b(deleting)17 b(an)e(unreferenc\ -ed)i(v)m(ariable)173 281 y(\(c\))22 b(deleting)17 b(a)e(set)g(of)f(mem)o(b)q -(er)i(functions.)93 375 y(3.)22 b(Changing)16 b(a)f(Program)e(En)o(tit)o(y:) -170 469 y(\(a\))22 b(c)o(hanging)16 b(a)f(class)g(name)168 542 y(\(b\))22 b -(c)o(hanging)16 b(a)f(v)m(ariable)h(name)173 615 y(\(c\))22 b(c)o(hanging)16 b -(a)f(mem)o(b)q(er)g(function)h(name)168 688 y(\(d\))22 b(c)o(hanging)16 b(the) -f(t)o(yp)q(e)g(of)g(a)g(set)g(of)g(v)m(ariables)h(and)g(functions)173 761 y -(\(e\))22 b(c)o(hanging)16 b(access)f(con)o(trol)g(mo)q(de)176 834 y(\(f)t -(\))21 b(adding)16 b(a)f(function)h(argumen)o(t)170 907 y(\(g\))22 b(deleting) -17 b(a)e(function)h(argumen)o(t)168 980 y(\(h\))22 b(reordering)16 b(function) -g(argumen)o(ts)180 1054 y(\(i\))23 b(adding)16 b(a)f(function)h(b)q(o)q(dy) -179 1127 y(\(j\))22 b(deleting)17 b(a)e(function)h(b)q(o)q(dy)169 1200 y(\(k\ -\))22 b(con)o(v)o(ert)15 b(an)g(instance)h(v)m(ariable)g(to)f(a)g(v)m(ariable) -h(that)f(p)q(oin)o(ts)g(to)g(an)g(instance)180 1273 y(\(l\))23 b(con)o(v)o -(ert)15 b(v)m(ariable)h(references)g(to)f(function)h(calls)155 1346 y(\(m\)) -22 b(replacing)17 b(statemen)o(t)d(list)i(with)f(function)h(call)168 1419 y -(\(n\))22 b(inlining)c(\(ie)e(inline)i(expanding\))e(a)f(function)h(call)170 -1492 y(\(o\))22 b(c)o(hanging)16 b(the)f(sup)q(erclass)h(of)f(a)g(class)93 -1586 y(4.)22 b(Mo)o(ving)15 b(a)g(Mem)o(b)q(er)g(V)l(ariable:)170 1680 y(\(a\ -\))22 b(mo)o(ving)15 b(a)g(mem)o(b)q(er)g(v)m(ariable)i(to)e(a)f(sup)q(erclas\ -s)168 1753 y(\(b\))22 b(mo)o(ving)15 b(a)g(mem)o(b)q(er)g(v)m(ariable)i(to)e -(a)f(sub)q(class.)93 1846 y(5.)22 b(Less)16 b(primitiv)o(e)g(\(comp)q(osite\)) -f(refactorings:)170 1940 y(\(a\))22 b(abstract)14 b(access)i(to)e(a)h(mem)o -(b)q(er)g(v)m(ariable)168 2013 y(\(b\))22 b(con)o(v)o(ert)15 b(a)f(co)q(de)i -(segmen)o(t)f(to)g(a)f(function)173 2086 y(\(c\))22 b(mo)o(ving)15 b(a)g(clas\ -s.)37 2193 y(These)h(lo)o(w-lev)o(el)h(refactorings)d(are)h(describ)q(ed)i -(in)f(c)o(hapter)f(\014v)o(e.)108 2249 y(This)i(list,)h(com)o(bined)g(with)f -(the)f(three)h(high-lev)o(el)i(refactorings,)d(is)i(an)e(elab)q(oration)h(of) -g(the)f(original)37 2306 y(list)h(of)d(eigh)o(t)i(refactorings)e(describ)q -(ed)k(in)e(section)f(1.2.1)f(\(and)h(in)h([85)o(]\).)j(F)l(rom)c(that)f(origi\ -nal)i(list:)106 2399 y fj(\017)22 b fl(the)f(\014rst)g(three)h(refactorings)e -(map)h(to)g(the)g(high-lev)o(el)j(refactorings,)e(whic)o(h)g(are)f(implemen)o -(ted)151 2456 y(using)16 b(man)o(y)f(of)g(the)g(lo)o(w-lev)o(el)h(refactoring\ -s)f(listed)i(ab)q(o)o(v)o(e)106 2550 y fj(\017)22 b fl(the)15 b(fourth)g(refa\ -ctoring)g(\(mo)o(ving)g(a)g(class\))g(maps)g(to)f(refactoring)h(5\(e\))952 -2760 y(23)g eop bop 106 42 a fj(\017)22 b fl(the)12 b(\014fth)g(refactoring)g -(\(mo)o(ving)f(v)m(ariables)j(and)e(functions\))g(maps)g(to)g(refactorings)f -(1\(c\),)h(2\(c\),)f(4\(a\),)151 98 y(and)16 b(4\(b\))106 192 y fj(\017)22 b -fl(the)13 b(sixth)g(refactoring)f(\(replacing)h(co)q(de)g(segmen)o(t)f(with)h -(function)g(call\))g(maps)g(to)e(refactoring)i(3\(m\))106 286 y fj(\017)22 b -fl(the)15 b(sev)o(en)o(th)h(refactoring)e(\(c)o(hanging)i(names\))e(maps)h -(to)g(refactorings)g(3\(a\),)e(3\(b\))i(and)g(3\(c\))106 379 y fj(\017)22 b fl -(the)15 b(eigh)o(th)h(refactoring)f(\(abstracting)f(v)m(ariable)j(access\))e -(maps)g(to)f(5\(a\).)108 473 y(It)21 b(is)g(in)o(teresting)h(to)e(note)h(that\ -,)g(while)i(the)e(list)g(of)g(refactorings)f(w)o(as)g(determined)j(mostly)d -(from)37 530 y(analyzing)15 b(C++)f(programs,)f(man)o(y)g(should)i(b)q(e)f -(applicable)i(for)d(refactoring)g(programs)g(written)g(in)i(other)37 586 y -(ob)s(ject-orien)o(ted)k(languages.)30 b(Only)19 b(a)f(small)h(subset)g(app)q -(ear)f(to)g(b)q(e)h(C++-sp)q(eci\014c.)1559 570 y fs(8)1611 586 y fl(Applying) -h(these)37 643 y(refactorings)15 b(to)g(other)g(ob)s(ject)f(orien)o(ted)i(lan\ -guages)f(is)h(an)f(area)g(for)f(future)h(researc)o(h.)37 786 y fd(3.6)70 b -(Language)25 b(F)-6 b(eatures)23 b(in)f(Refactoring)37 887 y fl(Belo)o(w)16 b -(is)g(a)f(brief)g(summary)g(of)g(the)g(language)g(features)g(up)q(on)h(whic)o -(h)g(the)f(refactoring)g(descriptions)i(are)37 944 y(based.)33 b(Chapter)19 b -(four)g(discusses)i(the)e(related)h(issues)g(of)f(the)h(domains)f(of)g(refact\ -oring)g(and)h(b)q(eha)o(vior)37 1000 y(preserv)m(ation.)108 1057 y(A)12 b(pro\ -gram)f(consists)h(of)f(a)h(single)h(global)f(function)h(called)g fi(main)p fl -(,)f(and)g(\(p)q(ossibly)h(n)o(ull\))g(sets)f(of)f(classes,)37 1113 y(global) -16 b(en)o(umerated)g(t)o(yp)q(es)f(and)g(global)h(v)m(ariables.)108 1170 y -(The)f(scop)q(e)g(of)g(eac)o(h)g(class)g(is)g(the)g(en)o(tire)h(program.)i -(A)d(class)g(has)g(at)f(most)g(one)h(direct)h(sup)q(erclass.)k(A)37 1226 y -(class)c(consists)g(of)f(a)g(set)g(of)g(mem)o(b)q(er)h(v)m(ariables)h(and)e -(set)h(of)f(mem)o(b)q(er)g(functions.)22 b(All)17 b(mem)o(b)q(er)e(v)m(ariabl\ -es)37 1282 y(ha)o(v)o(e)i(distinct)i(names,)e(as)g(do)g(all)h(mem)o(b)q(er)g -(functions.)26 b(All)19 b(v)m(ariables)g(and)e(functions)h(are)f(t)o(yp)q(ed.) -26 b(The)37 1339 y(t)o(yp)q(e)14 b(of)e(a)h(mem)o(b)q(er)h(v)m(ariable)g(can) -f(b)q(e)h(a)f(class,)h(in)g(whic)o(h)g(case)f(an)g(instance)h(of)e(that)h(cla\ -ss)g(is)h(em)o(b)q(edded)h(in)37 1395 y(the)g(v)m(ariable's)h(con)o(taining)f -(class)g(when)g(that)f(class)h(is)g(compiled.)21 b(The)15 b(t)o(yp)q(e)f(of)g -(a)h(mem)o(b)q(er)f(v)m(ariable)i(can)37 1452 y(b)q(e)f(a)f(p)q(oin)o(ter)h -(to)e(a)h(class,)g(in)h(whic)o(h)g(case)f(it)h(can)f(b)q(e)h(assigned)f(an)g -(instance)h(of)f(that)g(class)g(or)g(an)g(instance)37 1508 y(of)j(one)g(of)g -(its)g(sub)q(classes.)27 b(A)17 b(function)h(de\014ned)g(in)g(a)f(sup)q(ercla\ -ss)h(can)f(b)q(e)h(rede\014ned)g(in)g(a)f(sub)q(class;)i(all)37 1565 y(functi\ -ons)d(that)f(are)g(rede\014ned)h(in)g(sub)q(classes)h(are)e(\(using)g(C++)h -(terminology\))f(virtual.)108 1621 y(The)20 b(language)f(features)g(co)o(v)o -(ered)g(are)g(a)g(ma)s(jor)e(subset)j(of)e(C++.)33 b(Ho)o(w)o(ev)o(er,)19 b -(sev)o(eral)g(features)g(of)37 1678 y(C++)h(and)g(other)f(ob)s(ject-orien)o -(ted)g(languages)h(w)o(ere)f(not)f(included)k(here.)33 b(Multiple)21 b(inheri\ -tance)g(and)37 1734 y(o)o(v)o(erloaded)15 b(mem)o(b)q(er)g(function)g(names)g -(\(where)f(t)o(w)o(o)f(mem)o(b)q(er)i(functions)g(of)f(a)g(class)h(can)g(ha)o -(v)o(e)f(the)h(same)37 1791 y(name)23 b(but)f(di\013er)g(in)h(argumen)o(t)e -(t)o(yp)q(es\))h(w)o(ere)g(not)g(included.)43 b(They)22 b(w)o(ould)g(ha)o(v)o -(e)g(complicated)h(the)37 1847 y(precondition)e(c)o(hec)o(king)f(for)f(refact\ -orings,)g(particularly)h(as)f(related)h(to)e(naming)i(con\015icts,)g(and)f -(made)37 1903 y(the)f(refactoring)g(descriptions)h(tedious)f(and)g(more)f(di\ -\016cult)i(to)e(understand.)28 b(Multiple)20 b(inheritance)f(is)37 1960 y(not) -d(a)h(feature)f(in)h(Smalltalk,)g(nor)f(w)o(as)g(it)g(used)h(in)h(the)e(v)o -(ersions)g(of)g(the)h fi(Choic)n(es)e fl(\014le)j(system)e(analyzed)37 2016 y -(in)21 b(this)g(researc)o(h.)33 b(Ov)o(erloaded)21 b(mem)o(b)q(er)f(function) -h(names)e(can)h(b)q(e)h(mapp)q(ed)g(in)o(to)f(distinctly)h(named)37 2073 y -(functions)i(b)o(y)e(concatenating)h(function)h(names)e(and)h(argumen)o(ts)f -(t)o(yp)q(es,)i(as)e(is)h(done)g(in)h(some)e(C++)37 2129 y(compilers.)38 b -(Another)21 b(feature)f(of)h(C++)g(not)f(included)j(here)f(is)f(t)o(yp)q(e)g -(casts.)35 b(Explicit)23 b(t)o(yp)q(e)e(casts)f(is)37 2186 y(generally)c(reco\ -gnized)g(as)e(p)q(o)q(or)g(co)q(ding)h(practice.)21 b(Handling)15 b(t)o(yp)q -(e)g(casts)f(w)o(ould)g(require)i(more)e(complex)37 2242 y(\015o)o(w)20 b(ana\ -lysis)g(than)g(is)h(presen)o(ted)f(here)g(and)g(is)h(an)e(area)h(for)f(future) -h(researc)o(h.)33 b(Finally)l(,)23 b(C++)d(is)h(an)37 2299 y(ev)o(olving)16 b -(language;)f(parameterized)h(classes,)f(a)g(v)o(ery)f(recen)o(tly)i(added)g -(feature,)e(is)i(not)e(included)k(in)e(this)37 2355 y(analysis.)37 2436 y 750 -2 v 89 2463 a fu(8)107 2479 y fp(Three)f(refactorings)i(that)f(w)o(ould)h(not) -f(apply)h(for)e(Smalltalk)k(programs)d(are)g(3\(d\),\(e\),)g(and)g(\(k\).)25 b -(These)16 b(refactorings)37 2525 y(c)o(hange)e(t)o(yp)q(e,)g(access)f(con)o -(trol)h(mo)q(de,)f(and)h(con)o(v)o(ert)g(an)f(instance)h(v)n(ariable)h(to)e -(a)g(v)n(ariable)j(that)d(p)q(oin)o(ts)h(to)f(an)g(instance.)952 2760 y fl -(24)g eop bop 37 42 a fd(3.7)70 b(Summary:)31 b(Imp)r(ortance)22 b(&)i(Comple\ -xit)n(y)c(of)j(Refactoring)37 143 y fl(Refactoring)d(is)g(imp)q(ortan)o(t.)33 -b(As)19 b(noted)h(earlier,)h(in)f(the)g(view)g(of)f(Deutsc)o(h)g([40)o(])h -(and)f(others,)h(the)g(k)o(ey)37 199 y(in)o(tellectual)25 b(con)o(ten)o(t)d -(of)g(soft)o(w)o(are)f(is)i(captured)f(in)i(the)e(factoring)g(of)g(functions) -h(and)g(in)g(the)g(design)37 256 y(of)c(in)o(terfaces.)29 b(Refactoring)19 b -(helps)h(in)f(making)g(this)f(in)o(tellectual)j(con)o(ten)o(t)d(more)g(explic\ -it)j(and,)e(hence,)37 312 y(helps)i(in)e(designing)i(reusable)e(soft)o(w)o -(are.)29 b(Exp)q(erienced)21 b(dev)o(elop)q(ers)f(of)f(ob)s(ject-orien)o(ted) -f(systems)h(\014nd)37 369 y(themselv)o(es)g(restructuring)f(their)g(implemen) -o(tations,)i(although)e(they)f(ma)o(y)h(not)f(b)q(e)h(consciously)i(a)o(w)o -(are)37 425 y(that)15 b(refactoring)g(tasks)f(are)h(part)g(of)f(their)i(dev)o -(elopmen)o(t)g(pro)q(cess.)108 482 y(Refactoring)21 b(is)g(complex.)37 b(Muc) -o(h)21 b(of)f(the)h(complexit)o(y)g(is)h(due)f(to)f(the)h(in)o(terrelationshi\ -ps)h(among)37 538 y(classes.)h(F)l(or)15 b(example,)i(when)f(a)g(class)g(is)g -(mo)o(v)o(ed)g(and)g(a)f(sub)q(class/sup)q(erclass)j(relationship)g(is)e(c)o -(hanged)37 595 y(to)c(a)f(con)o(tainer/comp)q(onen)o(t)h(relationship,)i(c)o -(hec)o(ks)e(and)h(structural)e(c)o(hanges)h(are)g(often)g(needed)h(to)e(retai\ -n)37 651 y(inherited)j(b)q(eha)o(vior)e(and)f(satisfy)g(t)o(yp)q(e)h(requirem\ -en)o(ts)g(on)f(assignmen)o(ts)g(and)h(function)g(calls.)20 b(As)11 b(a)g(syst\ -em)37 708 y(gro)o(ws,)j(doing)i(these)f(tasks)g(b)o(y)g(hand)g(b)q(ecomes)h -(more)f(complicated,)h(tedious)g(and)f(error-prone.)108 764 y(The)h(follo)o -(wing)f(c)o(hapters)g(describ)q(e)i(a)e(w)o(a)o(y)f(to)h(automate)f(the)h(pro) -q(cess)h(of)e(refactoring.)952 2760 y(25)g eop bop 37 353 a fc(Chapter)35 b -(4)37 560 y fb(Preserving)42 b(Beha)m(vior)f(During)37 685 y(Refactoring)37 -907 y fl(In)o(tuitiv)o(ely)l(,)25 b(refactorings)c(should)h(preserv)o(e)g(the) -f(b)q(eha)o(vior)h(of)f(a)g(program.)37 b(This)22 b(c)o(hapter)f(discusses)37 -964 y(sev)o(eral)13 b(topics)g(related)f(to)g(b)q(eha)o(vior)h(preserv)m(atio\ -n.)20 b(Section)13 b(4.1)e(describ)q(es)j(sev)o(eral)f(program)e(prop)q(ertie\ -s)37 1020 y(that)k(are)f(easily)i(violated)f(in)h(refactoring.)j(Section)d -(4.2)e(de\014nes)h(the)g(domains)g(of)g(the)f(argumen)o(ts)g(to)g(the)37 1077 -y(refactorings.)24 b(Section)18 b(4.3)d(lists)j(the)e(functions)i(used)f(to)f -(describ)q(e)i(preconditions)g(of)f(the)f(refactorings;)37 1133 y(the)g(preco\ -nditions)g(ensure)g(that)f(b)q(eha)o(vior)g(is)h(preserv)o(ed)g(b)o(y)f(the)g -(refactoring.)37 1276 y fd(4.1)70 b(Program)24 b(Prop)r(erties)e(and)i(Beha)n -(vior)f(Preserv)l(ation)37 1378 y fl(After)16 b(a)f(refactoring,)g(a)h(progra\ -m)f(m)o(ust)g(b)q(e)h(syn)o(tactically)h(correct.)k(F)l(or)15 b(example,)i -(the)f(sup)q(erclass)g(of)g(a)37 1434 y(new)c(class)f(m)o(ust)g(b)q(e)h(an)f -(existing)h(class.)19 b(Or,)11 b(a)g(function)h(in)g(a)f(sub)q(class)h(that)e -(o)o(v)o(errides)h(a)g(function)h(de\014ned)37 1491 y(in)17 b(its)e(sup)q(erc\ -lass)h(m)o(ust)f(b)q(e)h(t)o(yp)q(e)f(compatible)h(with)g(the)f(corresp)q(ond\ -ing)h(function)g(in)g(the)g(sup)q(erclass.)108 1547 y(A)23 b(compiler)h(could) -g(catc)o(h)e(these)h(errors.)42 b(Therefore,)24 b(one)f(w)o(a)o(y)f(to)g(prev) -o(en)o(t)g(these)h(errors)f(from)37 1604 y(happ)q(ening)f(w)o(ould)f(b)q(e)f -(to)g(sa)o(v)o(e)f(the)h(curren)o(t)g(v)o(ersion)g(of)g(a)f(program)g(b)q(efo\ -re)h(eac)o(h)g(refactoring,)h(apply)37 1660 y(the)d(refactoring)f(without)g -(regard)g(to)f(these)i(errors,)e(and)h(then)h(recompile)h(the)e(program.)22 b -(If)16 b(an)g(error)g(is)37 1717 y(\015agged,)f(fall)h(bac)o(k)f(to)g(the)g -(old)h(v)o(ersion.)108 1773 y(Ho)o(w)o(ev)o(er,)e(there)h(are)g(t)o(w)o(o)f -(ma)s(jor)g(problems)h(with)h(this)g(approac)o(h:)93 1867 y(1.)22 b(the)11 b -(approac)o(h)g(migh)o(t)g(b)q(e)g(unacceptably)i(slo)o(w,)e(esp)q(ecially)i -(for)e(higher)g(lev)o(el)i(refactoring)d(op)q(erations)151 1923 y(that)15 b -(in)o(v)o(olv)o(e)g(a)g(series)h(of)f(more)g(primitiv)o(e)h(refactorings.)93 -2017 y(2.)22 b(more)16 b(imp)q(ortan)o(tly)l(,)i(there)f(are)f(some)g(errors) -g(that)h(could)g(c)o(hange)g(the)g(b)q(eha)o(vior)g(of)g(the)g(program)151 -2074 y(but)e(w)o(ould)h(not)f(b)q(e)h(pic)o(k)o(ed)g(up)g(b)o(y)f(the)g(compi\ -ler.)108 2167 y(Consider)d(the)g(erroneous)f(refactoring)g(sho)o(wn)h(in)g -(Figure)g(4.1.)37 b(F)l(unction)12 b fi(F1)f fl(is)i(a)e(protected)g(mem)o -(b)q(er)37 2224 y(in)j(class)g fi(Sup)n(er)p fl(,)f(while)h fi(F2)f fl(is)h -(de\014ned)g(in)g(class)g fi(Sub1)p fl(,)f(one)g(of)g(its)g(sub)q(classes.)21 -b(The)13 b(argumen)o(t)f(and)i(return)37 2280 y(t)o(yp)q(es)k(of)e fi(F2)h fl -(are)g(\(coinciden)o(tly\))i(the)e(same)g(as)g(those)g(of)g fi(F1)p fl(.)26 b -(In)17 b(class)h fi(Sub1)p fl(,)f(function)h fi(F3)f fl(includes)j(a)37 2337 y -(call)d(to)d fi(F1)p fl(,)h(whic)o(h)h(is)g(inherited)h(from)d(the)i(sup)q -(erclass.)108 2393 y(A)g(refactoring)f(is)h(applied,)h(in)f(class)g fi(Sub1)p -fl(,)f(to)g(rename)g(function)i fi(F2)e fl(to)g fi(F1)p fl(.)20 b(This)c(rena\ -ming)g(w)o(ould)37 2450 y(result)h(in)g(a)f(syn)o(tactically)g(correct)g(prog\ -ram)f(\(it)h(w)o(ould)g(compile)i(cleanly\).)23 b(Ho)o(w)o(ev)o(er,)15 b(the) -h(b)q(eha)o(vior)h(of)37 2506 y(the)g(program)f(has)h(probably)g(c)o(hanged.) -26 b(F)l(unction)17 b fi(F3)g fl(w)o(ould)g(no)o(w)g(call)h(the)f(newly)g(ren\ -amed)h(function)37 2563 y(de\014ned)k(in)g(its)e(lo)q(cal)i(class,)g(rather)d -(than)i(the)f(function)h(previously)h(inherited)h(from)c(the)i(sup)q(erclass.) -952 2760 y(26)g eop bop 94 0 a - 27825685 15787623 5065195 21707980 32890880 37495603 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Helvetica-Bold Courier-Bold -%%Pages: 1 -%%BoundingBox: 77 330 500 570 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 141 709 ] concat -%I -[ -(BEFORE:) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 485 707 ] concat -%I -[ -(AFTER:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t u -%I -46 633 46 633 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 155.747 619.024 ] concat -%I -[ -(* * * ) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 154.253 638.759 ] concat -%I -[ -(Sub1) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 97.5422 605.904 ] concat -%I -[ -(Super:) -() -( Protected:) -() -( void F1\(int x, int y\)) -( { ... }) -() -(Sub1:) -() -( Protected:) -() -( void F2\(int x, int y\)) -( { ... }) -( int F3\(int z\)) -( {F1\(z,3\); ... }) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 151.976 685.759 ] concat -%I -[ -(Super) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 3.91566 6.75903 ] concat -%I -165 666 165 634 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 496.554 620.434 ] concat -%I -[ -(* * * ) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 495.06 640.169 ] concat -%I -[ -(Sub1) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 492.783 687.169 ] concat -%I -[ -(Super) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 344.723 8.16867 ] concat -%I -165 666 165 634 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 435.096 606.229 ] concat -%I -[ -(Super:) -() -( Protected:) -() -( void F1\(int x, int y\)) -( { ... }) -() -(Sub1:) -() -( Protected:) -() -( void F1\(int x, int y\)) -( { ... }) -( int F3\(int z\)) -( {F1\(z,3\); ... }) -() -] Text -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 384 1128 a fh(Figure)18 b(4.1)p fl(:)i(Erroneous)14 b(Renaming) -j(Of)e(Mem)o(b)q(er)g(F)l(unction)h(F2)37 1261 y(Assuming)e(that)e(the)h(t)o -(w)o(o)f(functions)h(b)q(eha)o(v)o(e)g(di\013eren)o(tly)l(,)h(the)f(b)q(eha)o -(vior)h(of)e(function)i fi(F3)e fl(program)g(w)o(ould)37 1318 y(ha)o(v)o(e)j -(c)o(hanged.)20 b(A)c(compiler)g(w)o(ould)g(not)f(pic)o(k)h(up)f(this)h(error\ -.)108 1374 y(Without)f(rules)i(for)e(c)o(hec)o(king)h(that)f(these)g(program) -g(prop)q(erties)h(are)f(not)g(violated,)h(it)g(is)g(p)q(ossible)h(to)37 1431 y -(pro)q(duce)k(a)e(program)f(that)h(either)h(is)g(not)f(syn)o(tactically)h(cor\ -rect)f(or)g(\(w)o(orse\))f(compiles)j(correctly)e(but)37 1487 y(b)q(eha)o(v)o -(es)d(di\013eren)o(tly)g(after)e(the)i(refactoring.)108 1544 y(During)j(the)g -(researc)o(h)g(protot)o(yping,)g(a)g(particular)h(set)e(of)h(syn)o(tactic)g -(and)g(seman)o(tic)g(prop)q(erties)h(of)37 1600 y(programs)11 b(\(listed)i -(b)q(elo)o(w\))g(w)o(as)e(found)h(to)g(b)q(e)h(easily)g(violated)g(if)f(expli\ -cit)i(c)o(hec)o(ks)f(w)o(ere)f(not)f(made)h(b)q(efore)h(a)37 1657 y(program)f -(w)o(as)h(refactored.)18 b(In)c(the)f(refactoring)g(de\014nitions,)h(b)q(eha) -o(vior)g(preserv)m(ation)g(is)f(argued)g(in)h(terms)37 1713 y(of)d(these)g -(program)f(prop)q(erties.)586 1696 y fs(1)625 1713 y fl(These)i(prop)q(erties) -g(relate)f(to)f(inheritance,)k(scoping,)e(t)o(yp)q(e)f(compatibilit)o(y)37 -1769 y(and)h(seman)o(tic)f(equiv)m(alence.)22 b(Recompiling)13 b(the)f(progra\ -m)e(after)g(refactoring)h(could)i(\015ag)d(violations)j(of)d(the)37 1826 y -(\014rst)k(six)g(prop)q(erties,)g(but)g(violations)h(of)e(the)h(sev)o(en)o -(th)f(prop)q(ert)o(y)h(migh)o(t)f(not)g(b)q(e)i(\015agged.)k(The)14 b(prop)q -(erties)37 1882 y(are:)93 1976 y(1.)22 b fi(Unique)16 b(Sup)n(er)n(class.)j fl -(After)c(refactoring,)f(a)h(class)g(m)o(ust)g(alw)o(a)o(ys)g(ha)o(v)o(e)f(at) -h(most)f(one)i(direct)g(sup)q(er-)151 2033 y(class)g(and)f(its)h(sup)q(erclas\ -s)g(m)o(ust)f(not)f(also)i(b)q(e)f(one)h(of)f(its)g(sub)q(classes.)21 b(The) -16 b(fo)q(cus)f(of)g(this)h(researc)o(h)151 2089 y(w)o(as)f(up)q(on)g(single) -i(inheritance)g(systems,)d(without)h(cycles)i(in)f(the)f(inheritance)i(graph.) -1689 2073 y fs(2)93 2183 y fl(2.)22 b fi(Distinct)d(Class)f(Names.)30 b fl -(After)18 b(refactoring,)h(eac)o(h)f(class)h(m)o(ust)f(ha)o(v)o(e)g(a)h(uniqu\ -e)h(name.)30 b(In)19 b(this)151 2239 y(researc)o(h,)c(classes)g(are)g(not)g -(nested;)g(that)g(is,)g(the)h(scop)q(e)f(of)g(eac)o(h)g(class)h(is)g(the)f -(en)o(tire)h(program.)37 2320 y 750 2 v 89 2347 a fu(1)107 2363 y fp(They)h -(are)g(similar)j(to)d(the)g(prop)q(erties)i(analyzed)g(in)f([9,)f(31].)29 b -(Those)18 b(e\013orts)f(fo)q(cused)h(on)g(restructurings)h(in)o(v)o(olving)37 -2409 y(program)c(data,)e(while)i(this)g(researc)o(h)f(considers)h(structural) -g(c)o(hanges)g(to)e(b)q(oth)h(functions)h(and)f(data.)19 b(The)14 b(C++)e(lan\ -guage)37 2454 y(is)17 b(a)e(seman)o(tically)k(complicated)e(language,)h(supp) -q(orting)g(mac)o(hine)f(lev)o(el)g(op)q(erations)g(suc)o(h)f(as)g(p)q(oin)o -(ter)h(arithmetic;)h(these)37 2500 y(complexities)e(mak)o(e)e(it)f(di\016cult) -i(to)e(more)g(precisely)i(de\014ne)f(what)f(b)q(eha)o(vior)i(preserv)n(ation) -g(means)e(for)g(C++)f(programs.)89 2530 y fu(2)107 2546 y fp(Smalltalk)19 b -(is)f(a)f(language)i(with)f(these)f(features,)h(and)g(the)f(C++)f(based)i(app\ -lication)j(framew)o(ork)c(analyzed)i(in)e(this)37 2591 y(researc)o(h)d(had)g -(these)f(features.)952 2760 y fl(27)g eop bop 93 42 a fl(3.)22 b fi(Distinct) -17 b(Memb)n(er)g(Names.)23 b fl(After)16 b(refactoring,)f(all)j(mem)o(b)q(er) -e(v)m(ariables)i(and)e(functions)h fi(within)g(a)151 98 y(class)f fl(ha)o(v)o -(e)g(distinct)i(names.)24 b(Ho)o(w)o(ev)o(er,)15 b(this)i(do)q(es)g(allo)o -(w,)g(for)f(example,)h(a)f(mem)o(b)q(er)h(function)h(in)151 154 y(a)d(sup)q -(erclass)h(to)f(b)q(e)h(o)o(v)o(erridden)f(in)h(a)f(sub)q(class.)93 244 y(4.) -22 b fi(Inherite)n(d)12 b(Memb)n(er)f(V)m(ariables)h(Not)g(R)n(e)n(de\014ne)n -(d.)17 b fl(A)11 b(mem)o(b)q(er)g(v)m(ariable)h(inherited)h(from)d(a)g(sup)q -(erclass)151 301 y(is)16 b(not)f(rede\014ned)h(in)g(an)o(y)f(of)g(its)g(sub)q -(classes.)93 391 y(5.)22 b fi(Comp)n(atible)f(Signatur)n(es)f(in)g(Memb)n(er) -h(F)m(unction)f(R)n(e)n(de\014nition.)34 b fl(After)20 b(refactoring,)h(if)g -(a)f(mem-)151 447 y(b)q(er)e(function)f(de\014ned)i(in)f(a)e(sup)q(erclass)i -(is)g(rede\014ned)g(in)g(a)e(sub)q(class,)j(all)e(attributes)g(\(except)g(the) -151 504 y(function)h(b)q(o)q(dy\))f(of)g(the)g(t)o(w)o(o)f(functions)i(m)o -(ust)e(b)q(e)i(compatible.)27 b(All)18 b(functions)g(are)e(\(using)i(C++)151 -560 y(terminology\))c(virtual,)g(and)g(can)g(b)q(e)h(o)o(v)o(erridden)f(in)h -(sub)q(classes.)21 b(Signatures)14 b(of)f(virtual)i(functions)151 616 y(in)h -(C++)g(are)f(compatible)h(only)g(if)f(their)h(\(return)f(and)g(argumen)o(t\)) -f(t)o(yp)q(es)i(matc)o(h)e(exactly)i([41)o(].)1846 600 y fs(3)151 690 y fl -(This)i(allo)o(ws)f(a)f(function)i(de\014ned)h(in)e(a)g(sup)q(erclass)h(to)e -(b)q(e)i(o)o(v)o(erridden)f(in)h(a)f(sub)q(class,)h(as)f(long)g(as)151 746 y -(the)e(signatures)f(are)g(compatible.)21 b(The)15 b(abilit)o(y)h(to)d(o)o(v)o -(erride)i(inherited)h(functions)g(is)f(imp)q(ortan)o(t)f(in)151 802 y(refacto\ -ring.)23 b(F)l(or)16 b(example,)h(in)g(de\014ning)h(an)f(abstract)e(class)i -(it)g(is)g(sometimes)f(useful)h(to)f(de\014ne)i(a)151 859 y(function)12 b(in) -g(the)f(sup)q(erclass)h(that)e(do)q(es)h(not)g(con)o(tain)g(a)f(function)i -(b)q(o)q(dy;)h(the)e(function)g(is)h(o)o(v)o(erridden)151 915 y(in)k(sub)q -(classes,)g(where)g(the)f(function)h(b)q(o)q(dy)g(is)g(de\014ned.)93 1005 y -(6.)22 b fi(T)m(yp)n(e-Safe)d(Assignments.)31 b fl(After)19 b(a)g(refactoring\ -,)g(the)h(t)o(yp)q(e)f(of)g(eac)o(h)h(expression)g(assigned)g(to)f(a)151 1062 -y(v)m(ariable)e(m)o(ust)d(b)q(e)i(an)f(instance)h(of)f(the)g(v)m(ariable's)h -(de\014ned)h(t)o(yp)q(e,)e(or)f(\(if)i(it)f(is)h(a)f(p)q(oin)o(ter)g(v)m(aria\ -ble\))151 1118 y(p)q(ossibly)21 b(an)d(instance)i(of)e(one)h(of)g(its)g(subt) -o(yp)q(es.)31 b(\(In)19 b(C++,)h(subt)o(yping)g(is)f(implemen)o(ted)i(using) -151 1175 y(sub)q(classing.\))g(`)15 b(This)h(applies)h(b)q(oth)e(to)g(assignm\ -en)o(t)g(statemen)o(ts)f(and)h(function)h(calls.)93 1264 y(7.)22 b fi(Semanti\ -c)n(al)r(ly)15 b(Equivalent)h(R)n(efer)n(enc)n(es)e(and)i(Op)n(er)n(ations.)k -fl(This)c(topic)f(is)h(discussed)h(b)q(elo)o(w.)37 1384 y fe(4.1.1)56 b(Seman) -n(tically)16 b(Equiv)m(alen)n(t)h(References)g(and)i(Op)r(erations.)37 1470 y -fl(As)c(noted)f(ab)q(o)o(v)o(e,)f(sa)o(ying)h(that)g(refactorings)f(are)h(b)q -(eha)o(vior)h(preserving)g(is)f(more)g(than)g(sa)o(ying)g(that)f(they)37 1527 -y(pro)q(duce)k(legal)g(programs.)k(The)c(v)o(ersions)f(of)f(the)h(program)f -(b)q(efore)h(and)h(after)e(a)g(refactoring)h(m)o(ust)f(also)37 1583 y(pro)q -(duce)f fi(semantic)n(al)r(ly)e(e)n(quivalent)h(r)n(efer)n(enc)n(es)f(and)i -(op)n(er)n(ations.)k fl(Seman)o(tic)13 b(equiv)m(alence)i(is)e(de\014ned)h -(here)37 1640 y(as)i(follo)o(ws:)22 b(let)17 b(the)g(external)f(in)o(terface) -h(to)e(the)i(program)e(b)q(e)i(via)f(the)h(function)g fi(main)p fl(.)23 b(If) -16 b(the)h(function)37 1696 y fi(main)e fl(is)g(called)i(t)o(wice)e(\(once)g -(b)q(efore)g(and)g(once)g(after)f(a)g(refactoring\))g(with)i(the)f(same)f(set) -h(of)f(inputs,)h(the)37 1752 y(resulting)i(set)e(of)f(output)h(v)m(alues)i -(m)o(ust)d(b)q(e)i(the)g(same.)108 1809 y(This)h(de\014nition)g(of)f(seman)o -(tic)g(equiv)m(alence)j(allo)o(ws)d(c)o(hanges)g(throughout)f(the)h(program,) -f(as)h(long)g(as)37 1865 y(this)d(mapping)g(of)f(input)i(to)d(output)i(v)m -(alues)g(remains)g(the)f(same.)19 b(Imagine)13 b(that)f(a)g(circle)i(is)f(dra) -o(wn)e(around)37 1922 y(the)i(parts)f(of)h(a)f(program)g(a\013ected)g(b)o(y)h -(a)g(refactoring.)18 b(The)13 b(b)q(eha)o(vior)h(as)e(view)o(ed)i(from)e(outs\ -ide)h(the)g(circle)37 1978 y(do)q(es)18 b(not)e(c)o(hange.)26 b(F)l(or)16 b -(some)h(refactorings,)g(the)g(circle)h(surrounds)g(most)e(or)g(all)i(of)f(the) -g(program.)24 b(F)l(or)37 2035 y(example,)14 b(if)e(a)g(v)m(ariable)i(is)f -(referenced)g(throughout)e(a)h(program,)f(the)i(refactoring)e(that)h(c)o(hang\ -es)g(its)g(name)37 2091 y(will)18 b(a\013ect)d(m)o(uc)o(h)h(of)f(the)h(progra\ -m.)21 b(F)l(or)15 b(other)h(refactorings,)f(the)h(circle)h(co)o(v)o(ers)e(a)h -(m)o(uc)o(h)g(smaller)g(area;)37 2148 y(for)c(example,)i(only)f(part)f(of)g -(one)g(function)h(b)q(o)q(dy)g(is)g(e\013ected)g(when)g(a)f(particular)h(func\ -tion)g(call)h(con)o(tained)37 2204 y(in)h(it)f(is)g(inline)i(expanded.)21 b -(In)14 b(b)q(oth)g(cases,)f(the)h(k)o(ey)g(idea)g(is)g(that)f(the)h(results)g -(\(including)i(side)f(e\013ects\))e(of)37 2261 y(op)q(erations)j(in)o(v)o(ok) -o(ed)g(and)g(references)g(made)f(from)g(outside)h(the)g(circle)h(do)e(not)g -(c)o(hange,)h(as)f(view)o(ed)h(from)37 2317 y(outside)g(the)g(circle.)37 2448 -y(This)g(allo)o(ws)g(for)e(sev)o(eral)i(imp)q(ortan)o(t)e(c)o(hanges)i(that)e -(don't)h(a\013ect)f(equiv)m(alence:)37 2522 y 750 2 v 89 2548 a fu(3)107 2564 -y fp(Signature)f(compatibili)q(t)o(y)h(has)e(di\013eren)o(t)h(meanings)g(in)f -(other)g(ob)r(ject)f(orien)o(ted)i(languages)h(suc)o(h)e(as)f(Ei\013el)1698 -2547 y fw(R)1687 2548 y fn(\015)1739 2564 y fp([79].)16 b(Ei\013el)37 2610 y -(is)e(a)f(registered)h(trademark)g(of)f(In)o(teractiv)o(e)h(Soft)o(w)o(are)f -(Engineering,)j(Inc.)952 2760 y fl(28)g eop bop 106 42 a fj(\017)22 b fl(expr\ -essions)f(can)g(b)q(e)g(simpli\014ed)i(and)e(dead)f(co)q(de)h(remo)o(v)o(ed.) -35 b(Conditional)22 b(statemen)o(ts)d(can)i(b)q(e)151 98 y(simpli\014ed)e(bas\ -ed)d(on)g(in)o(v)m(arian)o(t)h(conditions)g(kno)o(wn)f(when)h(the)f(condition\ -al)i(is)e(encoun)o(tered)h(\(eg.)151 154 y(class)d(in)o(v)m(arian)o(t\).)19 b -(V)l(ariables,)c(functions)f(and)g(classes)g(can)f(b)q(e)h(remo)o(v)o(ed)f -(if)h(they)f(are)g(unreferenced.)106 248 y fj(\017)22 b fl(similarly)l(,)17 b -(v)m(ariables,)f(functions)g(and)f(classes)h(can)f(b)q(e)h(added)g(if)g(they) -f(are)g(unreferenced.)106 342 y fj(\017)22 b fl(the)12 b(t)o(yp)q(e)f(of)g -(a)g(v)m(ariable)i(can)f(b)q(e)g(c)o(hanged)g(b)o(y)f(a)g(refactoring,)g(as)h -(long)f(as)g(eac)o(h)h(op)q(eration)f(referenced)151 399 y(on)k(the)h(v)m(ari\ -able)g(is)g(de\014ned)g(equiv)m(alen)o(tly)i(for)d(its)g(new)g(t)o(yp)q(e.) -106 492 y fj(\017)22 b fl(references)d(to)e(a)h(v)m(ariable)i(and)e(function) -h(de\014ned)h(in)f(one)f(class)g(can)h(b)q(e)f(replaced)i(b)o(y)e(references) -151 549 y(to)h(an)g(equiv)m(alen)o(t)i(v)m(ariable)g(or)e(function)h(de\014ne\ -d)h(in)f(another)f(class.)33 b(One)20 b(implication)i(of)d(this)151 605 y(is) -g(that)e(lo)q(cally)j(de\014ned)f(mem)o(b)q(ers)g(can)f(b)q(e)h(replaced)g -(b)o(y)f(inherited)i(mem)o(b)q(ers)e(\(and)g(vice-v)o(ersa\))151 662 y(pro)o -(vided)13 b(that)f(the)g(mem)o(b)q(er)h(declarations)g(are)f(equiv)m(alen)o -(t.)20 b(In)13 b(addition,)h(references)f(to)e(mem)o(b)q(ers)151 718 y(of)17 b -(an)h(aggregate)d(ob)s(ject)i(can)h(b)q(e)g(replaced)h(b)o(y)e(references)h -(to)f(mem)o(b)q(ers)h(of)f(one)g(of)g(its)h(exclusiv)o(e)151 775 y(comp)q(one\ -n)o(t)d(\(and)h(vice-v)o(ersa\).)108 868 y(One)f(v)o(ery)e(restrictiv)o(e)h -(w)o(a)o(y)f(to)g(ensure)h(that)f(the)h(program)f(remains)h(seman)o(tically)h -(equiv)m(alen)o(t)g(across)37 925 y(a)i(refactoring)f(is)h(to)f(require)i(tha\ -t)e(after)g(a)g(refactoring)h(all)g(references)h(are)e(to)g(the)h(same)f(v)m -(ariables)i(and)37 981 y(functions)i(de\014ned)g(in)g(the)f(same)f(classes)h -(as)g(b)q(efore)g(the)f(refactoring.)30 b(There)19 b(are)g(a)f(few)h(refactor\ -ings)37 1038 y(that)d(this)h(w)o(ould)f(p)q(ermit,)h(suc)o(h)f(as)g(adding)h -(a)f(new)h(v)m(ariable)g(or)f(renaming)g(an)h(existing)g(one.)23 b(Ho)o(w)o -(ev)o(er,)37 1094 y(it)16 b(w)o(ould)g(prev)o(en)o(t)f(man)o(y)f(useful)j(ref\ -actoring)d(op)q(erations.)108 1151 y(Beha)o(vior)d(can)f(b)q(e)i(preserv)o -(ed)e(under)i(less)f(restrictiv)o(e)g(conditions,)h(when)f(for)f(example)h -(a)f(class)h(mem)o(b)q(er)37 1207 y(is)h(mo)o(v)o(ed)f(up)h(or)e(do)o(wn)h -(an)g(inheritance)i(hierarc)o(h)o(y)l(,)f(or)f(when)h(a)f(mem)o(b)q(er)g(is)h -(mo)o(v)o(ed)e(b)q(et)o(w)o(een)i(an)f(aggregate)37 1264 y(class)20 b(and)f -(a)g(comp)q(onen)o(t)g(class.)32 b(When)19 b(a)g(mem)o(b)q(er)g(v)m(ariable)h -(is)g(mo)o(v)o(ed)e(from)g(one)i(class)f(to)f(another,)37 1320 y(b)q(eha)o -(vior)g(will)g(b)q(e)g(preserv)o(ed)f(if)g(there)g(is)h(a)e(strict)h(one-to-o\ -ne)g(relationship)i(b)q(et)o(w)o(een)e(the)g(old)g(v)m(ariable)37 1377 y(and) -f(new)f(v)m(ariable:)106 1470 y fj(\017)22 b fl(in)16 b(the)f(new)h(class)f -(the)h(v)m(ariable)g(has)f(the)h(same)f(t)o(yp)q(e)g(and)g(lifetime)i(as)e -(b)q(efore,)106 1564 y fj(\017)22 b fl(all)16 b(references)g(to)f(the)g(old)h -(v)m(ariable)g(are)f(c)o(hanged)h(to)e(refer)h(to)g(the)g(new)h(v)m(ariable,) -106 1658 y fj(\017)22 b fl(the)15 b(new)h(v)m(ariable)g(is)g(not)f(otherwise) -g(referenced.)108 1752 y(These)h(preconditions)h(are)e(more)h(easily)g(c)o -(hec)o(k)o(ed)g(for)f(refactorings)g(in)o(v)o(olving)i(inheritance)h(than)d -(for)37 1808 y(refactorings)g(in)o(v)o(olving)i(aggregates)c(and)j(comp)q(one\ -n)o(ts,)f(as)f(is)i(detailed)h(in)f(the)f(later)g(c)o(hapters.)108 1865 y(Som\ -e)20 b(refactorings)g(c)o(hange)h(the)f(size)h(of)f(ob)s(jects)g(or)f(c)o(han\ -ge)i(the)f(relativ)o(e)h(ph)o(ysical)h(p)q(ositions)f(of)37 1921 y(v)m(ariabl\ -es)f(within)g(an)e(ob)s(ject.)29 b(These)19 b(refactorings)f(are)g(b)q(eha)o -(vior)h(preserving)g(only)g(for)f(w)o(ell)h(b)q(eha)o(v)o(ed)37 1978 y(C++)13 -b(programs.)k(Consider)c(the)e(ph)o(ysical)i(la)o(y)o(out)f(of)f(a)g(class)h -(in)h(C++,)g(in)f(whic)o(h)h(the)f(v)m(ariables)h(inherited)37 2034 y(from)h -(a)g(sup)q(erclass)h(precede)g(v)m(ariables)h(lo)q(cally)g(de\014ned.)21 b -(The)14 b(refactoring)g(that)f(mo)o(v)o(es)h(a)g(v)m(ariable)h(from)37 2090 y -(a)i(sub)q(class)h(to)e(sup)q(erclass)i(is)f(b)q(eha)o(vior)h(preserving)f -(as)g(long)g(as)f(the)h(program)f(is)h(not)f(dep)q(enden)o(t)j(up)q(on)37 2147 -y(the)j(ph)o(ysical)g(ordering)g(of)e(v)m(ariables.)39 b(If)22 b(a)f(program) -f(then)h(p)q(erforms)g(in)o(teger)g(arithmetic)h(with)f(the)37 2203 y(address) -15 b(of)e(a)h(mem)o(b)q(er)h(v)m(ariable,)g(then)g(the)f(b)q(eha)o(vior)g(of) -g(the)g(program)f(ma)o(y)h(c)o(hange)g(when)h(the)f(v)m(ariable)37 2260 y(is) -j(mo)o(v)o(ed.)23 b(Similarly)l(,)c(consider)e(the)f(refactoring)g(that)g(mo) -o(v)o(es)f(a)h(v)m(ariable)i(from)d(an)i(aggregate)d(class)j(to)37 2316 y(a)f -(comp)q(onen)o(t)f(class.)21 b(In)16 b(this)g(case,)f(the)h(size)g(of)f(eac)o -(h)h(class)g(c)o(hanges.)21 b(If)15 b(a)g(program)g(tests)g(the)g(ph)o(ysical) -37 2373 y(size)i(of)d(an)i(ob)s(ject,)e(the)h(b)q(eha)o(vior)h(of)f(the)g(pro\ -gram)f(ma)o(y)g(c)o(hange)i(when)f(the)h(v)m(ariable)g(is)g(mo)o(v)o(ed.)108 -2429 y(The)f(refactoring)f(approac)o(h)g(de\014ned)i(in)f(this)g(thesis)g(do) -q(es)g(not)f(apply)i(to)e(programs)f(that)h(are)g(dep)q(en-)37 2486 y(den)o -(t)i(up)q(on)g(the)f(ph)o(ysical)i(la)o(y)o(out)e(and)h(size)g(of)f(ob)s(ject\ -s.)k(F)l(ortunately)l(,)d(most)e(ob)s(ject)h(orien)o(ted)h(programs)37 2542 y -(are)g(not)f(dep)q(enden)o(t)i(up)q(on)f(these)g(features.)21 b(A)15 b(ma)s -(jor)g(attractiv)o(eness)f(of)i(ob)s(ject-orien)o(ted)f(languages)h(is)37 2599 -y(that)d(they)g(pro)o(vide)g(a)g(lev)o(el)h(of)e(abstraction)h(that)f(shields) -j(the)d(user)i(from)e(the)h(underlying)h(represen)o(tation)952 2760 y(29)g eop -bop 37 42 a fl(of)13 b(ob)s(jects;)f(it)h(is)g(generally)h(considered)g(bad)f -(st)o(yle)g(to)f(write)g(programs)g(that)g(dep)q(end)i(on)e(this)i(underlying) -37 98 y(represen)o(tation.)22 b(Refactorings)15 b(that)g(can)h(c)o(hange)g -(the)g(ph)o(ysical)g(size)h(and)f(la)o(y)o(out)f(of)g(ob)s(jects)g(are)g(note\ -d)37 154 y(as)g(suc)o(h)h(in)g(later)f(c)o(hapters)g(of)g(the)g(thesis.)37 273 -y fe(4.1.2)56 b(Summary:)22 b(Program)17 b(Prop)r(erties)g(and)j(Beha)n(vior) -e(Preserv)m(ation)37 358 y fl(In)h(summary)l(,)g(refactorings)f(preserv)o(e)g -(the)h(b)q(eha)o(vior)g(of)f(a)g(program.)28 b(This)19 b(implies)h(that)e(ref\ -actorings)37 415 y(alw)o(a)o(ys)13 b(result)h(in)g(legal)g(programs)f(that)f -(p)q(erform)h(op)q(erations)h(equiv)m(alen)o(t)h(to)e(b)q(efore)h(the)f(refac\ -toring.)19 b(In)37 471 y(this)d(thesis,)f(b)q(eha)o(vior)g(preserv)m(ation)h -(is)f(argued)g(in)h(terms)e(of)h(the)g(sev)o(en)g(program)f(prop)q(erties)i -(describ)q(ed)37 528 y(ab)q(o)o(v)o(e.)30 b(These)19 b(prop)q(erties)h(are)e -(the)h(ones)f(found)h(to)f(b)q(e)h(most)f(frequen)o(tly)h(violated)h(when)f -(refactoring)37 584 y(programs.)108 641 y(Chapter)h(\014v)o(e)f(describ)q(es) -j(the)e(lo)o(w-lev)o(el)h(refactorings.)33 b(There,)21 b(b)q(eha)o(vior)f(pre\ -serv)m(ation)g(is)h(argued)37 697 y(in)e(terms)e(of)g(the)g(program)g(prop)q -(erties)h(describ)q(ed)h(ab)q(o)o(v)o(e.)26 b(Chapters)18 b(six)f(through)h -(eigh)o(t)f(describ)q(e)i(the)37 754 y(high-lev)o(el)h(refactorings.)27 b(Beh\ -a)o(vior)18 b(preserv)m(ation)g(of)f(those)g(refactorings)g(is)i(mainly)f(arg\ -ued)g(in)g(terms)37 810 y(of)d(the)h(lo)o(w)o(er)e(lev)o(el)j(refactorings)e -(used)g(to)g(comp)q(ose)g(it.)37 950 y fd(4.2)70 b(Domains)22 b(of)h(Refactor\ -ings)37 1051 y fl(The)16 b(argumen)o(ts)e(to)h(refactorings)g(are)f(t)o(yp)q -(ed;)i(the)f(t)o(yp)q(es)g(and)g(their)h(attributes)f(are)g(de\014ned)i(b)q -(elo)o(w.)108 1108 y(Asso)q(ciated)g(with)h(eac)o(h)f(v)m(ariable)h(and)f(fun\ -ction)h(is)f(an)g(attribute)f(that)h(indicates)h(its)f(scop)q(e.)25 b(There) -37 1164 y(are)12 b(four)g(kinds)h(of)e(v)m(ariables)i(in)g(C++:)19 b(global) -13 b(v)m(ariables,)g(class)f(mem)o(b)q(er)g(v)m(ariables,)i(argumen)o(t)d(v)m -(ariables)37 1221 y(in)k(a)e(function,)h(and)f(v)m(ariables)i(lo)q(cal)f(to)f -(a)g(statemen)o(t)f(list)i(of)f(a)g(function.)20 b(Tw)o(o)13 b(kinds)h(of)f -(C++)h(functions)37 1277 y(are)h(considered)i(in)f(this)g(researc)o(h:)j(a)c -(single)i(global)f(function)g fi(main\(\))e fl(and)h(class)h(mem)o(b)q(er)f -(functions.)108 1333 y(When)d(adding)h(a)e(new)h(v)m(ariable,)i(a)d(name)h -(collision)i(o)q(ccurs)e(if,)g(within)h(the)f(scop)q(e)g(of)g(the)f(new)h(v)m -(ariable,)37 1390 y(there)18 b(is)h(a)e(reference)i(to)e(a)h(v)m(ariable)h -(with)f(the)g(same)g(name)g(de\014ned)h(in)g(an)e(enclosing)j(scop)q(e.)28 b -(F)l(or)17 b(the)37 1446 y(purp)q(oses)d(of)f(c)o(hec)o(king)i(name)e(collisi\ -ons,)j(the)d(scop)q(e)h(of)f(a)g(v)m(ariable)i(is)f(as)f(follo)o(ws.)19 b(The) -14 b(scop)q(e)g(of)f(a)g(global)37 1503 y(v)m(ariable)k(is)f(the)f(en)o(tire) -h(program)e fi(Pr)n(o)n(gr)n(am)p fl(.)19 b(The)d(scop)q(e)f(of)g(a)g(class)h -(mem)o(b)q(er)f(v)m(ariable)i(is)e(the)h(class)f(that)37 1559 y(con)o(tains)i -(it,)g(if)g(the)f(v)m(ariable's)i(accessCon)o(trolMo)q(de)e(is)h(priv)m(ate;) -g(otherwise,)g(the)f(con)o(taining)h(class)g(and)37 1616 y(its)g(sub)q(classe\ -s.)313 1599 y fs(4)358 1616 y fl(The)g(scop)q(e)g(of)g(an)f(argumen)o(t)g(v)m -(ariable)i(is)f(the)g(function)g(that)f(con)o(tains)h(it.)25 b(Similarly)l -(,)37 1672 y(the)16 b(scop)q(e)g(of)e(a)h(lo)q(cal)h(v)m(ariable)h(is)f(its)f -(con)o(taining)h(blo)q(c)o(k.)108 1729 y(F)l(unctions)e(are)f(restricted)h -(to)f(a)g(single)i(global)f(function)g fi(main\(\))f fl(and)h(a)f(set)g(a)g -(mem)o(b)q(er)h(functions)g(for)37 1785 y(eac)o(h)h(class.)243 1769 y fs(5) -283 1785 y fl(F)l(unctions)g(de\014ned)g(in)g(a)f(sup)q(erclass)i(can)e(b)q -(e)h(o)o(v)o(erridden)g(in)g(a)f(sub)q(class,)h(as)f(long)h(as)f(either)37 -1842 y(the)j(sup)q(erclass)h(function)g(is)f(not)g(referenced)h(within)g(the) -f(scop)q(e)g(of)f(the)h(class)g(that)f(will)j(o)o(v)o(erride)e(it,)g(or)37 -1898 y(the)f(new)f(function)h(is)g(equiv)m(alen)o(t)h(with)e(the)h(function)g -(it)f(replaces.)108 1954 y(A)o(ttributes)g(are)g(listed)h(with)g(their)g(allo) -o(w)o(able)g(t)o(yp)q(e\(s\))e(follo)o(w)o(ed)i(b)o(y)f(their)h(name:)106 2030 -y fj(\017)22 b fl(program:)202 2116 y fh({)h fl(\(set)15 b(of)g(class\))g(cla\ -sses)202 2182 y fh({)23 b fl(function)16 b(globalF)l(unctionMain)823 2165 y fs -(6)37 2248 y 750 2 v 89 2274 a fu(4)107 2290 y fp(In)f(cases)g(where)g(the)g -(v)n(ariable's)i(accessCon)o(trolMo)q(de)h(is)d(public,)j(the)d(v)n(ariable)i -(can)e(b)q(e)h(referenced)f(elsewhere)h(in)g(the)37 2336 y(program,)c(but,)g -(outside)h(the)e(v)n(ariable's)i(con)o(taining)h(class)e(and)g(its)g(sub)q -(classes,)h(references)f(to)f(the)h(v)n(ariable)h(will)g(b)q(e)e(pre\014xed) -37 2382 y(with)j(the)f(name)h(of)e(the)h(ob)r(ject)h(con)o(taining)h(the)e -(mem)o(b)q(er)h(v)n(ariable.)89 2411 y fu(5)107 2427 y fp(This)d(restriction) -i(to)e(a)g fm(single)e fp(global)k(function)g(w)o(as)e(made)g(to)g(a)o(v)o -(oid)h(complicating)i(the)e(notation)g(of)f(some)g(refactorings.)37 2473 y -(A)i(straigh)o(tforw)o(ard)h(extension)h(could)g(allo)o(w)f(m)o(ultiple)h(glo\ -bal)g(functions.)89 2503 y fu(6)107 2519 y fp(C++)e(allo)o(ws)j(m)o(ultiple)h -(global)g(functions.)23 b(Here,)15 b(a)f(program)i(consists)g(of)e(a)g(single) -j(global)g(function)f fm(main)p fp(,)d(whic)o(h)j(is)37 2564 y(not)f(renamabl\ -e.)21 b(This)15 b(restriction,)g(whic)o(h)g(is)f(not)h(signi\014can)o(t,)h -(w)o(as)e(made)g(to)g(a)o(v)o(oid)h(complicating)i(the)d(notation)h(of)f(some) -37 2610 y(refactorings.)19 b(A)12 b(straigh)o(tforw)o(ard)j(extension)g(could) -f(allo)o(w)g(m)o(ultiple)i(global)f(functions.)952 2760 y fl(30)g eop bop 202 -42 a fh({)23 b fl(\(set)15 b(of)h(v)m(ariable\))g(globalV)l(ariables)i(of)d -(their)h(argumen)o(ts;)f(the)h(functions)g(are)f(argumen)o(t)g(do-)251 98 y -(mains)h(are)f(de\014ned)h(here.)202 170 y fh({)23 b fl(\(set)15 b(of)g(en)o -(umeratedT)o(yp)q(e\))g(globalEn)o(umeratedT)o(yp)q(es)106 262 y fj(\017)22 b -fl(class:)202 354 y fh({)h fl(class)16 b(sup)q(erclass)202 426 y fh({)23 b fl -(string)15 b(name)202 498 y fh({)23 b fl(\(set)15 b(of)g(function\))g(lo)q -(callyDe\014nedMem)o(b)q(erF)l(unc)q(tions)202 569 y fh({)23 b fl(\(set)15 b -(of)g(v)m(ariable\))h(lo)q(callyDe\014nedMem)o(b)q(erV)l(ariabl)q(es)202 641 y -fh({)23 b fl(\(set)15 b(of)g(v)m(ariable\))h(SetOfComp)q(onen)o(ts)202 713 y -fh({)23 b fl(predicate)16 b(classIn)o(v)m(arian)o(t)106 805 y fj(\017)22 b fl -(en)o(umeratedT)o(yp)q(e:)202 898 y fh({)h fl(string)15 b(name)202 969 y fh -({)23 b fl(\(set)15 b(of)g(string\))f(en)o(umeratedV)l(alues)106 1062 y fj -(\017)22 b fl(function:)202 1154 y fh({)h fl(\(class)15 b(+)h(program\))e(o)o -(wner)202 1226 y fh({)23 b fl(string)15 b(name)202 1297 y fh({)23 b fl(t)o -(yp)q(e)15 b(returnT)o(yp)q(e)202 1369 y fh({)23 b fl(\(list)16 b(of)f(v)m -(ariable\))h(argumen)o(ts)202 1441 y fh({)23 b fl(statemen)o(t)14 b(b)q(o)q -(dy)l(.)202 1512 y fh({)23 b fl(\(nil)16 b(+)g(priv)m(ate)g(+)f(protected)h -(+)f(public\))i(accessCon)o(trolMo)q(de)106 1605 y fj(\017)22 b fl(v)m(ariabl\ -e:)202 1697 y fh({)h fl(\(statemen)o(t)14 b(+)h(function)h(+)g(class)g(+)f -(program\))f(o)o(wner)202 1769 y fh({)23 b fl(string)15 b(name)202 1841 y fh -({)23 b fl(t)o(yp)q(e)15 b(t)o(yp)q(e)202 1912 y fh({)23 b fl(\(set)15 b(of)g -(constan)o(t\))f(initializationArgumen)o(ts)202 1984 y fh({)23 b fl(\(nil)16 b -(+)g(priv)m(ate)g(+)f(protected)h(+)f(public\))i(accessCon)o(trolMo)q(de)106 -2076 y fj(\017)22 b fl(t)o(yp)q(e:)e(program.classes)14 b(+)i(Primitiv)o(eT)o -(yp)q(es.)202 2169 y fh({)23 b fl(string)15 b(name)106 2261 y fj(\017)22 b fl -(statemen)o(t:)202 2354 y fh({)h fl(\(statemen)o(t)14 b(+)h(function\))h(o)o -(wner)202 2425 y fh({)23 b fl(\(list)16 b(of)f(\(statemen)o(t)e(+)j(expressio\ -n\)\))f(comp)q(onen)o(ts)106 2518 y fj(\017)22 b fl(expression:)f(assignmen)o -(t)15 b(+)g(v)m(ariableRef)j(+)d(functionCall)i(+)e(dynamicOb)s(jectExpressio\ -n)106 2610 y fj(\017)22 b fl(assignmen)o(t:)952 2760 y(31)g eop bop 202 42 a -fh({)23 b fl(\(expression)16 b(+)f(statemen)o(t\))f(o)o(wner)202 115 y fh({) -23 b fl(v)m(ariable)17 b(destination)202 188 y fh({)23 b fl(expression)16 b -(source)202 261 y fh({)23 b fl(t)o(yp)q(e)15 b(t)o(yp)q(e)106 355 y fj(\017) -22 b fl(dynamicOb)s(jectExpression:)202 448 y fh({)h fl(class)16 b(instan)o -(tiatedClass)202 521 y fh({)23 b fl(\(list)16 b(of)f(expression\))g(parameter\ -s)106 615 y fj(\017)22 b fl(functionCall:)202 709 y fh({)h fl(\(expression)16 -b(+)f(statemen)o(t\))f(o)o(wner)202 782 y fh({)23 b fl(function)16 b(calledF) -l(unction)202 855 y fh({)23 b fl(\(list)16 b(of)f(expression\))g(parameters) -202 928 y fh({)23 b fl(t)o(yp)q(e)15 b(t)o(yp)q(e)202 1001 y fh({)23 b fl(exp\ -ression)16 b(pre\014x.)595 985 y fs(7)106 1095 y fj(\017)22 b fl(v)m(ariableR\ -ef:)202 1189 y fh({)h fl(\(expression)16 b(+)f(statemen)o(t\))f(o)o(wner)202 -1262 y fh({)23 b fl(v)m(ariable)17 b(refdV)l(ariable)202 1335 y fh({)23 b fl -(expression)16 b(pre\014x.)595 1318 y fs(8)106 1429 y fj(\017)22 b fl(predica\ -te:)f(used)16 b(in)g(de\014ning)g(class)g(in)o(v)m(arian)o(ts;)f(de\014ned)i -(in)f(c)o(hapter)f(six.)108 1523 y(In)k(the)f(refactoring)g(de\014nitions,)j -(domain)e(attributes)f(are)g(referenced)h(using)g(a)f fi(dot)h fl(notation.) -29 b(F)l(or)37 1579 y(example,)16 b(the)f(return)h(t)o(yp)q(e)f(of)g(mem)o -(b)q(er)g(function)h fi(F)f fl(w)o(ould)g(b)q(e)h(referenced)g(b)o(y)g fi(F.r) -n(eturnT)m(yp)n(e)p fl(.)37 1722 y fd(4.3)70 b(F)-6 b(unctions)23 b(F)-6 b -(or)24 b(Describing)d(Preconditions)37 1824 y fl(Most)16 b(refactorings)g(are) -g(only)i(b)q(eha)o(vior)f(preserving)g(under)g(certain)g(preconditions.)26 b -(F)l(or)16 b(example,)h(the)37 1880 y(t)o(yp)q(e)e(of)e(a)h(v)m(ariable)i(can) -e(b)q(e)h(c)o(hanged)f(only)h(if)f(assignmen)o(ts)g(in)o(v)o(olving)i(the)e -(v)m(ariable)h(w)o(ould)g(remain)f(t)o(yp)q(e)37 1937 y(safe.)108 1993 y(Refa\ -ctorings)f(ha)o(v)o(e)f(their)h(preconditions)h(describ)q(ed)g(in)g(terms)e -(of)g(a)g(set)g(of)g(functions.)20 b(The)13 b(functions)37 2050 y(is)19 b(de\ -\014ned)g(b)q(elo)o(w.)28 b(There)18 b(is)g(a)g(small)g(set)g(of)f(primitiv)o -(e)j(functions,)e(follo)o(w)o(ed)g(b)o(y)g(a)g(larger)f(set)h(of)f(non-)37 -2106 y(primitiv)o(e)g(functions.)k(F)l(or)14 b(the)i(non-b)q(o)q(olean)g(func\ -tions,)g(the)f(return)g(t)o(yp)q(e)g(is)h(listed)h(b)q(efore)e(the)g(name.) -108 2162 y(In)22 b(the)f(preconditions)h(of)f(eac)o(h)g(refactoring,)h(the)f -(function)h(names)f(and)g(argumen)o(ts)f(are)h(usually)37 2219 y(descriptiv)o -(e.)i(The)16 b(de\014nitions)h(in)g(this)f(section,)g(included)i(for)d(comple\ -teness,)i(pro)o(vide)f(a)f(lev)o(el)i(of)e(detail)37 2275 y(b)q(ey)o(ond)h -(what)f(ma)o(y)f(b)q(e)i(of)f(in)o(terest)g(to)g(some)g(readers.)20 b(This)15 -b(section)h(can)g(b)q(e)f(skipp)q(ed)i(without)f(missing)37 2332 y(the)g(in)o -(ten)o(t)f(of)g(the)g(refactorings.)37 2413 y 750 2 v 89 2440 a fu(7)107 2456 -y fp(If)f(calledF)m(unction)19 b(is)c(called)i(through)f(the)f(public)j(in)o -(terface)e(of)e(an)i(ob)r(ject,)f(this)h(attribute)g(con)o(tains)h(the)e(expr\ -ession)37 2501 y(that)f(iden)o(ti\014es)h(that)e(ob)r(ject;)g(otherwise,)h -(this)g(attribute)g(is)f(nil.)89 2531 y fu(8)107 2547 y fp(If)k(refdV)m(ariab\ -le)j(is)e(a)g(mem)o(b)q(er)g(v)n(ariable)i(referenced)f(through)g(the)f(publi\ -c)i(in)o(terface)f(of)f(an)g(ob)r(ject,)h(this)g(attribute)37 2593 y(con)o -(tains)c(the)e(expression)i(that)f(iden)o(ti\014es)h(that)e(ob)r(ject;)g(othe\ -rwise,)h(this)f(attribute)i(is)e(nil.)952 2760 y fl(32)g eop bop 37 42 a fe -(4.3.1)56 b(Bo)r(olean)17 b(Primitiv)n(e)f(F)-5 b(unctions)93 127 y fl(1.)22 b -(compilesP)17 b(\(function)e(F,)g(\(class)g(+)h(program\))d(Scop)q(e\))j fj -(\021)226 184 y fl(F)f(compiles)i(within)f(its)f(Scop)q(e.)787 167 y fs(9)93 -276 y fl(2.)22 b(con)o(v)o(ertibleT)l(oF)l(unctionP)17 b(\(statemen)o(t)d(S\)) -h fj(\021)226 332 y fl(S)h(can)f(b)q(e)h(con)o(v)o(erted)f(to)f(a)h(legal)h -(function)g(\(in)g(con)o(tainingClass\(S\)\).)1467 316 y fs(10)93 424 y fl -(3.)22 b(quali\014esAsComp)q(onen)o(tP)17 b(\(v)m(ariable)f(V\))f fj(\021)226 -480 y fl(V)g(quali\014es)i(as)e(a)g(comp)q(onen)o(t)g(mem)o(b)q(er)h(v)m(aria\ -ble)g(of)f(its)g(con)o(taining)h(class.)1562 464 y fs(11)93 572 y fl(4.)22 b -(noSideE\013ectsP)16 b(\(expression)g(E\))f fj(\021)226 629 y fl(E)g(is)h(kno) -o(wn)f(to)f(ha)o(v)o(e)h(no)g(side)i(e\013ects.)93 721 y(5.)22 b(satis\014esC\ -lassIn)o(v)m(arian)o(tP)16 b(\(expression)g(E,)e(class)i(C\))f fj(\021)226 777 -y fl(instances)h(created)f(b)o(y)g(E)h(satisfy)e(the)i(class)f(in)o(v)m(arian) -o(t)h(for)f(C.)1323 761 y fs(12)93 869 y fl(6.)22 b(seman)o(ticallyEquiv)m -(alen)o(tP)c(\(\(function)d(or)g(statemen)o(t\))f(F1,)g(\(function)i(or)e(sta\ -temen)o(t\))g(F2\))g fj(\021)226 925 y fl(F1)h(is)g(seman)o(tically)i(equiv)m -(alen)o(t)g(to)d(F2.)93 1017 y(7.)22 b(subt)o(yp)q(eP\(t)o(yp)q(e)16 b(T1,)e -(t)o(yp)q(e)h(T2\))g fj(\021)226 1074 y fl(T1)g(is)h(a)e(subt)o(yp)q(e)i(of)f -(T2.)93 1166 y(8.)22 b(unrefdOnInstancesP\(function)c(F,)c(class)i(C\))e fj -(\021)226 1222 y fl(function)i(F)f(is)h(not)f(referenced)h(on)f(instances)h -(of)f(class)g(C.)37 1343 y fe(4.3.2)56 b(Other)18 b(Primitiv)n(e)e(F)-5 b(unc\ -tions)93 1429 y fl(1.)22 b(\014rstConditionImpliedByI)q(n)o(v)m(arian)o(t)c -(\(statemen)o(t)c(S)h(\(a)g(conditional\),)h(predicate)g(P\))226 1485 y(retur\ -ns)f(the)g(\014rst)g(condition)i(in)f(S)f(implied)j(b)o(y)d(P)l(.)1113 1469 y -fs(13)37 1606 y fe(4.3.3)56 b(Non-primitiv)m(e)16 b(Bo)r(olean)h(F)-5 b(uncti\ -ons)93 1692 y fl(1.)22 b(inheritedMem)o(b)q(erF)l(unctionNamedP\(cl)q(ass)17 b -(C,)e(string)g(S\))g fj(\021)226 1748 y(9)h fl(mem)o(b)q(er)f fj(2)g fl(inher\ -itedMem)o(b)q(ers\(C\))i fj(^)301 1805 y fl(mem)o(b)q(er.name)e(=)h(S.)93 1896 -y(2.)22 b(matc)o(hingA)o(ttributesP\(v)m(ariable)16 b(V1,)f(v)m(ariable)i(V2\ -\))d fj(\021)226 1953 y fl(\(V1.name)g(=)i(V2.name\))e fj(^)226 2009 y fl(\(V\ -1.t)o(yp)q(e)h(=)g(V2.t)o(yp)q(e\))f fj(^)226 2066 y fl(\(V1.initializationAr\ -gumen)o(ts)j(=)e(V2.initializationArgumen)o(ts\))i fj(^)226 2122 y fl(\(V1.ac\ -cessCon)o(trolMo)q(de)d(=)i(V2.accessCon)o(trolMo)q(de\))37 2202 y 750 2 v 89 -2229 a fu(9)107 2245 y fp(This)d(is)h(c)o(hec)o(k)o(ed)g(when)f(adding)i(a)e -(new)g(function,)h(or)f(adding)i(a)e(function)h(b)q(o)q(dy)g(to)f(a)g(functio\ -n)h(de\014nition.)74 2274 y fu(10)107 2290 y fp(S)f(m)o(ust)h(not)g(de\014ne) -g(lo)q(cal)h(v)n(ariables)h(that)e(are)f(referenced)i(outside)g(S.)e(There)g -(m)o(ust)h(b)q(e)g(no)g(branc)o(hes)h(from)e(S)g(to)h(other)37 2336 y(parts)e -(of)g(its)g(curren)o(t)g(function;)h(nor)f(ma)o(y)g(there)g(b)q(e)f(an)o(y)i -(branc)o(hes)f(in)o(to)h(the)f(middle)h(of)e(S)h(\(if)g(S)f(is)i(a)e(comp)q -(ound)i(statemen)o(t\).)37 2382 y(F)m(unctions)k(and)e(v)n(ariables)h(visible) -h(to)d(S)h(will)h(b)q(e)e(visible)j(to)e(the)f(new)g(function,)i(since)g(func\ -tions)f(and)g(non-lo)q(cal)i(v)n(ariables)37 2427 y(visible)g(to)d(S)g(w)o -(ould)h(b)q(e)f(visible)j(to)d(the)g(new)f(function)j(since)f(it)f(is)h(de\ -\014ned)g(in)g(the)f(same)g(class;)h(referenced)f(v)n(ariables)j(lo)q(cal)37 -2473 y(to)c(the)h(function)g(but)f(not)h(lo)q(cal)g(to)f(S)g(w)o(ould)h(b)q -(e)g(passed)g(as)f(argumen)o(ts.)74 2503 y fu(11)107 2519 y fp(This)g(w)o(oul\ -d)h(b)q(e)g(determined)g(using)h(the)e(algorithms)i(de\014ned)f(in)g(section) -g(8.2.)74 2548 y fu(12)107 2564 y fp(This)f(w)o(ould)h(b)q(e)g(determined)g -(using)h(the)e(algorithm)i(de\014ned)f(in)g(section)g(7.8.)74 2594 y fu(13) -107 2610 y fp(This)f(w)o(ould)h(b)q(e)g(determined)g(using)h(the)e(algorithm) -i(de\014ned)f(in)g(section)g(7.6.)952 2760 y fl(33)g eop bop 93 42 a fl(3.)22 -b(matc)o(hingA)o(ttributesP\(function)16 b(F1,)e(function)i(F2\))e fj(\021) -226 98 y fl(matc)o(hingSignatureP\(F1,)h(F2\))f fj(^)226 154 y fl(\(F1.b)q -(o)q(dy)h(=)g(F2.b)q(o)q(dy\).)93 248 y(4.)22 b(matc)o(hingSignatureP\(functi\ -on)16 b(F1,)f(function)h(F2\))e fj(\021)226 305 y fl(\(F1.name)g(=)i(F2.name\ -\))d fj(^)226 361 y fl(\(F1.returnT)o(yp)q(e)h(=)i(F2.returnT)o(yp)q(e\))e fj -(^)226 418 y fl(\(F1.accessCon)o(trolMo)q(de)g(=)h(F2.accessCon)o(trolMo)q -(de\))f fj(^)226 474 y fl(length)i(of)f(F1.argumen)o(ts)e(=)j(length)g(of)e -(F2.argumen)o(ts)g fj(^)226 531 y fl(for)h(i)g(=)h(1)f(to)f(\(length)i(of)f -(F1.argumen)o(ts\),)301 587 y(F1.argumen)o(ts[i].t)o(yp)q(e)e(=)j(F2.argumen) -o(ts[i].t)o(yp)q(e.)93 681 y(5.)22 b(mem)o(b)q(erF)l(unctionNamedP\(class)17 b -(C,)d(string)h(S\))g fj(\021)226 737 y(9)h fl(F)e fj(2)301 794 y fl(\(C.lo)q -(callyDe\014nedMem)o(b)q(erF)l(unctions)k fj([)d fl(inheritedMem)o(b)q(erF)l -(unctions\(C\)\))i fj(^)226 850 y fl(F.name)e(=)g(N.)93 944 y(6.)22 b(redunda\ -n)o(tIfAddedP\(function)c(F,)c(class)i(C\))e fj(\021)226 1000 y(9)i fl(F2)e fj -(2)i fl(\(C.sup)q(erclass\).lo)q(callyDe\014nedMem)o(b)q(erF)l(unctions)i fj -([)301 1057 y fl(inheritedMem)o(b)q(erF)l(unctions\(C.sup)q(ercl)q(ass\)\))f -fj(^)226 1113 y fl(F.name)e(=)g(F2.name)f fj(^)226 1170 y fl(matc)o(hingA)o -(ttributesP\(F,)g(F2\).)93 1264 y(7.)22 b(v)m(arNameCollisionP\(string)17 b -(S,)e(\(class)g(+)h(function)g(+)f(statemen)o(t\))f(Scop)q(e\))i fj(\021)226 -1320 y(9)g fl(collidingV)l(ar)h fj(2)f fl(Program)d fj(^)226 1377 y fl(collid\ -ingV)l(ar.name)k(=)f(S)f fj(^)226 1433 y fl(Scop)q(e)h fj(\032)g fl(scop)q -(eOf\(collidingV)l(ar\).)37 1555 y fe(4.3.4)56 b(Other)18 b(Non-primitiv)m -(e)e(functions)93 1640 y fl(1.)22 b(\(set)15 b(of)g(function\))g(allF)l(uncti\ -ons\(program)h(P\))f fj(\021)213 1743 y fk(P)q(:g)r(l)q(obal)q(F)6 b(unctionM) -f(ain)689 1702 y fa([)733 1743 y fl(\()p fj([)781 1750 y fr(class)p fq(2)p fr -(P)q(:classes)1028 1743 y fk(cl)q(ass:l)q(ocal)q(l)q(y)r(D)q(ef)g(inedM)g(emb\ -er)q(F)h(unctions)p fl(\))93 1863 y(2.)22 b(\(set)15 b(of)g(function\))g(allV) -l(ariables\(program)h(P\))f fj(\021)226 1920 y fl(returns)g(the)g(set)g(of)g -(all)h(v)m(ariables)h(declared)f(in)g(P)l(.)93 2014 y(3.)22 b(\(set)15 b(of)g -(functionCall\))h(callsT)l(o\(function)h(F1\))d fj(\021)451 2075 y fa([)251 -2169 y fr(F)5 b fs(2)p fq(2)p fr(allF)g(unctions)p fs(\()p fr(P)g(r)q(og)q -(r)q(am)p fs(\))698 2116 y fj(f)p fk(F)h(C)15 b fj(j)e fk(F)6 b(C)16 b fj(2)c -fk(F)6 b fl(2)p fk(:statement)13 b fj(^)d fk(F)c(C)q(:cal)q(l)q(edF)g(unction) -11 b fl(=)i fk(F)6 b fl(1)p fj(g)93 2285 y fl(4.)22 b(\(set)15 b(of)g(class\)) -g(classesIn)o(ternallyReferencin)q(g\(\(function)j(+)d(v)m(ariable\))i(X\))e -fj(\021)302 2387 y(f)p fk(containing)r(C)s(l)q(ass)p fl(\()p fk(r)q(ef)5 b fl -(\))12 b fj(j)g fl(\()p fk(r)q(ef)17 b fj(2)c fk(r)q(ef)5 b(er)q(encesT)h(o)p -fl(\()p fk(X)t fl(\)\))j fj(^)h fl(\()p fk(r)q(ef)r(:pr)q(ef)5 b(ix)13 b fl -(=)f fk(nil)q fl(\))p fj(g)151 2489 y fl(\(ie)k(the)f(set)g(of)g(classes)h -(in)o(ternally)g(referencing)g(X.\))952 2760 y(34)g eop bop 93 42 a fl(5.)22 b -(\(set)15 b(of)g(class\))g(classesPubliclyRe)q(ferenci)q(ng\(\(function)j(+)e -(v)m(ariable\))g(X\))f fj(\021)302 140 y(f)p fk(containing)r(C)s(l)q(ass)p fl -(\()p fk(r)q(ef)5 b fl(\))12 b fj(j)g fl(\()p fk(r)q(ef)17 b fj(2)c fk(r)q -(ef)5 b(er)q(encesT)h(o)p fl(\()p fk(X)t fl(\)\))j fj(^)h fl(\()p fk(r)q(ef)r -(:pr)q(ef)5 b(ix)13 b fj(6)p fl(=)f fk(nil)q fl(\))p fj(g)151 238 y fl(\(ie)h -(the)g(set)g(of)f(classes)i(referencing)g(X)f(through)f(the)h(public)i(in)o -(terface)e(of)g(its)g(con)o(taining)g(class\(es\).\))93 330 y(6.)22 b(\(set) -15 b(of)g(class\))g(classesReferencing\(class)i(X\))e fj(\021)529 428 y(f)p fk -(containing)r(C)s(l)q(ass)p fl(\()p fk(r)q(ef)5 b fl(\))12 b fj(j)g fk(r)q -(ef)18 b fj(2)12 b fk(r)q(ef)5 b(er)q(encesT)h(o)p fl(\()p fk(X)t fl(\))p fj -(g)151 527 y fl(\(ie)16 b(the)f(set)g(of)g(classes)h(con)o(taining)f(referenc\ -es)h(to)f(class)g(X.\))93 619 y(7.)22 b(\(set)15 b(of)g(class\))g(classesRefe\ -rencing\(\(function)j(+)d(v)m(ariable\))h(X\))f fj(\021)226 676 y fl(classesI\ -n)o(ternallyReferenci)q(ng\(X\))i fj([)f fl(classesPublicallyR)q(eferenci)q -(ng\(X\).)151 732 y(\(ie)g(the)f(set)g(of)g(classes)h(con)o(taining)f(referen\ -ces)h(to)f(X.\))93 825 y(8.)22 b(function)16 b(collidingF)l(uncti)q(on)i(\(cl\ -ass)d(C,)g(function)h(F\))e fj(\021)226 881 y fl(returns)h(the)g(function)i -(whose)e(name)g(w)o(ould)g(collide)j(with)d(F)g(if)h(it)f(w)o(ere)g(added)h -(to)f(C.)93 973 y(9.)22 b(\(nil)16 b(+)g(class\))f(con)o(tainingClass\()226 -1030 y(\(v)m(ariable)h(+)g(function)g(+)f(\(set)g(of)g(statemen)o(t\))f(+)h -(expression\))h(con)o(tainedItem\))g fj(\021)301 1086 y fl(if)g(\(\(con)o(tai\ -nedItem.o)o(wner)e fj(2)i fl(Program.classes\))d fj(_)376 1143 y fl(\(con)o -(tainedItem.o)o(wner)i(=)g(nil\)\),)h(/*)f(global)h(function)g(*/)451 1199 y -(con)o(tainedItem.o)o(wner,)301 1256 y(else)g(con)o(tainedClass\(con)o(tained\ -Item.o)o(wner\).)70 1348 y(10.)22 b(\(nil)16 b(+)g(function\))g(con)o(taining\ -F)l(unction\()226 1405 y(\(\(set)e(of)h(statemen)o(t\))f(+)i(expression\))f -(con)o(tainedItem\))h fj(\021)301 1461 y fl(if)g(\(\(con)o(tainedItem.o)o(wne\ -r)e fj(2)i fl(allF)l(unctions\(Program\)\),)376 1518 y(con)o(tainedItem.o)o -(wner,)301 1574 y(else)g(con)o(tainingF)l(unction\(con)o(tainedItem.o)o(wner\ -\).)70 1667 y(11.)22 b(\(set)15 b(of)g(class\))g(directSub)q(classesOf\(class) -j(C\))c fj(\021)524 1765 y(f)p fk(subC)s(l)q(ass)e fj(2)h fk(P)q(:cl)q(asses) -g fj(j)f fk(subC)s(l)q(ass:super)q(cl)q(ass)g fl(=)h fk(C)s fj(g)70 1881 y fl -(12.)22 b(directSup)q(erclassOf\(class)c(C\))c fj(\021)i fl(C.sup)q(erclass) -70 1973 y(13.)22 b(\(set)15 b(of)g(v)m(ariable\))h(expressionsAssignedT)l(o\(\ -v)m(ariable)i(V\))d fj(\021)226 2030 y fl(\()p fj(8)g fl(assignmen)o(t)g(expr\ -ession)h fj(2)g fl(scop)q(eOf\(V\),)301 2086 y(where)g(destination)g(=)f(V,)g -(return)g(source\))g fj([)226 2143 y fl(\()p fj(8)g fl(function)h(call)h fj -(2)e fl(scop)q(eOf\(V\),)301 2199 y(if)h(V)f(is)h(an)f(argumen)o(t)f(v)m(aria\ -ble)j(of)e(that)f(function,)376 2256 y(return)h(corresp)q(onding)h(v)m(alue)h -(passed)e(as)g(a)g(parameter\).)70 2348 y(14.)22 b(\(set)15 b(of)g(expression\ -\))g(expressionsAssignedT)l(oArgumen)o(t\(v)m(ariable)j(argV)l(ar\))226 2405 y -fj(8)e fl(functionCall)g fj(2)g fl(callsT)l(o\(argV)l(ar.o)o(wner\),)301 2461 -y(return)f(the)h(expression)g(in)g(the)f(p)q(osition)h(corresp)q(onding)g(to) -f(the)g(argumen)o(t.)70 2554 y(15.)22 b(\(set)15 b(of)g(function\))g(function\ -sCalledBy\(function)j(F\))d fj(\021)226 2610 y fl(the)g(set)g(of)g(all)h(func\ -tion)g(calls)h(in)f(F.statemen)o(t.)952 2760 y(35)g eop bop 70 42 a fl(16.)22 -b(\(set)15 b(of)g(function\))g(functionsThatOv)o(erride)i(\(function)e(F\))g -fj(\021)176 128 y(f)p fk(F)6 b fl(2)12 b fj(2)h fk(al)q(l)q(F)6 b(unctions)p -fl(\()p fk(P)g fl(\))13 b fj(j)f fk(F)6 b fl(2)p fk(:ow)q(ner)14 b fj(2)f fk -(subcl)q(assesO)q(f)5 b fl(\()p fk(F)q(:ow)q(ner)q fl(\))k fj(^)i fk(F)q(:nam\ -e)i fl(=)g fk(F)6 b fl(2)p fk(:name)p fj(g)70 230 y fl(17.)22 b(\(set)15 b -(of)g(\(v)m(ariable)h(+)f(function\)\))h(inheritedMem)o(b)q(ers\(class)h(C\)) -d fj(\021)226 287 y fl(inheritedMem)o(b)q(erF)l(unctions\(C\))j fj([)f fl(inh\ -eritedMem)o(b)q(erV)l(ariables\(C\).)70 375 y(18.)22 b(\(set)15 b(of)g(functi\ -on\))g(inheritedMem)o(b)q(erF)l(unctions\(class)j(C\))d fj(\021)226 432 y fl -(if)h(C.sup)q(erclass=nil,)h(return)e(nil)226 488 y(else)h(return)f(F)g fj -(2)301 544 y fl(\(inheritedMem)o(b)q(erF)l(unctions\(C.sup)q(erclass\))j fj -([)301 601 y fl(C.sup)q(erclass.lo)q(callyDe\014nedMem)o(b)q(erF)l(unc)q(tion\ -s\),)226 657 y(where)e(\(F.accessCon)o(trolMo)q(de)d fj(6)p fl(=)j(priv)m(ate\ -\))f fj(^)h(\030)p fl(lo)q(calMem)o(b)q(erF)l(unctionNamed\(F,C\).)70 746 y -(19.)22 b(\(set)15 b(of)g(v)m(ariable\))h(inheritedMem)o(b)q(erV)l(ariables\(\ -class)i(C\))d fj(\021)226 802 y fl(if)h(C.sup)q(erclass=nil,)h(return)e(nil) -226 859 y(else)h(return)f(V)h fj(2)301 915 y fl(\(inheritedMem)o(b)q(erV)l -(ariables\(C.sup)q(ercl)q(ass\))h fj([)301 972 y fl(C.sup)q(erclass.lo)q(call\ -yDe\014nedMem)o(b)q(erV)l(ariabl)q(es\),)226 1028 y(where)f(\(V.accessCon)o -(trolMo)q(de)e fj(6)p fl(=)h(priv)m(ate\))h fj(^)f(\030)p fl(lo)q(calMem)o -(b)q(erV)l(ariableNamed\(V,C\).)70 1117 y(20.)22 b(\(set)15 b(of)g(\(function) -g(+)h(v)m(ariable\)\))g(lo)q(callyDe\014nedMem)o(b)q(ersOf\(class)i(C\))c fj -(\021)226 1173 y fl(\(C.lo)q(callyDe\014nedMem)o(b)q(erF)l(unctions)k fj([) -301 1230 y fl(C.lo)q(callyDe\014nedMem)o(b)q(erV)l(ariable)q(s\))70 1318 y -(21.)k(\(set)15 b(of)g(v)m(ariable\))h(lo)q(calV)l(ariablesIn\(function)j(F\)) -14 b fj(\021)226 1375 y fl(the)h(set)g(of)g(all)h(lo)q(cal)h(v)m(ariables)f -(in)g(F.statemen)o(t.)70 1463 y(22.)22 b(\(function)16 b(+)f(nil\))i(mem)o -(b)q(erF)l(unctionNamed\(class)f(C,)f(string)g(S\))g fj(\021)226 1520 y fl -(F,)g(where)g(F)g fj(2)g fl(\(inheritedMem)o(b)q(erF)l(unctions\(C\))i fj([)e -fl(C.lo)q(callyDe\014nedMem)o(b)q(erF)l(unctions\))301 1576 y fj(^)h fl(F.nam\ -e)e(=)i(S.)70 1665 y(23.)22 b(\(function)16 b(+)f(nil\))i(mem)o(b)q(erV)l(ari\ -ableNamed\(class)g(C,)d(string)h(S\))g fj(\021)226 1721 y fl(V,)g(where)g(V)h -fj(2)f fl(\(inheritedMem)o(b)q(erV)l(ariables\(C\))i fj([)f fl(C.lo)q(callyDe\ -\014nedMem)o(b)q(erV)l(ariables\))301 1778 y fj(^)g fl(V.name)f(=)g(S.)70 1866 -y(24.)22 b(\(set)15 b(of\(v)m(ariable)h(+)f(function\)\))h(mem)o(b)q(ersOf\(c\ -lass)f(C\))g fj(\021)226 1923 y fl(inheritedMem)o(b)q(erF)l(unctions\(C\))i fj -([)f fl(inheritedMem)o(b)q(erV)l(ariables\(C\))h fj([)301 1979 y fl(C.lo)q -(callyDe\014nedMem)o(b)q(erF)l(unctions)h fj([)e fl(C.lo)q(callyDe\014nedMem) -o(b)q(erV)l(ariables.)70 2068 y(25.)22 b(\(set)15 b(of)g(\(expression)g(+)h -(v)m(ariable\)\))g(referencesT)l(o\(class)f(C\))g fj(\021)226 2124 y fl(insta\ -ncesOf\(C\))h fj([)508 2210 y(f)p fk(V)22 b fj(j)12 b fl(\()p fk(V)22 b fj -(2)13 b fk(al)q(l)q(V)c(ar)q(iabl)q(es)p fl(\()p fk(P)d(r)q(og)r(r)q(am)p fl -(\)\))h fj(^)k fl(\()p fk(V)s(:cl)q(ass)f fl(=)j fk(C)s fl(\))p fj(g)70 2313 y -fl(26.)22 b(\(set)15 b(of)g(functionCall\))h(referencesT)l(o\(function)g(F\)) -f fj(\021)226 2369 y fl(callsT)l(o\(F\))70 2458 y(27.)22 b(\(set)15 b(of)g -(v)m(ariableRef)t(\))h(referencesT)l(o\(v)m(ariable)h(V\))e fj(\021)479 2503 y -fa([)283 2598 y fr(V)8 b fs(2)p fq(2)p fr(allV)e(ar)q(iables)p fs(\()p fr(P)f -(r)q(og)q(r)q(am)p fs(\))721 2544 y fj(f)p fk(V)k(R)j fj(j)h fk(V)c(R)k fj -(2)g fk(F)6 b fl(2)p fk(:statement)12 b fj(^)e fk(V)g(R:r)q(ef)5 b(dV)k(ar)q -(iabl)q(e)i fl(=)i fk(V)c fj(g)952 2760 y fl(36)g eop bop 70 42 a fl(28.)22 b -(\(statemen)o(t)14 b(+)h(function)h(+)g(class)g(+)f(program\))f(scop)q(eOf\(\ -\(v)m(ariable)j(+)e(function\))h(item1\))f fj(\021)226 98 y fl(if)h(item1.o)o -(wner)e fj(62)i fl(Program.classes,)d(/*)i(Global,)g(lo)q(cal)i(or)d(argumen) -o(t)h(v)m(ariable)h(*/)301 154 y(item1.o)o(wner,)226 211 y(else)g(if)g(item1.\ -accessCon)o(trolMo)q(de)e(=)i(priv)m(ate,)301 267 y(item1.o)o(wner,)226 324 y -(else)g(\(item1.o)o(wner)e fj([)i fl(sub)q(classesOf\(item1.o)o(wner\)\).)70 -416 y(29.)22 b(\(set)15 b(of)g(v)m(ariable\))h(setOfComp)q(onen)o(tV)l(ariabl\ -es\(class)g(C\))f fj(\021)516 472 y fa([)355 564 y fr(class)p fq(2)p fr(P)5 b -(r)q(og)q(r)q(am:classes)723 513 y fj(f)p fk(V)22 b fj(j)12 b fk(V)22 b fj -(2)13 b fk(cl)q(ass:S)s(etO)q(f)5 b(C)s(omponents)11 b fj(^)f fk(V)s(:ty)r -(pe)i fl(=)h fk(C)s fj(g)70 671 y fl(30.)22 b(\(set)15 b(of)g(class\))g(sub)q -(classesOf\(class)i(C\))d fj(\021)226 728 y fl(the)h(transitiv)o(e)h(closure) -g(of)e(directSub)q(classesOf\(C\).)70 820 y(31.)22 b(\(set)15 b(of)g(class\)) -g(sup)q(erclassesOf\(class)i(C\))d fj(\021)226 876 y fl(the)h(transitiv)o(e)h -(closure)g(of)e(directSup)q(erclassOf\(C\).)70 968 y(32.)22 b(\(set)15 b(of)g -(v)m(ariable\))h(v)m(ariablesAssigned\(function)i(F\))c fj(\021)226 1025 y fl -(\()p fj(8)h fl(assignmen)o(t)g(expression)h fj(2)g fl(scop)q(eOf\(F\),)301 -1081 y(where)g(source)f(=)g(a)g(call)i(to)d(F,)h(return)g(destination\))g fj -([)226 1138 y fl(\()p fj(8)g fl(function)h(call)h fj(2)e fl(scop)q(eOf\(V\),) -301 1194 y(if)h(a)f(call)h(to)f(F)f(is)i(passed)g(as)e(a)h(parameter,)376 1251 -y(return)g(corresp)q(onding)h(function)g(argumen)o(t)f(v)m(ariable\).)70 1343 -y(33.)22 b(\(set)15 b(of)g(v)m(ariable\))h(v)m(ariablesAssigned\(v)m(ariable) -i(V\))d fj(\021)226 1399 y fl(\()p fj(8)g fl(assignmen)o(t)g(expression)h fj -(2)g fl(scop)q(eOf\(V\),)301 1456 y(where)g(source)f(=)g(V,)g(return)g(destin\ -ation\))h fj([)226 1512 y fl(\()p fj(8)f fl(function)h(call)h fj(2)e fl(scop) -q(eOf\(V\),)301 1568 y(if)h(V)f(is)h(passed)f(as)g(a)g(parameter,)376 1625 y -(return)g(corresp)q(onding)h(function)g(argumen)o(t)f(v)m(ariable\).)70 1717 y -(34.)22 b(\(set)15 b(of)g(v)m(ariable\))h(v)m(ariablesAssigned\(dynamicOb)s -(jectExpressi)q(on)i(E\))c fj(\021)226 1773 y fl(\()p fj(8)h fl(assignmen)o -(t)g(expression)h fj(2)g fl(Program,)301 1830 y(where)g(source)f(=)g(E,)g(ret\ -urn)g(destination\))h fj([)226 1886 y fl(\()p fj(8)f fl(function)h(call)h fj -(2)e fl(Program,)301 1943 y(if)h(E)f(is)h(passed)f(as)g(a)g(parameter,)376 -1999 y(return)g(corresp)q(onding)h(function)g(argumen)o(t)f(v)m(ariable\).)70 -2091 y(35.)22 b(\(set)15 b(of)g(v)m(ariable\))h(v)m(ariablesReferencedBy\(fun\ -cti)q(on)i(F\))c fj(\021)761 2188 y(f)p fk(V)9 b(R:r)q(ef)c(dV)k(ar)14 b fj -(j)e fl(\()p fk(V)d(R)k fj(2)g fk(F)6 b fl(\))p fj(g)37 2330 y fd(4.4)70 b -(Summary)37 2432 y fl(In)o(tuitiv)o(ely)l(,)18 b(refactorings)d(should)h(pres\ -erv)o(e)f(the)h(b)q(eha)o(vior)g(of)f(a)g(program.)k(This)d(c)o(hapter)g(disc\ -usses)g(the)37 2488 y(program)21 b(prop)q(erties)h(that)e(w)o(ere)h(found)h -(to)e(b)q(e)i(easily)g(violated)g(in)g(refactoring.)38 b(Also)21 b(de\014ned) -i(here)37 2545 y(are)17 b(the)g(domains)g(of)g(the)g(argumen)o(ts)f(to)g(the) -h(refactorings,)f(and)i(the)f(functions)g(used)h(for)e(de\014ning)i(the)37 -2601 y(preconditions)f(of)e(the)g(refactorings.)952 2760 y(37)g eop bop 37 353 -a fc(Chapter)35 b(5)37 560 y fb(Lo)m(w-Lev)m(el)42 b(Refactorings)37 783 y fl -(This)16 b(c)o(hapter)f(de\014nes)h(t)o(w)o(en)o(t)o(y)d(six)j(lo)o(w-lev)o -(el)g(refactorings.)j(They)c(supp)q(ort)g(the)g(three)g(high-lev)o(el)j(refac\ --)37 839 y(torings,)e(describ)q(ed)h(in)g(c)o(hapters)e(six)i(through)e(eigh) -o(t.)22 b(These)16 b(refactorings)f(are)h(designed)h(to)e(b)q(e)h(simple,)37 -896 y(so)j(that)g(in)h(most)f(cases)g(it)g(is)h(trivial)g(to)f(sho)o(w)g(that) -f(they)i(are)f(b)q(eha)o(vior-preserving.)33 b(The)20 b(b)q(eha)o(vior-)37 952 -y(preserving)c(nature)g(of)e(the)i(high-lev)o(el)h(refactorings)e(is)h(argued) -f(in)h(terms)e(of)h(these)g(refactorings.)108 1009 y(F)l(or)21 b(completeness\ -,)j(the)d(de\014nition)i(of)f(eac)o(h)f(refactoring)g(details)i(its)e(precond\ -itions)i(and)f(argues)37 1065 y(that)16 b(it)h(is)f(b)q(eha)o(vior)h(preservi\ -ng.)24 b(This)17 b(information,)f(included)j(for)c(completeness)j(at)d(the)i -(end)g(of)e(eac)o(h)37 1122 y(refactoring,)i(pro)o(vides)g(a)f(lev)o(el)i(of) -e(detail)i(b)q(ey)o(ond)f(what)f(ma)o(y)g(b)q(e)h(of)g(in)o(terest)f(to)g(som\ -e)h(readers.)24 b(It)16 b(can)37 1178 y(b)q(e)g(skipp)q(ed)h(without)e(missin\ -g)i(the)e(in)o(ten)o(t)g(of)g(the)g(refactoring.)37 1310 y(The)h(refactorings) -f(de\014ned)h(in)g(this)g(c)o(hapter)f(are:)93 1403 y(1.)22 b(Creating)15 b -(a)g(Program)f(En)o(tit)o(y:)170 1497 y(\(a\))22 b fi(cr)n(e)n(ate)s 14 2 v 13 -w(empty)s 14 2 v 15 w(class)168 1570 y fl(\(b\))g fi(cr)n(e)n(ate)s 14 2 v 13 -w(memb)n(er)s 14 2 v 14 w(variable)173 1643 y fl(\(c\))g fi(cr)n(e)n(ate)s 14 -2 v 13 w(memb)n(er)s 14 2 v 14 w(function.)93 1737 y fl(2.)g(Deleting)16 b -(a)f(program)f(en)o(tit)o(y:)170 1831 y(\(a\))22 b fi(delete)s 14 2 v 14 w -(unr)n(efer)n(enc)n(e)n(d)s 14 2 v 12 w(class)168 1904 y fl(\(b\))g fi(delete) -s 14 2 v 14 w(unr)n(efer)n(enc)n(e)n(d)s 14 2 v 12 w(variable)173 1977 y fl -(\(c\))g fi(delete)s 14 2 v 14 w(memb)n(er)s 14 2 v 13 w(functions)93 2071 y -fl(3.)g(Changing)16 b(a)f(program)f(en)o(tit)o(y:)170 2165 y(\(a\))22 b fi -(change)s 14 2 v 14 w(class)s 14 2 v 12 w(name)168 2238 y fl(\(b\))g fi(chang\ -e)s 14 2 v 14 w(variable)s 14 2 v 13 w(name)173 2311 y fl(\(c\))g fi(change)s -14 2 v 14 w(memb)n(er)s 14 2 v 13 w(function)s 14 2 v 14 w(name)168 2384 y fl -(\(d\))g fi(change)s 14 2 v 14 w(typ)n(e)173 2457 y fl(\(e\))g fi(change)s 14 -2 v 14 w(ac)n(c)n(ess)s 14 2 v 12 w(c)n(ontr)n(ol)s 14 2 v 13 w(mo)n(de)176 -2530 y fl(\(f)t(\))f fi(add)s 14 2 v 15 w(function)s 14 2 v 13 w(ar)n(gument) -170 2603 y fl(\(g\))h fi(delete)s 14 2 v 14 w(function)s 14 2 v 13 w(ar)n(gum\ -ent)952 2760 y fl(38)g eop bop 168 42 a fl(\(h\))22 b fi(r)n(e)n(or)n(der)s 14 -2 v 14 w(function)s 14 2 v 13 w(ar)n(guments)180 115 y fl(\(i\))h fi(add)s 14 -2 v 15 w(function)s 14 2 v 13 w(b)n(o)n(dy)179 188 y fl(\(j\))f fi(delete)s 14 -2 v 14 w(function)s 14 2 v 13 w(b)n(o)n(dy)169 261 y fl(\(k\))g fi(c)n(onvert) -s 14 2 v 13 w(instanc)n(e)s 14 2 v 13 w(variable)s 14 2 v 13 w(to)s 14 2 v 14 -w(p)n(ointer.)180 334 y fl(\(l\))h fi(c)n(onvert)s 14 2 v 13 w(variable)s 14 2 -v 14 w(r)n(efer)n(enc)n(es)s 14 2 v 12 w(to)s 14 2 v 14 w(function)s 14 2 v 13 -w(c)n(al)r(ls)155 407 y fl(\(m\))f fi(r)n(eplac)n(e)s 14 2 v 13 w(statement)s -14 2 v 14 w(list)s 14 2 v 13 w(with)s 14 2 v 14 w(function)s 14 2 v 13 w(c)n -(al)r(l)168 480 y fl(\(n\))g fi(inline)s 14 2 v 12 w(function)s 14 2 v 14 w -(c)n(al)r(l)170 553 y fl(\(o\))g fi(change)s 14 2 v 14 w(sup)n(er)n(class)93 -647 y fl(4.)g(Mo)o(ving)15 b(a)g(mem)o(b)q(er)g(v)m(ariable:)170 741 y(\(a\)) -22 b fi(move)s 14 2 v 14 w(memb)n(er)s 14 2 v 14 w(variable)s 14 2 v 13 w(to) -s 14 2 v 14 w(sup)n(er)n(class)168 814 y fl(\(b\))g fi(move)s 14 2 v 14 w(mem\ -b)n(er)s 14 2 v 14 w(variable)s 14 2 v 13 w(to)s 14 2 v 14 w(sub)n(classes)93 -907 y fl(5.)g(In)o(termediate)16 b(lev)o(el)g(\(comp)q(osite\))f(refactorings\ -:)170 1001 y(\(a\))22 b fi(abstr)n(act)s 14 2 v 14 w(ac)n(c)n(ess)s 14 2 v 12 -w(to)s 14 2 v 14 w(memb)n(er)s 14 2 v 14 w(variable)168 1074 y fl(\(b\))g fi -(c)n(onvert)s 14 2 v 13 w(c)n(o)n(de)s 14 2 v 14 w(se)n(gment)s 14 2 v 12 w -(to)s 14 2 v 14 w(function)173 1147 y fl(\(c\))g fi(move)s 14 2 v 14 w(class) -37 1291 y fd(5.1)70 b(Creating)22 b(a)i(Program)g(En)n(tit)n(y)37 1392 y fl -(These)d(refactorings)f(create)g(a)g(new)g(class)h(or)f(a)g(new)g(class)h(mem) -o(b)q(er.)35 b(Eac)o(h)20 b(refactoring)g(is)h(b)q(eha)o(vior)37 1449 y(prese\ -rving)16 b(b)q(ecause)g(the)f(en)o(tit)o(y)g(\(class)g(or)f(class)h(mem)o(b)q -(er\))g(it)g(adds)g(either)h(is)f(unreferenced)h(or)f(replaces)37 1505 y(an)h -(iden)o(tically)h(de\014ned,)g(inherited)g(mem)o(b)q(er.)37 1599 y fh(A.)22 b -fi(cr)n(e)n(ate)s 14 2 v 14 w(empty)s 14 2 v 14 w(class)151 1674 y fl(De\014n\ -e)e(a)e(new)h(class,)h(with)f(no)g(lo)q(cally)h(de\014ned)g(mem)o(b)q(ers.)31 -b(If)19 b(a)g(sup)q(erclass)h(is)f(sp)q(eci\014ed)i(as)e(an)151 1730 y(argume\ -n)o(t,)14 b(the)h(new)h(class)f(b)q(ecomes)h(its)g(direct)g(sub)q(class.)151 -1805 y(Argumen)o(ts:)k(string)15 b(newClassName,)g(\(optional\))g(class)g(sup) -q(erclass.)151 1881 y(Preconditions:)193 1974 y(1.)22 b fj(8)16 b fl(class)f -fj(2)h fl(Program.classes,)326 2031 y(class.name)f fj(6)p fl(=)h(newClassName\ -.)251 2087 y(\(the)f(name)g(do)q(es)h(not)f(clash)h(with)f(an)g(already)h(exi\ -sting)g(class\))151 2181 y(The)e(argumen)o(ts)g(to)f(the)h(refactoring)g(sp)q -(ecify)i(that)d(the)h(new)h(class)f(will)i(ha)o(v)o(e)e(0)f(or)h(1)g(direct)h -(sup)q(er-)151 2238 y(class,)f(satisfying)h(the)f(unique)i(sup)q(erclass)f -(prop)q(ert)o(y)f(\(prop)q(ert)o(y)f(one\).)20 b(The)14 b(precondition)i(ensu\ -res)151 2294 y(distinct)h(class)e(names)g(\(prop)q(ert)o(y)g(t)o(w)o(o\).)j -(Other)d(program)f(prop)q(erties)i(are)f(trivially)i(preserv)o(ed.)151 2369 y -(When)i(a)f(new)h(class)g(is)g(created,)g(there)g(are)f(no)g(instances)i(of)e -(it,)h(nor)f(are)g(there)h(an)o(y)f(sub)q(classes)151 2426 y(that)f(inherit)i -(from)d(it.)27 b(Therefore,)17 b(the)h(b)q(eha)o(vior)g(of)f(the)g(program)f -(do)q(es)i(not)f(c)o(hange)g(when)h(the)151 2482 y(new)e(class)f(is)h(added.) -952 2760 y(39)g eop bop 37 42 a fh(B.)23 b fi(cr)n(e)n(ate)s 14 2 v 13 w(memb) -n(er)s 14 2 v 14 w(variable)151 117 y fl(Add)16 b(an)f(unreferenced)i(lo)q -(cally)g(de\014ned)f(mem)o(b)q(er)g(v)m(ariable)g(to)f(a)g(class.)151 192 y -(Argumen)o(ts:)20 b(v)m(ariable)c(V,)f(class)h(C.)151 267 y(Preconditions:) -193 361 y(1.)22 b fj(\030)p fl(v)m(arNameCollisionP\(V.name,)17 b(C\))251 417 -y(\(the)j(name)g(of)g(the)g(new)h(v)m(ariable)g(do)q(es)g(not)e(clash)i(with) -g(an)f(existing)h(mem)o(b)q(er)f(or)g(global)251 474 y(v)m(ariable\).)151 567 -y(The)g(precondition)h(ensures)f(that)f(the)g(new)h(v)m(ariable)h(do)q(esn't) -e(collide)j(with)e(existing)h(v)m(ariables,)151 624 y(satisfying)g(program)f -(prop)q(erties)i(three)f(\(distinct)h(mem)o(b)q(er)f(names\),)g(four)g(\(inhe\ -rited)h(Mem)o(b)q(er)151 680 y(V)l(ariables)14 b(Not)e(Rede\014ned\))j(and)e -(eigh)o(t)g(\(seman)o(tically)h(Equiv)m(alen)o(t)g(References)g(and)f(Op)q -(erations\).)151 737 y(Other)j(program)e(prop)q(erties)i(trivially)g(preserv) -o(ed.)151 812 y(Adding)g(a)f(new,)g(unreferenced)i(v)m(ariable)g(do)q(es)e -(not)g(c)o(hange)g(the)h(b)q(eha)o(vior)f(of)g(a)g(program.)1761 795 y fs(1) -37 906 y fh(C.)22 b fi(cr)n(e)n(ate)s 14 2 v 14 w(memb)n(er)s 14 2 v 13 w(fun\ -ction.)151 981 y fl(Add)13 b(a)g(lo)q(cally)h(de\014ned)g(mem)o(b)q(er)f(func\ -tion)g(to)f(a)h(class)g(that)f(either)h(is)g(unreferenced)h(or)e(is)i(iden)o -(tical)151 1037 y(to)h(an)g(already)g(inherited)i(function.)151 1112 y(Argume\ -n)o(ts:)j(function)c(F,)e(class)i(C.)151 1188 y(Preconditions:)193 1281 y(1.) -22 b fj(8)16 b fl(mem)o(b)q(erF)l(unction)g fj(2)f fl(C.lo)q(callyDe\014nedMe\ -m)o(b)q(erF)l(unctions,)326 1338 y(mem)o(b)q(erF)l(unction.name)h fj(6)p fl -(=)g(F.name.)251 1394 y(\(the)f(function)h(is)g(not)f(already)g(de\014ned)i -(lo)q(cally\))193 1467 y(2.)22 b fj(8)16 b fl(F2)e fj(2)i fl(inheritedMem)o -(b)q(erF)l(unctions\(C\),)326 1524 y(\(F2.name)e(=)i(F.name\))e fj(\))401 1580 -y fl(matc)o(hingSignatureP)i(\(F,)e(F2\).)251 1637 y(\(the)h(signature)g(matc) -o(hes)g(that)g(of)f(an)o(y)h(inherited)i(function)f(with)g(the)f(same)g(name\ -\))193 1710 y(3.)22 b fj(8)16 b fl(F3)e fj(2)i fl(functionsThatOv)o(erride\(F\ -\),)326 1766 y(matc)o(hingSignatureP\(F,)f(F3\).)251 1823 y(\(the)g(signature\ -s)g(of)g(corresp)q(onding)h(functions)g(in)g(sub)q(classes)h(matc)o(h)d(it\)) -193 1896 y(4.)22 b fj(8)16 b fl(F2)e fj(2)i fl(inheritedMem)o(b)q(erF)l(uncti\ -ons\(C\),)326 1952 y(\(F2.name)e(=)i(F.name\))e fj(\))401 2009 y fl(\()p fj -(8)h fl(class)h fj(2)f fl(C)g fj([)h fl(sub)q(classesOf\(C\),)476 2065 y(unre\ -fdOnInstancesP\(F2,)g(class\)\))f fj(_)401 2122 y fl(\(seman)o(ticallyEquiv)m -(alan)o(tP)i(F,)e(F2\).)251 2178 y(\(if)21 b(there)h(is)f(an)g(inherited)i -(function)f(with)g(the)f(same)g(name,)h(either)g(the)f(inherited)i(func-)251 -2235 y(tion)c(is)g(unreferenced)h(on)e(instances)i(of)e(C)g(\(and)h(its)f(sub) -q(classes\),)i(or)e(the)h(new)g(function)g(is)251 2291 y(seman)o(tically)d -(equiv)m(alen)o(t)h(to)e(the)g(function)h(it)g(replaces\))193 2364 y(5.)22 b -(compilesP\(F,)16 b(C\).)251 2421 y(\(F)f(will)h(compile)h(as)e(a)g(mem)o(b)q -(er)g(of)g(C.\))37 2504 y 750 2 v 89 2531 a fu(1)107 2547 y fp(This)f(refacto\ -ring)g(increases)h(the)e(ph)o(ysical)j(size)e(of)f(instances)i(of)e(the)h(cla\ -ss.)19 b(Programs)14 b(that)f(test)g(the)h(ph)o(ysical)i(size)e(of)37 2593 y -(ob)r(jects)g(could)g(see)f(their)h(b)q(eha)o(vior)h(c)o(hange)f(\(see)f(the) -g(discussion)j(in)e(section)g(4.1.2\).)952 2760 y fl(40)g eop bop 151 42 a fl -(Precondition)17 b(one)f(ensures)g(that)f(mem)o(b)q(er)g(names)h(are)f(distin\ -ct)i(\(prop)q(ert)o(y)e(one\).)20 b(Preconditions)151 98 y(t)o(w)o(o)g(and)h -(three)g(ensure)h(that)f(the)g(mem)o(b)q(er)g(function)h(has)f(a)g(signature) -g(iden)o(tical)i(to)e(an)o(y)g(cor-)151 154 y(resp)q(onding)h(sup)q(erclass)f -(or)f(sub)q(class)i(function.)37 b(By)20 b(precondition)i(four,)f(if)g(the)g -(new)g(function)151 211 y(collides)g(with)e(an)f(existing)i(function,)f(its)g -(function)g(b)q(o)q(dy)g(m)o(ust)f(matc)o(h)g(the)h(b)q(o)q(dy)g(of)f(the)h -(func-)151 267 y(tion)d(it)h(is)f(replacing,)i(ensuring)f(seman)o(tically)g -(consisten)o(t)f(references)h(and)f(op)q(erations)g(\(prop)q(ert)o(y)151 324 y -(sev)o(en\).)k(Other)15 b(program)f(prop)q(erties)i(are)f(trivially)i(preserv) -o(ed.)151 396 y(The)12 b(b)q(eha)o(vior)g(of)g(a)f(class)h(is)h(not)e(c)o(han\ -ged)h(when)g(a)g(function)g(is)h(added)f(that)f(either)i(is)f(unreferenced) -151 453 y(or)j(replaces)h(an)f(iden)o(tically)j(de\014ned,)e(inherited)h(func\ -tion.)1198 436 y fs(2)37 594 y fd(5.2)70 b(Deleting)20 b(a)k(Program)g(En)n -(tit)n(y)37 695 y fl(These)c(refactorings)f(delete)h(an)f(unreferenced)h(clas\ -s)g(or)e(delete)j(an)e(unreferenced)h(or)f(redundan)o(t)g(class)37 752 y(mem) -o(b)q(er.)j(Eac)o(h)15 b(refactoring)g(is)h(b)q(eha)o(vior)g(preserving)h(b)q -(ecause)f(the)g(en)o(tit)o(y)f(\(class)h(or)f(class)h(mem)o(b)q(er\))f(it)37 -808 y(deletes)20 b(is)g(either)f(unreferenced)h(or)f(redundan)o(t.)31 b(A)19 b -(mem)o(b)q(er)g(function)g(is)g(redundan)o(t)h(if)f(an)g(iden)o(tical)37 865 y -(mem)o(b)q(er)d(function)g(w)o(ould)f(b)q(e)h(inherited)h(from)e(a)g(sup)q -(erclass)h(if)g(it)f(w)o(ere)g(deleted.)37 954 y fh(A.)22 b fi(delete)s 14 2 v -14 w(unr)n(efer)n(enc)n(e)n(d)s 14 2 v 12 w(class)151 1027 y fl(Delete)16 b -(an)f(unreferenced)i(class.)151 1099 y(Argumen)o(ts:)j(class)15 b(C.)151 1172 -y(Preconditions:)193 1261 y(1.)22 b(referencesT)l(o\(C\))15 b(=)g fj(;)g(^)h -fl(sub)q(classesOf\(C\))g(=)f fj(;)p fl(.)251 1317 y(\(the)g(class)h(b)q(eing) -g(deleted)h(is)e(unreferenced)i(and)e(has)h(no)f(sub)q(classes\).)151 1406 y -(The)j(class)g(b)q(eing)h(deleted)h(from)d(the)g(program)g(is)h(unreferenced;) -j(th)o(us,)c(all)i(program)e(prop)q(erties)151 1463 y(are)e(trivially)i(prese\ -rv)o(ed.)37 1552 y fh(B.)23 b fi(delete)s 14 2 v 13 w(unr)n(efer)n(enc)n(e)n -(d)s 14 2 v 12 w(variable)151 1624 y fl(Delete)16 b(an)f(unreferenced)i(v)m -(ariable.)151 1697 y(Argumen)o(ts:)j(v)m(ariable)c(V.)151 1770 y(Precondition\ -s:)193 1859 y(1.)22 b(referencesT)l(o\(V\))15 b(=)h fj(;)p fl(.)251 1915 y -(\(the)f(v)m(ariable)i(b)q(eing)f(deleted)h(is)e(unreferenced\))151 2004 y -(The)k(v)m(ariable)h(b)q(eing)g(deleted)g(from)e(the)h(class)g(is)g(unreferen\ -ced;)j(th)o(us,)d(all)g(program)f(prop)q(erties)151 2061 y(are)d(trivially)i -(preserv)o(ed.)599 2044 y fs(3)37 2150 y fh(C.)22 b fi(delete)s 14 2 v 14 w -(memb)n(er)s 14 2 v 14 w(functions)151 2222 y fl(Delete)16 b(a)f(set)g(of)g -(mem)o(b)q(er)g(functions)h(from)e(their)i(class.)151 2295 y(Argumen)o(ts:)k -(setOf\(function\))15 b(functionsT)l(oDelete.)151 2368 y(Preconditions:)37 -2430 y 750 2 v 89 2457 a fu(2)107 2473 y fp(This)f(refactoring)g(increases)h -(the)e(ph)o(ysical)j(size)e(of)f(instances)i(of)e(the)h(class.)19 b(Programs) -14 b(that)f(test)g(the)h(ph)o(ysical)i(size)e(of)37 2519 y(ob)r(jects)g(could) -g(see)f(their)h(b)q(eha)o(vior)h(c)o(hange)f(\(see)f(the)g(discussion)j(in)e -(section)g(4.1.2\).)89 2548 y fu(3)107 2564 y fp(This)f(refactoring)h(decreas\ -es)g(the)f(ph)o(ysical)j(size)e(of)e(instances)j(of)e(the)g(class.)18 b(Progr\ -ams)13 b(that)h(test)e(the)h(ph)o(ysical)j(size)e(of)37 2610 y(ob)r(jects)g -(could)g(see)f(their)h(b)q(eha)o(vior)h(c)o(hange)f(\(see)f(the)g(discussion) -j(in)e(section)g(4.1.2\).)952 2760 y fl(41)g eop bop 193 42 a fl(1.)22 b fj -(8)16 b fl(F)e fj(2)i fl(functionsT)l(oDelete:)326 98 y(\()p fj(8)f fl(ref)g -fj(2)h fl(referencesT)l(o\(F\):)401 154 y(con)o(tainingF)l(unction\(ref)t(\)) -g fj(2)476 211 y fl(functionsT)l(oDelete\))g fj(_)326 267 y(9)g fl(F2)e fj -(2)401 324 y fl(\(F.o)o(wner.sup)q(erclass\).lo)q(callyDe\014nedMem)o(b)q(erF) -l(unctions)j fj(_)476 380 y fl(inheritedMem)o(b)q(erF)l(unctions\(F.o)o(wner.\ -sup)q(erclass\))401 437 y fj(^)f fl(F2.accessCon)o(trolMo)q(de)d fj(6)p fl -(=)j(priv)m(ate)401 493 y fj(^)g fl(matc)o(hingA)o(ttributesP\(F,)e(F2\).)251 -550 y(\(either)j(eac)o(h)f(function)g(b)q(eing)i(deleted)f(is)f(redundan)o -(t,)h(or)e(the)h(only)h(references)f(to)g(it)g(are)g(b)o(y)251 606 y(other)f -(functions)h(that)e(are)h(also)g(b)q(eing)i(deleted\))151 700 y(By)23 b(the)h -(precondition,)i(eac)o(h)d(function)h(is)g(either)f(redundan)o(t)h(and)f(ther\ -efore)g(can)g(b)q(e)h(deleted)151 756 y(without)19 b(c)o(hanging)h(the)f(b)q -(eha)o(vior)h(of)e(the)h(program,)g(or)g(is)g(unreferenced)i(after)d(the)h -(set)g(of)g(oth-)151 813 y(er)c(functions)g(are)g(deleted.)21 b(This)15 b(pre\ -serv)o(es)f(program)g(prop)q(ert)o(y)g(sev)o(en)h(\(seman)o(tically)h(equiv)m -(alen)o(t)151 869 y(references)g(and)f(op)q(erations\).)20 b(Other)15 b(progr\ -am)g(prop)q(erties)g(are)g(trivially)i(preserv)o(ed.)37 1012 y fd(5.3)70 b -(Changing)23 b(a)h(Program)g(En)n(tit)n(y)37 1114 y fl(These)14 b(refactoring\ -s)e(c)o(hange)h(the)g(name)g(of)g(a)g(class)g(or)f(c)o(hange)i(the)f(attribut\ -es)f(of)h(a)g(class)g(mem)o(b)q(er.)19 b(They)37 1170 y(c)o(hange)i(a)f(class) -h(mem)o(b)q(er)g(b)o(y)f(c)o(hanging)h(its)f(name,)i(access)e(con)o(trol)h -(mo)q(de)f(or)g(t)o(yp)q(e.)36 b(Other)20 b(c)o(hanges)37 1227 y(include:)25 b -(con)o(v)o(erting)16 b(an)h(instance)g(v)m(ariable)h(to)d(a)h(v)m(ariable)i -(that)e(p)q(oin)o(ts)g(to)g(an)g(instance,)i(con)o(v)o(erting)e(a)37 1283 y -(v)m(ariable)h(reference)f(to)f(a)f(function)i(call,)g(and)g(adding)g(or)e -(reordering)i(function)g(argumen)o(ts.)37 1390 y fh(A.)22 b fi(change)s 14 2 v -14 w(class)s 14 2 v 12 w(name)151 1465 y fl(Change)15 b(the)h(name)f(of)g(a)f -(class.)151 1540 y(Argumen)o(ts:)20 b(class)15 b(C,)g(string)g(S.)151 1615 y -(This)20 b(name)f(c)o(hange)g(is)h(re\015ected)g(throughout)e(the)i(program)e -(\(i.e.)32 b(in)20 b(class)f(and)g(sub)q(class)i(dec-)151 1671 y(larations,)d -(constructor)e(and)i(destructor)f(functions,)h(and)g(the)f(declarations)h(of) -f(instances)h(of)f(the)151 1728 y(class\).)151 1803 y(Preconditions:)193 1897 -y(1.)22 b fj(8)16 b fl(class)f fj(2)h fl(Program.classes,)326 1953 y(class.na\ -me)f fj(6)p fl(=)h(S.)251 2010 y(\(the)f(new)h(name)f(do)q(esn't)g(clash)h -(with)f(an)g(already)h(existing)g(class\))151 2104 y(The)e(precondition)g(ens\ -ures)g(distinct)h(class)e(names)h(\(satisfying)f(program)f(prop)q(ert)o(y)h -(t)o(w)o(o\).)18 b(Chang-)151 2160 y(ing)d(the)f(name)g(of)f(a)h(class)g(do)q -(es)g(not)g(c)o(hange)g(its)g(b)q(eha)o(vior)h(\(satisfying)e(program)g(prop) -q(ert)o(y)h(sev)o(en\).)151 2216 y(Other)i(program)e(prop)q(erties)i(are)e -(trivially)j(preserv)o(ed.)37 2310 y fh(B.)23 b fi(change)s 14 2 v 13 w(varia\ -ble)s 14 2 v 14 w(name)151 2385 y fl(Change)15 b(the)h(name)f(of)g(a)f(v)m -(ariable.)151 2461 y(The)d(name)g(c)o(hange)g(is)g(re\015ected)g(throughout)f -(its)h(scop)q(e.)19 b(The)11 b(v)m(ariable)h(could)g(b)q(e)g(a)e(global)h(v)m -(ariable,)151 2517 y(mem)o(b)q(er)17 b(v)m(ariable,)h(temp)q(orary)d(v)m(aria\ -ble)j(or)e(b)q(e)h(an)f(argumen)o(t)g(to)g(a)g(function.)24 b(The)17 b(rules) -g(of)f(the)151 2573 y(language)g(determine)g(where)f(a)g(v)m(ariable)i(is)e -(visible.)952 2760 y(42)g eop bop 151 42 a fl(Argumen)o(ts:)20 b(v)m(ariable) -c(V,)f(string)g(newName.)151 117 y(Preconditions:)193 210 y(1.)22 b fj(\030)p -fl(v)m(arNameCollisionP\(newName,)17 b(scop)q(eOf\(V\)\))251 267 y(\(newName) -e(do)q(es)h(not)e(clash)i(with)g(an)f(existing)h(mem)o(b)q(er)g(or)e(global)i -(v)m(ariable\).)151 361 y(The)k(precondition)h(ensures)f(that)f(the)g(new)h -(v)m(ariable)h(do)q(esn't)e(collide)j(with)e(existing)h(v)m(ariables,)151 417 -y(satisfying)14 b(program)f(prop)q(erties)h(three)g(\(distinct)g(mem)o(b)q -(er)g(names\),)f(four)h(\(v)m(ariable)g(scoping\))g(and)151 474 y(\014v)o(e)h -(\(mem)o(b)q(er)h(v)m(ariable)g(rede\014nition\).)21 b(Other)16 b(program)e -(prop)q(erties)i(are)f(trivially)i(preserv)o(ed.)151 549 y(The)d(new)f(v)m -(ariable)i(name)e(do)q(es)g(not)g(collide)i(with)f(a)f(referenced)h(or)f(inhe\ -rited)i(v)m(ariable.)20 b(Changing)151 605 y(the)13 b(name)f(of)g(the)h(v)m -(ariable)h(do)q(es)f(not)f(c)o(hange)g(its)h(b)q(eha)o(vior,)g(as)f(long)h -(as)f(references)i(to)d(the)i(v)m(ariable)151 662 y(remain)j(the)f(same.)37 -756 y fh(C.)22 b fi(change)s 14 2 v 14 w(memb)n(er)s 14 2 v 14 w(function)s 14 -2 v 13 w(name)151 831 y fl(Change)13 b(the)h(name)f(of)g(a)g(mem)o(b)q(er)h -(function)g(and)f(an)o(y)g(corresp)q(onding)i(mem)o(b)q(er)e(functions)h(de\ -\014ned)151 887 y(in)i(sub)q(classes)h(\(and)e(callers\).)151 962 y(Argumen)o -(ts:)20 b(function)c(F,)e(string)h(newName.)151 1037 y(Preconditions:)193 1131 -y(1.)22 b fj(8)16 b fl(mem)o(b)q(er)f fj(2)g fl(F.o)o(wner.lo)q(callyDe\014ne\ -dMem)o(b)q(erF)l(unctions,)326 1188 y(mem)o(b)q(er.name)g fj(6)p fl(=)h(newNa\ -me.)251 1244 y(\(a)f(function)h(with)f(the)h(same)e(name)i(is)f(not)g(already) -h(de\014ned)g(lo)q(cally\))193 1317 y(2.)22 b(if)16 b(F.accessCon)o(trolMo)q -(de)e fj(6)p fl(=)h(priv)m(ate,)326 1374 y fj(8)h fl(subClass)f fj(2)h fl(sub) -q(classesOf\(F.o)o(wner\),)401 1430 y fj(8)g fl(mem)o(b)q(er)f fj(2)g fl(subC\ -lass.lo)q(callyDe\014nedMem)o(b)q(erF)l(un)q(ctions,)326 1487 y(mem)o(b)q(er.\ -name)g fj(6)p fl(=)h(newName.)251 1543 y(\(if)i(F)g(is)h(not)e(priv)m(ate,)j -(a)d(function)i(with)g(same)f(name)g(is)g(not)g(already)g(de\014ned)i(lo)q -(cally)g(in)f(a)251 1599 y(sub)q(class\))193 1672 y(3.)j fj(8)16 b fl(F2)e fj -(2)i fl(inheritedMem)o(b)q(erF)l(unctions\(con)o(tainingClass\(F\)\),)326 1729 -y(\(F2.name)e(=)i(F.name\))e fj(\))401 1785 y fl(matc)o(hingSignatureP)i(\(F,) -e(F2\).)251 1842 y(\(the)h(signature)g(matc)o(hes)g(that)g(of)f(an)o(y)h(inhe\ -rited)i(function)f(with)g(the)f(same)g(name\))193 1915 y(4.)22 b fj(8)16 b fl -(F2)e fj(2)i fl(inheritedMem)o(b)q(erF)l(unctions\(con)o(tainingClass\(F\)\),) -326 1971 y(\(F2.name)e(=)i(F.name\))e fj(\))401 2028 y fl(\()p fj(8)h fl(clas\ -s)h fj(2)f fl(con)o(tainingClass\(F\))g fj([)h fl(sub)q(classesOf\(con)o(tain\ -ingClass\(F\)\),)476 2084 y(unrefdOnInstancesP\(F2,)g(class\)\))f fj(_)401 -2141 y fl(\(seman)o(ticallyEquiv)m(alan)o(tP)i(F,)e(F2\).)251 2197 y(\(if)i -(there)f(is)h(an)f(inherited)i(function)g(with)e(the)h(same)f(name,)g(either) -h(the)f(inherited)j(function)251 2254 y(is)f(unreferenced)h(on)e(instances)h -(of)e(con)o(tainingClass\(F\))i(\(and)f(its)g(sub)q(classes\),)h(or)f(the)g -(new)251 2310 y(function)f(is)g(seman)o(tically)g(equiv)m(alen)o(t)h(to)e(the) -g(function)h(it)f(replaces\))193 2383 y(5.)22 b fj(8)16 b fl(F2)e fj(2)i fl -(inheritedMem)o(b)q(erF)l(unctions\(con)o(tainingClass\(F\)\),)326 2440 y(F2.\ -name)e(=)i(F.name)e fj(\))401 2496 y fl(matc)o(hingSignatureP)i(\(F,)e(F2\))g -fj(^)401 2553 y fl(\()p fj(8)h fl(ref)g fj(2)h fl(referencesT)l(o\(F2\),)476 -2609 y(con)o(tainingClass\(ref)t(\))f(=)g(con)o(tainingClass\(F2\)\))g fj(_) -952 2760 y fl(43)g eop bop 401 42 a fl(\()p fj(8)15 b fl(class)h fj(2)f fl -(\(con)o(tainingClass\(F\)\))g fj([)g fl(sub)q(classesOf\(\(con)o(tainingClas\ -s\(F\)\)\),)476 98 y(instancesOf\(\(con)o(tainingClass\(F\)\)\))g(=)g fj(;)p -fl(\))g fj(_)401 154 y fl(\(seman)o(ticallyEquiv)m(alan)o(tP)i(F,)e(F2\).)251 -211 y(\(if)e(there)h(is)f(an)h(inherited)h(mem)o(b)q(er)e(function)h(with)f -(the)h(same)f(name,)g(the)g(signatures)g(matc)o(h.)251 267 y(Also,)23 b(eithe\ -r)g(the)e(inherited)j(function)e(is)g(unreferenced)h(on)f(instances)g(of)f -(the)h(class)g(that)251 324 y(con)o(tains)15 b(F)g(\(or)f(its)h(sub)q(classes\ -\),)h(or)e(the)h(renamed)h(function)g(is)f(seman)o(tically)h(equiv)m(alen)o -(t)h(to)251 380 y(the)e(function)h(it)g(replaces.\))151 474 y(The)23 b(\014rs\ -t)f(three)h(preconditions)h(ensure)f(that)f(mem)o(b)q(er)h(names)f(are)g(dist\ -inct)i(\(prop)q(ert)o(y)e(one\).)151 531 y(Precondition)d(three)e(ensures)g -(compatible)i(signatures)e(\(prop)q(ert)o(y)f(six;)j(mem)o(b)q(er)e(function) -h(redef-)151 587 y(inition\).)39 b(By)21 b(precondition)i(four,)f(if)f(there) -g(is)h(an)f(inherited)i(function)f(with)f(the)g(same)g(name,)151 643 y(either) -e(the)g(inherited)h(function)f(is)g(unreferenced)h(on)e(instances)h(of)f(con) -o(tainingClass\(F\))h(and)f(its)151 700 y(sub)q(classes,)f(or)e(the)g(new)h -(function)g(is)g(seman)o(tically)h(equiv)m(alen)o(t)g(to)e(the)h(function)g -(it)g(replaces,)g(en-)151 756 y(suring)d(seman)o(tically)g(consisten)o(t)g -(references)g(and)f(op)q(erations)h(\(prop)q(ert)o(y)e(sev)o(en\).)19 b(Other) -13 b(program)151 813 y(prop)q(erties)j(are)f(trivially)i(preserv)o(ed.)37 907 -y fh(D.)23 b fi(change)s 14 2 v 13 w(typ)n(e)151 982 y fl(Change)14 b(the)g -(t)o(yp)q(e)g(of)f(a)h(set)g(of)f(\(p)q(oin)o(ter\))h(v)m(ariables)h(and)f -(functions)h(\(i.e.)k(c)o(hange)14 b(the)g(t)o(yp)q(es)g(of)f(the)151 1038 y -(v)m(ariables)k(and)e(the)g(return)g(t)o(yp)q(es)h(of)e(the)i(functions\).) -151 1113 y(Argumen)o(ts:)k(setOf\(v)m(ariable\))c(v)m(arsT)l(oChange,)e(setOf\ -\(function\))h(functionsT)l(oChange,)526 1170 y(t)o(yp)q(e)g(newT)o(yp)q(e.) -151 1245 y(Preconditions:)193 1339 y(1.)22 b fj(8)16 b fl(V)l(ar)f fj(2)g fl -(v)m(arsT)l(oChange,)326 1395 y fj(8)h fl(expression)g fj(2)f fl(expressionsA\ -ssignedT)l(o\(v)m(ariableT)l(oChange\):)401 1452 y(subt)o(yp)q(eP\(expression\ -.t)o(yp)q(e)h(newT)o(yp)q(e\))g fj(_)401 1508 y fl(expression)g fj(2)g fl(\(v) -m(arsT)l(oChange)e fj([)i fl(functionsT)l(oChange\).)251 1565 y(\(eac)o(h)j -(assignmen)o(t)h fi(to)f fl(a)g(v)m(ariable)i(w)o(ould)f(remain)g(t)o(yp)q -(e)f(safe)g(if)h(its)f(t)o(yp)q(e)h(w)o(as)e(c)o(hanged)i(to)251 1621 y(newT) -o(yp)q(e\).)193 1694 y(2.)i fj(8)16 b fl(I)f fj(2)h fl(\(v)m(arsT)l(oChange)e -fj([)i fl(functionsT)l(oChange\),)326 1751 y fj(8)g fl(expression)g fj(2)f fl -(v)m(ariablesAssigned\(item\):)401 1807 y(subt)o(yp)q(eP\(newT)o(yp)q(e,)h -(expression.t)o(yp)q(e\))f fj(_)401 1863 y fl(expression)h fj(2)g fl(v)m(arsT) -l(oChange.)251 1920 y(\(eac)o(h)11 b(assignmen)o(t)f fi(of)h fl(item)g(w)o -(ould)h(remain)f(t)o(yp)q(e)g(safe)f(if)i(its)f(t)o(yp)q(e)f(w)o(as)g(c)o(han\ -ged)h(to)g(newT)o(yp)q(e\).)151 2014 y(Preconditions)18 b(one)g(and)f(t)o(w)o -(o)f(ensure)h(t)o(yp)q(e)g(safe)g(assignmen)o(ts)g(\(prop)q(ert)o(y)g(six\).) -25 b(Other)18 b(program)151 2070 y(prop)q(erties)e(are)f(trivially)i(preserv) -o(ed.)37 2164 y fh(E.)23 b fi(change)s 14 2 v 14 w(ac)n(c)n(ess)s 14 2 v 12 w -(c)n(ontr)n(ol)s 14 2 v 13 w(mo)n(de)151 2239 y fl(Change)15 b(the)h(access)f -(con)o(trol)g(mo)q(de)g(of)g(a)g(mem)o(b)q(er)g(v)m(ariable)i(or)e(function.) -151 2314 y(Argumen)o(ts:)20 b(\(v)m(ariable)c(+)f(function\))h(mem)o(b)q(er,) -226 2371 y(\(`priv)m(ate')f(OR)h(`protected')e(OR)i(`public'\))h(newAcMo)q -(de.)151 2446 y(Preconditions:)193 2540 y(1.)22 b(if)16 b(\(newAcMo)q(de)f -(=)h(priv)m(ate\))f fj(^)h fl(\(mem)o(b)q(er.accessCon)o(trolMo)q(de)e fj(6)p -fl(=)i(priv)m(ate\),)326 2596 y(classesIn)o(ternallyReferenci)q(ng\(mem)o(b)q -(er\))i(=)d fj(f)p fk(containing)r(C)s(l)q(ass)p fl(\()p fk(member)q fl(\))p -fj(g)e(^)952 2760 y fl(44)g eop bop 326 42 a fl(classesPubliclyR)q(eferenci)q -(ng\(mem)o(b)q(er\))18 b(=)d fj(;)p fl(.)251 98 y(\(if)h(the)g(new)g(mo)q(de) -g(is)g(priv)m(ate,)g(the)g(mem)o(b)q(er)g(is)g(only)g(\(in)o(ternally\))g(ref\ -erenced,)h(in)f(the)g(class)251 154 y(where)g(it)f(is)h(de\014ned\))193 225 y -(2.)22 b(if)16 b(\(newAcMo)q(de)f fj(6)p fl(=)h(priv)m(ate\))f fj(^)h fl(\(me\ -m)o(b)q(er.accessCon)o(trolMo)q(de)e(=)i(priv)m(ate\))255 295 y(\(a\))22 b -(if)16 b(mem)o(b)q(er)f(is)h(a)f(v)m(ariable:)411 351 y(\()p fj(8)g fl(sub)q -(class)h fj(2)g fl(sub)q(classesOf\(mem)o(b)q(er.o)o(wner\),)486 408 y fj(8)g -fl(V)l(ar)f fj(2)g fl(sub)q(class.lo)q(callyDe\014nedMem)o(b)q(e)q(rV)l(ariab\ -le)q(s,)561 464 y(V)l(ar.name)g fj(6)p fl(=)g(mem)o(b)q(er.name\).)336 521 y -(\(a)22 b(mem)o(b)q(er)g(v)m(ariable)i(to)d(b)q(e)i(declared)h(protected)e -(or)f(public)k(m)o(ust)c(not)h(already)h(b)q(e)336 577 y(de\014ned)17 b(in)f -(a)f(sub)q(class\))253 641 y(\(b\))22 b(if)16 b(mem)o(b)q(er)f(is)h(a)f(funct\ -ion:)365 704 y(i.)23 b fj(8)16 b fl(F2)e fj(2)i fl(inheritedMem)o(b)q(erF)l -(unctions\(C\),)488 761 y(\(F2.name)e(=)i(F.name\))e fj(\))563 817 y fl(\()p -fj(8)h fl(class)h fj(2)g fl(C)e fj([)i fl(sub)q(classesOf\(C\),)638 873 y(unr\ -efdOnInstancesP\(F2,)g(class\)\))f fj(_)563 930 y fl(\(seman)o(ticallyEquiv)m -(alan)o(tP)i(F,)e(F2\).)413 986 y(\(if)j(there)g(is)g(an)g(inherited)i(functi\ -on)e(with)g(the)g(same)f(name,)h(either)h(the)f(inherited)413 1043 y(function) -j(is)f(unreferenced)i(on)e(instances)g(of)g(C)f(\(or)g(its)h(sub)q(classes\),) -i(or)d(the)h(new)413 1099 y(function)c(is)g(seman)o(tically)h(equiv)m(alen)o -(t)f(to)f(the)g(function)h(it)g(replaces\))353 1163 y(ii.)23 b fj(8)16 b fl -(sub)q(class)g fj(2)g fl(sub)q(classesOf\(mem)o(b)q(er.o)o(wner\),)488 1219 y -fj(9)g fl(F)f fj(2)g fl(sub)q(class.lo)q(callyDe\014ned)q(Mem)o(b)q(erF)l(unc\ -tions)j fj(^)563 1276 y fl(F.name)d(=)g(mem)o(b)q(er.name)g fj(\))638 1332 y -fl(matc)o(hingSignatureP\(F,)g(mem)o(b)q(er\).)413 1388 y(\(the)h(signature)f -(of)h(the)f(new)h(function)g(matc)o(hes)f(the)h(signatures)g(of)f(functions)h -(that)413 1445 y(w)o(ould)g(o)o(v)o(erride)f(it)h(in)g(sub)q(classes\))193 -1515 y(3.)22 b(if)16 b(\(newAcMo)q(de)f(=)h(protected\))f fj(^)g fl(\(mem)o -(b)q(er.accessCon)o(trolMo)q(de)f(=)i(public\),)326 1572 y(classesPubliclyR)q -(eferenci)q(ng\(mem)o(b)q(er\))i(=)d fj(;)p fl(.)251 1628 y(\(a)h(mem)o(b)q -(er)g(curren)o(tly)h(declared)g(public)h(but)f(ab)q(out)f(to)f(b)q(e)i(declar\ -ed)g(protected)f(m)o(ust)g(only)251 1685 y(b)q(e)g(\(in)o(ternally\))g(refere\ -nced,)g(in)g(the)f(class)h(that)e(con)o(tains)h(it)h(or)f(in)h(one)f(of)g(its) -g(sub)q(classes\).)151 1776 y(All)h(references)f(to)f(the)g(mem)o(b)q(er)h -(b)q(efore)f(the)h(refactoring)f(are)g(either)h(within)g(the)g(mem)o(b)q(er's) -f(scop)q(e)151 1832 y(after)i(the)g(refactoring,)g(or)f(\(if)i(a)e(function\)) -i(ma)o(y)f(b)q(e)h(replaced)g(b)o(y)f(a)g(reference)h(to)e(a)h(seman)o(ticall\ -y)151 1889 y(equiv)m(alen)o(t)j(function,)f(preserving)g(seman)o(tically)h -(equiv)m(alen)o(t)g(references)f(and)f(op)q(erations)h(\(prop-)151 1945 y(ert) -o(y)d(sev)o(en\).)20 b(Other)15 b(program)f(prop)q(erties)i(are)f(trivially)i -(preserv)o(ed.)37 2036 y fh(F.)23 b fi(add)s 14 2 v 14 w(function)s 14 2 v 13 -w(ar)n(gument)151 2110 y fl(Add)17 b(a)f(new)h(argumen)o(t)e(to)h(the)g(de\ -\014nition)i(of)e(a)g(function)h(in)h(its)e(con)o(taining)h(class)g(\(and)f -(to)g(func-)151 2166 y(tions)i(that)f(o)o(v)o(erride)h(it)g(in)g(sub)q(classe\ -s\).)29 b(In)18 b(eac)o(h)g(function)g(call,)h(add)f(an)g(argumen)o(t)f(whic) -o(h)i(is)f(a)151 2223 y(dynamically)f(created)e(instance)h(of)f(the)g(t)o(yp) -q(e)h(of)f(newArg.)151 2297 y(This)e(refactoring)g(is)g(used,)g(for)g(example\ -,)g(when)g(making)g(the)g(signatures)g(of)f(functions)i(in)f(di\013eren)o(t) -151 2353 y(sub)q(classes)k(matc)o(h.)151 2427 y(Argumen)o(ts:)j(function)c -(F,)e(v)m(ariable)j(newArg,)d(newArg.t)o(yp)q(e)h(defaultV)l(alue)1503 2410 y -fs(4)1525 2427 y fl(.)151 2501 y(Preconditions:)37 2567 y 750 2 v 89 2594 a fu -(4)107 2610 y fp(This)e(argumen)o(t)h(can)g(b)q(e)f(omitted)h(if)f(there)g -(are)g(no)h(calls)g(to)f(F.)952 2760 y fl(45)g eop bop 193 42 a fl(1.)22 b fj -(8)16 b fl(F)l(unc)f fj(2)h fl(\(F)e fj([)i fl(functionsThatOv)o(erride\(F\)\ -\),)326 98 y fj(\030)p fl(v)m(arNameCollisionP\(newArg.name)h(con)o(tainingCl\ -ass\(F)l(unc\)\).)251 154 y(\(the)e(name)g(of)g(newArg)g(do)q(esn't)g(collide) -j(with)d(another)g(v)m(ariable)i(in)f(an)f(enclosing)h(scop)q(e\))193 227 y -(2.)22 b fj(8)16 b fl(F)l(unc)f fj(2)h fl(mem)o(b)q(erF)l(unctions\(F.o)o(wne\ -r.sup)q(erclass\),)326 284 y(F)l(unc.name)g fj(6)p fl(=)f(F.name.)251 340 y -(\(a)g(mem)o(b)q(er)g(function)h(with)g(the)f(same)g(name)g(is)h(not)f(de\014\ -ned)h(in)g(a)f(sup)q(erclass\).)193 413 y(3.)22 b(classesReferencing\(F\))17 b -fj(\032)e fl(scop)q(eOf\(defaultV)l(alue\).)251 470 y(\(defaultV)l(alue)i(is) -e(visible)j(in)e(all)g(places)g(where)g(F)e(is)i(called\).)151 564 y(By)e(the) -g(precondition)h(1,)f(there)f(are)h(no)g(name)f(collisions)j(with)f(the)e(new) -h(v)m(ariable)i(in)e(F,)f(nor)h(in)g(the)151 620 y(corresp)q(onding)k(functio\ -ns)g(de\014ned)h(in)f(sub)q(classes.)28 b(By)17 b(preconditions)i(2,)e(this)h -(co)o(v)o(ers)e(all)j(corre-)151 677 y(sp)q(onding)h(functions.)30 b(The)19 b -(argumen)o(t)e(is)i(unreferenced,)h(hence)g(prop)q(ert)o(y)e(sev)o(en)h(\(sem\ -an)o(tically)151 733 y(equiv)m(alen)o(t)14 b(references)f(and)g(op)q(erations\ -\))f(is)h(preserv)o(ed.)20 b(The)12 b(other)h(program)e(prop)q(erties)i(are)f -(triv-)151 790 y(ially)19 b(preserv)o(ed.)28 b(Adding)19 b(an)f(unreferenced) -h(argumen)o(t)e(do)q(es)h(not)f(c)o(hange)h(the)g(b)q(eha)o(vior)g(of)f(the) -151 846 y(program.)37 940 y fh(G.)23 b fi(delete)s 14 2 v 13 w(function)s 14 2 -v 14 w(ar)n(gument)151 1015 y fl(Delete)15 b(an)g(argumen)o(t)e(from)h(the)g -(de\014nition)j(of)d(a)g(function)h(in)g(its)g(con)o(taining)g(class)g(and,)g -(unless)g(it)151 1071 y(is)g(priv)m(ate,)f(from)g(all)h(sub)q(classes)g(where) -g(it)f(is)h(rede\014ned.)20 b(In)15 b(eac)o(h)f(function)h(call,)g(the)g(argu\ -men)o(t)e(is)151 1128 y(remo)o(v)o(ed.)151 1203 y(Argumen)o(ts:)20 b(v)m(aria\ -ble)c(Arg)151 1278 y(Preconditions:)193 1372 y(1.)22 b(referencesT)l(o\(Arg\)) -15 b(=)g(0.)251 1428 y(\(the)g(argumen)o(t)g(is)g(unreferenced.\))193 1501 y -(2.)22 b fj(8)16 b fl(F)e fj(2)i fl(\(functionsThatOv)o(erride\(Arg.o)o(wner\ -\)\),)401 1558 y(referencesT)l(o\(argumen)o(t)f(in)h(corresp)q(onding)g(p)q -(osition\))g(=)f(0.)251 1614 y(\(the)g(corresp)q(onding)h(argumen)o(t)f(in)h -(eac)o(h)f(o)o(v)o(erriding)h(function)g(is)f(unreferenced\).)193 1687 y(3.) -22 b fj(8)16 b fl(F)l(unc)f fj(2)h fl(mem)o(b)q(erF)l(unctions\(Arg.o)o(wner.\ -o)o(wner.sup)q(erclass\),)326 1744 y(F)l(unc.name)g fj(6)p fl(=)f(Arg.o)o(wne\ -r.name.)251 1800 y(\(the)g(mem)o(b)q(er)g(function)h(con)o(taining)g(Arg)f -(is)h(not)f(de\014ned)h(in)g(a)f(sup)q(erclass\).)193 1873 y(4.)22 b fj(8)16 b -fl(argExpr)e(assigned)i(to)e(Arg)h(\(or)f(to)h(the)g(corresp)q(onding)h(argum\ -en)o(t)f(in)h(eac)o(h)326 1930 y(o)o(v)o(erriding)g(function\),)401 1986 y -(noSideE\013ectsP\(argExpr\).)251 2043 y(\(the)d(expressions)g(passed)g(to)g -(Arg)f(\(or)g(to)g(corresp)q(onding)i(argumen)o(t)e(v)m(ariables)i(in)g(o)o -(v)o(erriding)251 2099 y(functions\))i(do)f(not)g(ha)o(v)o(e)g(side)h(e\013ec\ -ts\).)151 2193 y(By)d(the)g(preconditions,)h(Arg)f(is)g(not)f(referenced,)i -(nor)f(is)g(the)g(corresp)q(onding)h(argumen)o(t)d(referenced)151 2249 y(in) -19 b(o)o(v)o(erriding)g(functions)g(de\014ned)g(in)g(sub)q(classes.)30 b(Expr\ -essions)18 b(passed)h(to)e(Arg)h(\(in)h(calls)g(to)e(its)151 2306 y(con)o(tai\ -ning)12 b(function\))f(ha)o(v)o(e)f(no)h(side)g(e\013ects.)19 b(Therefore,)11 -b(program)e(prop)q(ert)o(y)i(sev)o(en)g(\(seman)o(tically)151 2362 y(equiv)m -(alen)o(t)23 b(references)f(and)g(op)q(erations\))f(is)h(preserv)o(ed.)39 b -(The)21 b(other)g(program)g(prop)q(erties)h(are)151 2419 y(trivially)d(preser\ -v)o(ed.)25 b(Deleting)17 b(an)g(unreferenced)h(argumen)o(t)e(do)q(es)h(not)g -(c)o(hange)g(the)g(b)q(eha)o(vior)g(of)151 2475 y(the)e(program.)37 2569 y fh -(H.)23 b fi(r)n(e)n(or)n(der)s 14 2 v 13 w(function)s 14 2 v 14 w(ar)n(gument\ -s)952 2760 y fl(46)g eop bop 151 42 a fl(Reorder)17 b(the)f(argumen)o(ts)g -(in)h(a)f(mem)o(b)q(er)g(function)h(de\014nition)i(\(in)d(the)h(sp)q(eci\014e\ -d)h(class)f(and)f(in)i(all)151 98 y(sub)q(classes\))e(and)g(in)g(all)g(calls) -g(to)f(that)f(function.)151 172 y(Argumen)o(ts:)20 b(function)c(F,)e(\(list)i -(of)e(v)m(ariable\))j(newArgOrdering.)151 247 y(Preconditions:)193 339 y(1.) -22 b fj(8)16 b fl(function)g fj(2)f fl(\(F)g fj([)g fl(functionsThatOv)o(erri\ -de\(F\)\),)326 395 y fj(8)h fl(argumen)o(t)e fj(2)h fl(function.argumen)o(ts) -401 452 y fj(8)h fl(expression)g fj(2)f fl(argumen)o(tExpressionsInF)l(unctio\ -nCalls\(argumen)o(t,)h(F\):)476 508 y(noSideE\013ectsP\(expression\).)251 565 -y(\(the)f(expressions)h(assigned)g(to)e(the)i(argumen)o(t)e(v)m(ariables)j -(ha)o(v)o(e)d(no)i(side)g(e\013ects\))1690 548 y fs(5)193 636 y fl(2.)22 b -(corresp)q(ondingSup)q(erclassMem)o(b)q(erF)l(unctions\(F\))c(=)d fj(;)p fl -(.)251 693 y(\(a)g(corresp)q(onding)h(mem)o(b)q(er)f(function)h(is)g(not)f -(de\014ned)h(in)g(a)f(sup)q(erclass\).)151 785 y(The)i(function)g(argumen)o -(ts)e(\(b)o(y)h(precondition\))h(do)f(not)g(ha)o(v)o(e)g(an)o(y)g(side)h(e\ -\013ects;)f(reordering)g(them)151 842 y(do)q(es)c(not)f(c)o(hange)h(the)g(b)q -(eha)o(vior)g(of)f(the)h(function,)g(since)h(the)f(ordering)g(of)f(argumen)o -(ts)g(in)h(all)g(calls)h(to)151 898 y(the)h(function)g(are)g(similarly)h(reor\ -dered.)20 b(Th)o(us,)14 b(program)e(prop)q(ert)o(y)i(sev)o(en)g(\(seman)o(tic\ -ally)g(equiv)m(a-)151 954 y(len)o(t)i(references)f(and)h(op)q(erations\))e -(preserv)o(ed)i(b)o(y)f(the)g(preconditions;)h(other)f(program)f(prop)q(ertie\ -s)151 1011 y(are)h(trivially)i(preserv)o(ed.)37 1103 y fh(I.)23 b fi(add)s 14 -2 v 14 w(function)s 14 2 v 13 w(b)n(o)n(dy)151 1178 y fl(Add)16 b(a)f(functio\ -n)h(b)q(o)q(dy)g(to)e(an)h(existing)i(mem)o(b)q(er)e(function)h(\(signature\)\ -.)151 1252 y(Argumen)o(ts:)k(function)c(F,)e(statemen)o(t)g(newF)l(unctionBo) -q(dy)l(.)151 1326 y(Preconditions:)193 1419 y(1.)22 b(compilesP)17 b(\(F,)d -(where)h(F.b)q(o)q(dy)g(=)h(newF)l(unctionBo)q(dy\),)g(con)o(tainingClass\(F\ -\)\))251 1475 y(\(the)f(new)h(function)g(b)q(o)q(dy)f(compiles\).)151 1567 y -(By)e(precondition)h(one,)f(the)f(function)i(b)q(o)q(dy)f(compiles)h(cleanly) -l(.)21 b(Since)14 b(the)f(function)g(is)g(a)f(signature)151 1624 y(only)l(,)i -(it)g(is)f(nev)o(er)h(called)h(directly;)g(adding)f(a)f(function)h(b)q(o)q -(dy)g(to)e(it)i(do)q(es)f(not)g(c)o(hange)h(the)f(b)q(eha)o(vior)151 1680 y -(of)19 b(the)h(program.)32 b(Therefore)19 b(program)g(prop)q(ert)o(y)g(sev)o -(en)h(\(seman)o(tically)g(equiv)m(alen)o(t)i(references)151 1737 y(and)16 b -(op)q(erations\))f(is)g(preserv)o(ed,)g(as)g(are)g(\(trivially\))h(the)g(othe\ -r)e(program)g(prop)q(erties.)37 1829 y fh(J.)23 b fi(delete)s 14 2 v 13 w(fun\ -ction)s 14 2 v 14 w(b)n(o)n(dy)151 1903 y fl(Delete)16 b(a)f(function)h(b)q -(o)q(dy)g(from)e(an)h(existing)h(mem)o(b)q(er)g(function)g(\(making)f(it)g -(a)g(signature)h(only\).)151 1978 y(Argumen)o(ts:)k(function)c(F.)151 2052 y -(Preconditions:)193 2144 y(1.)22 b(callsT)l(o\(F\))15 b(=)h fj(;)p fl(.)151 -2237 y(By)11 b(the)g(precondition,)i(F)e(is)g(nev)o(er)g(called)h(in)g(the)f -(program,)f(therefore)h(b)q(eha)o(vior)g(is)h(preserv)o(ed)f(when)151 2293 y -(its)i(function)g(b)q(o)q(dy)g(is)g(remo)o(v)o(ed.)18 b(Therefore,)13 b(progr\ -am)e(prop)q(ert)o(y)h(sev)o(en)h(\(seman)o(tically)g(equiv)m(alen)o(t)151 2350 -y(references)j(and)f(op)q(erations\))g(preserv)o(ed,)h(as)e(are)h(\(trivially\ -\))h(the)g(other)f(program)f(prop)q(erties.)37 2430 y 750 2 v 89 2457 a fu -(5)107 2473 y fp(If)h(t)o(w)o(o)g(argumen)o(t)i(expressions)h(in)f(a)f(functi\ -on)h(call)h(ha)o(v)o(e)e(side)h(e\013ects,)g(and)f(the)g(side)h(e\013ects)g -(are)f(not)g(indep)q(enden)o(t,)37 2519 y(program)11 b(b)q(eha)o(vior)h(could) -f(c)o(hange)g(if)g(the)f(argumen)o(ts)h(w)o(ere)e(reordered.)17 b(This)11 b -(precondition)i(prev)o(en)o(ts)d(this)h(from)f(happ)q(ening.)37 2564 y(The)j -(precondition)i(could)f(b)q(e)e(relaxed)i(to)e(p)q(ermit)i(only)f(one)g(argum\ -en)o(t)g(expression)h(with)f(side)h(e\013ects)e(p)q(er)h(function)h(call,)f -(or)37 2610 y(m)o(ultiple)j(argumen)o(t)e(expressions)h(with)e(side)h(e\013ec\ -ts)g(as)f(long)h(as)f(the)h(side)g(e\013ects)f(are)g(indep)q(enden)o(t)j(of)d -(eac)o(h)g(other.)952 2760 y fl(47)g eop bop 37 42 a fh(K.)23 b fi(c)n(onvert) -s 14 2 v 13 w(instanc)n(e)s 14 2 v 12 w(variable)s 14 2 v 14 w(to)s 14 2 v 14 -w(p)n(ointer.)151 117 y fl(This)d(refactoring)f(is)g(sp)q(eci\014c)i(to)e(C++\ -.)32 b(C++)19 b(has)g(t)o(w)o(o)f(w)o(a)o(ys)g(in)i(whic)o(h)g(a)f(v)m(ariabl\ -e)h fi(V)m(ar1)f fl(can)151 173 y(\\con)o(tain")d(an)h(instance)g(of)g(a)f -(class)h ff(Class1)p fl(.)24 b(The)17 b(v)m(ariable)h(declaration)g(\\)p ff -(Class1)e fi(V)m(ar1)p fl(")h(declares)151 230 y fi(V)m(ar1)e fl(to)g(b)q(e)h -(a)f(particular)h(instance)h(of)e ff(Class1)g fl(throughout)g(program)f(execu\ -tion.)22 b(Space)16 b(is)g(stati-)151 286 y(cally)f(allo)q(cated)g(for)f(it)g -(at)g(compile)h(time.)20 b fi(V)m(ar1)14 b fl(can)h(b)q(e)f(reassigned,)h(but) -f(can)g(only)h(b)q(e)g(reassigned)151 342 y(an)g(instance)h(of)f ff(Class1)p -fl(.)151 418 y(By)e(con)o(trast,)e(the)i(v)m(ariable)h(declaration)g(\\)p ff -(Class1*)e fi(V)m(ar1)p fl(")g(allo)o(ws)h fi(V)m(ar1)f fl(to)g(p)q(oin)o(t)i -(to)e(\(i.e.)19 b(con)o(tain\))151 474 y(an)i(instance)h(of)f ff(Class1)g fl -(or)f(an)h(instance)h(of)f(an)o(y)f(of)h(its)g(sub)q(classes.)39 b(This)21 b -(allo)o(ws)h(expressions)151 531 y(assigned)16 b(to)e(it)i(to)f(b)q(e)g(sp)q -(ecialized)k(while)d(main)o(taining)h(t)o(yp)q(e)e(compatibilit)o(y)l(.)151 -606 y(This)20 b(refactoring)f(con)o(v)o(erts)g(a)g(v)m(ariable)i(from)d(its)i -(curren)o(t)f(t)o(yp)q(e)h(to)e(b)q(ecome)i(a)g(p)q(oin)o(ter)f(to)g(that)151 -662 y(t)o(yp)q(e,)c(and)g(assigns)h(to)e(the)i(v)m(ariable)g(an)f(instance)h -(of)f(its)g(curren)o(t)g(t)o(yp)q(e.)151 737 y(If)h(the)g(v)m(ariable)h(is)f -(a)f(mem)o(b)q(er)h(v)m(ariable,)h(with)f(a)f(declaration)i(of)e(the)h(form)f -(\\)p ff(Class1)g fi(V)m(ar1\(ar)n(gs\))p fl(",)151 794 y(this)20 b(refactori\ -ng)f(c)o(hanges)g(the)h(declaration)g(to)f(\\)p ff(Class1*)g fi(V)m(ar1)p fl -(",)h(adds)f(to)g(the)h(class)f(construc-)151 850 y(tor)h(the)h(assignmen)o -(t:)30 b(\\)p fi(V)m(ar1)21 b fl(=)h fi(new)e ff(Class1)p fi(\(ar)n(gs\))p fl -(",)h(and)g(adds)f(to)g(the)h(class)g(destructor)f(the)151 907 y(statemen)o -(t:)f(\\)p fi(delete)d(V)m(ar1)p fl(".)151 982 y(If)21 b(the)f(v)m(ariable)i -(is)f(a)f(lo)q(cal)h(v)m(ariable,)i(with)e(a)f(declaration)h(of)f(the)g(form) -g(\\)p ff(Class1)g fi(V)m(ar1\(ar)n(gs\))p fl(",)151 1038 y(this)15 b(refacto\ -ring)f(c)o(hanges)g(the)h(declaration)g(to)f(\\)p ff(Class1*)g fi(V)m(ar1)p fl -(")g(and)g(immediately)i(follo)o(wing)f(the)151 1095 y(v)m(ariable)i(declarat\ -ion)f(adds)f(the)g(assignmen)o(t:)20 b(\\)p fi(V)m(ar1)c fl(=)h fi(new)d ff -(Class1)p fi(\(ar)n(gs\))p fl(".)151 1170 y(Expressions)d(of)g(the)g(form)f fi -(&V)m(ar1)g fl(are)h(c)o(hanged)g(to)f fi(V)m(ar1)p fl(.)18 b(Expressions)11 b -(of)g(the)g(form)f fi(V)m(ar1.memb)n(er)151 1226 y fl(are)15 b(c)o(hanged)h -(to)e fi(V)m(ar1)p fj(\000)f fk(>)p fi(memb)n(er)p fl(.)151 1301 y(Argumen)o -(ts:)20 b(v)m(ariable)c(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable.)151 1377 y -(Preconditions:)193 1470 y(1.)22 b(none.)151 1564 y(Program)e(prop)q(ert)o -(y)i(six)g(\(t)o(yp)q(e)f(safe)h(assignmen)o(ts\))f(is)h(preserv)o(ed)g(b)o -(y)g(construction.)39 b(Also,)24 b(b)o(y)151 1621 y(construction)17 b(eac)o -(h)f(reference)i(to)d(the)i(v)m(ariable)h(is)f(replaced)g(b)o(y)g(a)f(seman)o -(tically)h(equiv)m(alen)o(t)i(\(but)151 1677 y(not)14 b(iden)o(tical)397 1661 -y fs(6)419 1677 y fl(\))g(reference)h(to)f(a)h(p)q(oin)o(ter)g(v)m(ariable,)g -(preserving)h(prop)q(ert)o(y)e(sev)o(en.)20 b(Other)15 b(program)151 1734 y -(prop)q(erties)h(are)f(trivially)i(preserv)o(ed.)813 1717 y fs(7)37 1827 y fh -(L.)23 b fi(c)n(onvert)s 14 2 v 13 w(variable)s 14 2 v 14 w(r)n(efer)n(enc)n -(es)s 14 2 v 12 w(to)s 14 2 v 14 w(function)s 14 2 v 13 w(c)n(al)r(ls)151 1902 -y fl(Argumen)o(ts:)d(v)m(ariable)c(V.)151 1978 y(Con)o(v)o(ert)e(all)i(refere\ -nces)g(to)e(V)h(to)g(calls)h(to)e(its)i(accessing)g(functions.)k(Con)o(v)o -(ert)14 b(all)i(assignmen)o(ts)f(to)151 2034 y(V)g(to)g(calls)h(to)f(its)g -(up)q(dating)h(function.)151 2109 y(Preconditions:)193 2203 y(1.)22 b(lo)q -(callyDe\014nedMem)o(b)q(erNamedP\(get)s 14 2 v 16 w fk(<)13 b(V)22 b(>)p fl -(,)15 b(V.o)o(wner\))f fj(^)251 2259 y fl(lo)q(callyDe\014nedMem)o(b)q(erName\ -dP\(address)s 14 2 v 16 w(of)s 14 2 v 13 w fk(<)f(V)22 b(>)p fl(,)15 b(V.o)o -(wner\))f fj(^)251 2316 y fl(lo)q(callyDe\014nedMem)o(b)q(erNamedP\(set)s 14 2 -v 16 w fk(<)f(V)22 b(>)p fl(,)15 b(V.o)o(wner\).)251 2372 y(\(the)g(access)g -(and)h(up)q(date)g(functions)g(are)e(already)i(de\014ned\).)37 2456 y 750 2 v -89 2483 a fu(6)107 2499 y fp(See)c(section)h(8.5.3)f(for)g(a)g(discussion)j -(of)d(ho)o(w)g(v)n(ariable)j(references)d(can)h(b)q(e)f(seman)o(tically)j(equ\ -iv)n(alen)o(t)g(but)e(not)f(iden)o(tical.)89 2528 y fu(7)107 2544 y fp(This)h -(refactoring)g(can)g(decrease)g(the)f(ph)o(ysical)j(size)e(of)f(instances)i -(of)e(the)g(class.)18 b(Programs)13 b(that)f(test)g(the)h(ph)o(ysical)i(size) -37 2590 y(of)e(ob)r(jects)h(could)g(see)f(their)h(b)q(eha)o(vior)h(c)o(hange) -f(\(see)f(the)g(discussion)j(in)e(section)g(4.1.2\).)952 2760 y fl(48)g eop -bop 151 42 a fl(The)21 b(access)f(and)g(up)q(date)h(functions,)h(b)o(y)e(cons\ -truction,)h(b)q(eha)o(v)o(e)f(the)h(same)f(as)f(direct)i(accesses)151 98 y -(and)14 b(up)q(dates)h(to)e(the)h(v)m(ariable.)21 b(Therefore,)13 b(replacing) -i(the)f(v)m(ariable)i(accesses)e(with)g(calls)h(to)e(these)151 154 y(function\ -s)20 b(preserv)o(es)g(prop)q(ert)o(y)f(sev)o(en)h(\(seman)o(tically)h(equiv)m -(alen)o(t)g(references)f(and)g(op)q(erations\).)151 211 y(Other)c(program)e -(prop)q(erties)i(are)e(trivially)j(preserv)o(ed.)37 305 y fh(M.)22 b fi(r)n -(eplac)n(e)s 14 2 v 13 w(statement)s 14 2 v 14 w(list)s 14 2 v 13 w(with)s 14 -2 v 14 w(function)s 14 2 v 13 w(c)n(al)r(l)151 380 y fl(Argumen)o(ts:)e(funct\ -ion)c(F,)e(list)i(statemen)o(tList,)e(functionCall)j(F)o(C.)151 455 y(Replace) -g(statemen)o(tList)e(in)h(F)f(with)g(the)g(function)h(call)h(F)o(C.)151 530 y -(Preconditions:)193 624 y(1.)22 b(classCon)o(taining\(F\))15 b fj(\032)h fl -(scop)q(eOf\(F)o(C.calledF)l(unction\))251 680 y(\(the)f(called)i(function)f -(is)g(visible)h(from)d(the)i(calling)h(function\).)193 753 y(2.)22 b(seman)o -(ticallyEquiv)m(alen)o(tP\(statemen)o(tList,)17 b(F)o(C\).)251 810 y(\(the)h -(function)i(call)g(is)f(seman)o(tically)h(equiv)m(alen)o(t)g(to)e(the)g(state\ -men)o(t)g(list)h(it)g(replaces.)31 b(The)251 866 y(abstract)14 b(syn)o(tax)h -(trees)g(m)o(ust)f(b)q(e)i(the)f(same,)g(up)h(to)e(v)m(ariable)j(renaming.\)) -151 960 y(The)j(function)g(call,)h(b)o(y)f(precondition,)i(b)q(eha)o(v)o(es)d -(the)h(same)f(as)g(the)h(statemen)o(t)e(list)i(it)g(replaces.)151 1017 y(Prog\ -ram)c(prop)q(ert)o(y)g(sev)o(en)h(\(seman)o(tically)h(equiv)m(alen)o(t)g(refe\ -rences)g(and)f(op)q(erations\))f(is)i(therefore)151 1073 y(preserv)o(ed;)d -(other)g(program)f(prop)q(erties)i(are)f(trivially)i(preserv)o(ed.)37 1167 y -fh(N.)23 b fi(inline)s 14 2 v 12 w(function)s 14 2 v 13 w(c)n(al)r(l)151 1242 -y fl(Replace)17 b(a)e(function)h(call)g(with)g(the)f(b)q(o)q(dy)h(of)f(the)g -(called)i(function.)1351 1226 y fs(8)151 1317 y fl(Argumen)o(ts:)j(functionCa\ -ll)c(F)o(C.)151 1392 y(Preconditions:)193 1486 y(1.)22 b fj(8)16 b fl(refdIte\ -m)f fj(2)326 1543 y fl(\(v)m(ariablesReferencedBy\(F)o(C.calledF)l(un)q(ction\ -\))j fj([)401 1599 y fl(functionsCalledBy\(F)o(C.calledF)l(unction\)\),)476 -1655 y(\(scop)q(eOf\(refdItem\))d fj(\032)h fl(F)o(C.calledF)l(unction\))g fj -(_)476 1712 y fl(\(con)o(tainingClass\(F)o(C\))e fj(\032)i fl(scop)q(eOf\(ref\ -dItem\)\).)251 1768 y(\(all)h(mem)o(b)q(er)f(v)m(ariables)h(and)f(functions)g -(referenced)h(b)o(y)f(the)g(called)i(function)e(are)g(reac)o(hable)251 1825 y -(from)f(the)g(calling)i(function\))151 1919 y(After)e(c)o(hec)o(king)h(the)f -(preconditions,)i(this)e(refactoring:)193 2012 y(1.)22 b(creates)c(a)g(statem\ -en)o(t)e(list,)k(equiv)m(alen)o(t)f(to)f(the)g(function)h(b)q(o)q(dy)f(in)h -(the)f(called)i(function,)f(to)251 2069 y(insert)14 b(in)o(to)e(the)i(calling) -g(function.)20 b(In)14 b(creating)f(the)g(statemen)o(t)f(list,)i(the)f(names) -g(of)f(v)m(ariables)251 2125 y(lo)q(cal)22 b(to)f(the)g(called)i(function)f -(ma)o(y)e(b)q(e)i(c)o(hanged)g(to)e(a)o(v)o(oid)h(name)g(collisions.)40 b(Eac) -o(h)21 b(call)251 2182 y(b)o(y)16 b(v)m(alue)i(is)f(handled)h(b)o(y)e(assignm\ -en)o(t)g(statemen)o(t)g(added)h(to)e(the)i(b)q(eginning)h(of)e(the)h(inlined) -251 2238 y(co)q(de.)j(Return)14 b(statemen)o(ts)e(are)h(con)o(v)o(erted)g(to) -f(branc)o(h/goto)g(statemen)o(ts)g(\(at)g(the)i(end)g(of)e(the)251 2295 y(sta\ -temen)o(t)i(list\).)193 2368 y(2.)22 b(replaces)16 b(the)g(function)g(call)g -(with)f(the)h(equiv)m(alen)o(t)h(statemen)o(t)d(list.)37 2449 y 750 2 v 89 -2476 a fu(8)107 2492 y fp(Issues)f(in)o(v)o(olv)o(ed)j(in)d(inlini)q(ng)j(fun\ -ctions)f(calls)f(are)f(detailed)i(in)f(the)f(program)h(transformation)h(liter\ -ature)f([27].)952 2760 y fl(49)g eop bop 151 42 a fl(The)12 b(only)g(problem) -h(with)f(inlining)i(a)e(called)h(function)g(is)f(that)f(the)h(function)g(ma)o -(y)f(reference)i(priv)m(ate)151 98 y(or)j(protected)g(mem)o(b)q(ers)g(that)f -(the)h(calling)i(function)f(can't)f(reference.)23 b(By)16 b(precondition)h -(one,)g(all)151 154 y(references)f(are)g(visible)i(to)d(the)h(caller.)22 b -(Th)o(us,)16 b(the)f(statemen)o(t)g(list)i(is)f(seman)o(tically)h(equiv)m(ale\ -n)o(t)g(to)151 211 y(the)e(function)h(call)h(it)e(replaces.)21 b(Therefore,) -14 b(program)h(prop)q(ert)o(y)f(sev)o(en)i(\(seman)o(tically)g(equiv)m(alen)o -(t)151 267 y(references)e(and)g(op)q(erations\))f(is)h(preserv)o(ed.)20 b(Oth\ -er)14 b(program)e(prop)q(erties)i(are)f(trivially)i(preserv)o(ed.)37 361 y fh -(O.)23 b fi(change)s 14 2 v 13 w(sup)n(er)n(class)151 436 y fl(Change)15 b -(the)h(sup)q(erclass)g(of)f(a)f(class.)151 511 y(Argumen)o(ts:)20 b(class)15 b -(C,)g(class)g(newSup)q(erclass.)151 587 y(Preconditions:)193 680 y(1.)22 b fj -(8)16 b fl(I)f fj(2)h fl(instancesOf\(C)f fj([)h fl(sub)q(classesOf\(C\)\),) -326 737 y fj(8)g fl(V)l(ar)f fj(2)g fl(v)m(ariablesAssigned\(I\),)401 793 y -(V)l(ar.t)o(yp)q(e)g fj(2)g fl(\(C)g fj([)g fl(sub)q(classesOf\(C\))h fj([)g -fl(newSup)q(erclass)h fj([)476 850 y fl(sup)q(erclassesOf\(newSup)q(erclass\)\ -\).)251 906 y(\(eac)o(h)11 b(assignmen)o(t)f fi(of)h fl(item)g(w)o(ould)g(rem\ -ain)g(t)o(yp)q(e)g(safe)g(if)g(its)g(t)o(yp)q(e)f(w)o(as)g(c)o(hanged)h(to)f -(new)s 14 2 v 14 w(t)o(yp)q(e\).)193 979 y(2.)22 b fj(8)16 b fl(mem)o(b)q(er) -f fj(2)g fl(inheritedMem)o(b)q(ers\(C\),)326 1036 y(mem)o(b)q(erNamedP\(mem)o -(b)q(er.name,)g(newSup)q(erclass\))h fj(^)326 1092 y fl(matc)o(hingA)o(ttribu\ -tesP\()401 1149 y(mem)o(b)q(er,)401 1205 y(mem)o(b)q(erNamed\(mem)o(b)q(er.na\ -me,)f(newSup)q(erclass\)\))251 1262 y(\(all)d(mem)o(b)q(ers)e(curren)o(tly)i -(inherited)g(will)h(b)q(e)e(iden)o(tically)i(inherited)g(from)d(the)h(new)g -(sup)q(erclass.)251 1318 y(This)18 b(precondition)g(is)f(strict,)g(but)g(the) -g(higher)h(lev)o(el)g(refactoring)e(mo)o(v)o(e)s 14 2 v 13 w(class)h(satis\ -\014es)g(this)251 1374 y(precondition)23 b(b)o(y)e(\014rst)f(calling)j(other) -e(refactorings)f(to)h(add)g(mem)o(b)q(ers)g(as)g(needed)h(to)e(the)251 1431 y -(sup)q(erclass,)c(b)q(efore)g(calling)g(this)g(refactoring.\))193 1504 y(3.) -22 b fj(8)16 b fl(mem)o(b)q(er)f fj(2)g fl(lo)q(callyDe\014nedMem)o(b)q(ersOf\ -\(C\),)326 1560 y(if)h(mem)o(b)q(erNamedP\(mem)o(b)q(er.name,)e(newSup)q(ercl\ -ass\),)401 1617 y(\(if)h(mem)o(b)q(er)h(is)g(a)e(v)m(ariable\):)21 b(matc)o -(hingA)o(ttributesP\()476 1673 y(mem)o(b)q(er,)15 b(mem)o(b)q(erNamed\(mem)o -(b)q(er.name,)g(newSup)q(erclass\)\))401 1730 y(\(if)g(mem)o(b)q(er)h(is)g -(a)e(function\):)21 b(matc)o(hingSignatureP\()476 1786 y(mem)o(b)q(er,)15 b -(mem)o(b)q(erNamed\(mem)o(b)q(er.name,)g(newSup)q(erclass\)\).)251 1843 y(\(e\ -ac)o(h)f(lo)q(cally)i(de\014ned)f(mem)o(b)q(er)g(either)g(do)q(esn't)f(clash) -g(with)h(a)f(mem)o(b)q(er)g(inherited)i(from)d(the)251 1899 y(new)k(sup)q(erc\ -lass,)g(or)e(it)i(is)f(iden)o(tical)i(to)e(an)g(mem)o(b)q(er)g(inheritable)i -(from)e(the)g(new)g(sup)q(erclass)251 1956 y(and)g(therefore)e(can)i(b)q(e)g -(remo)o(v)o(ed)e(from)h(the)g(sub)q(class)h(when)g(the)f(sup)q(erclass)i(is)e -(c)o(hanged.\))193 2029 y(4.)22 b(the)11 b(constructor)g(and)g(destructor)f -(c)o(hain)i(for)e(the)i(new)f(sup)q(erclass)h(is)g(seman)o(tically)g(equiv)m -(alen)o(t)251 2085 y(to)j(the)g(c)o(hains)h(for)e(the)i(curren)o(t)f(direct)h -(sup)q(erclass)g(of)f(C.)151 2179 y(After)g(c)o(hec)o(king)h(the)f(preconditi\ -ons,)i(this)e(refactoring:)193 2285 y(1.)22 b(c)o(hanges)15 b(the)h(sup)q(erc\ -lass)g(attribute)f(of)g(C)g(to)f(newSup)q(erclass)193 2358 y(2.)22 b(deletes) -c(from)f(C)g(an)o(y)g(mem)o(b)q(er)g(v)m(ariables)h(iden)o(tically)i(de\014ne\ -d)f(in)f(or)e(inherited)j(b)o(y)f(newSu-)251 2415 y(p)q(erclass.)151 2521 y -(Program)d(prop)q(ert)o(y)h(six)h(\(t)o(yp)q(e-safe)e(assignmen)o(ts\))h(is)h -(preserv)o(ed)g(b)o(y)f(precondition)i(one.)23 b(By)16 b(pre-)151 2577 y(cond\ -itions)h(t)o(w)o(o)d(and)i(three,)f(references)h(to)f(mem)o(b)q(ers)g(b)q(efo\ -re)h(the)f(refactoring)g(will)j(b)q(e)e(the)f(same,)952 2760 y(50)g eop bop -151 42 a fl(or)15 b(consisten)o(tly)h(replaced)g(b)o(y)f(references)g(to)g -(mem)o(b)q(ers)g(with)g(an)g(iden)o(tical)i(t)o(yp)q(e,)e(after)f(the)i(refac\ --)151 98 y(toring.)32 b(By)19 b(precondition)i(four,)f(the)f(constructors)g -(and)g(destructors)g(are)g(seman)o(tically)h(equiv-)151 154 y(alen)o(t)e(when) -g(the)f(sup)q(erclass)i(is)f(c)o(hanged.)27 b(Therefore,)17 b(program)g(prop) -q(ert)o(y)g(sev)o(en)h(\(seman)o(tically)151 211 y(equiv)m(alen)o(t)i(referen\ -ces)f(and)f(up)q(dates\))g(is)h(preserv)o(ed.)28 b(Other)18 b(program)f(prop) -q(erties)i(are)f(trivially)151 267 y(preserv)o(ed.)37 411 y fd(5.4)70 b(Mo)n -(ving)24 b(a)f(Mem)n(b)r(er)f(V)-6 b(ariable)37 512 y fl(These)16 b(refactori\ -ngs)f(mo)o(v)o(e)f(a)h(mem)o(b)q(er)g(v)m(ariable)i(to)e(a)f(sup)q(erclass)j -(or)d(sub)q(class.)37 618 y fh(A.)22 b fi(move)s 14 2 v 14 w(memb)n(er)s 14 2 -v 14 w(variable)s 14 2 v 13 w(to)s 14 2 v 15 w(sup)n(er)n(class)151 693 y fl -(Argumen)o(ts:)e(v)m(ariable)c(V,)f(class)h(C.)151 769 y(Mo)o(v)o(e)10 b(V)h -(to)f(class)i(C)f(from)f(all)i(sub)q(classes)g(where)f(it)g(is)h(de\014ned.) -19 b(If)12 b(V.accessCon)o(trolMo)q(de)e(=)h(public)151 825 y(in)i(its)f(curr\ -en)o(t)f(class\(es\),)h(it)g(will)i(b)q(e)e(public)i(in)f(its)f(new)g(class;) -h(otherwise,)f(the)g(access)g(con)o(trol)f(mo)q(de)151 881 y(in)19 b(the)f -(new)g(class)g(will)h(b)q(e)g(protected.)27 b(Also,)19 b(in)f(eac)o(h)g(sub)q -(class)h(where)f(it)g(is)g(curren)o(tly)g(de\014ned,)151 938 y(the)d(lo)q(cal) -i(de\014nition)g(of)e(the)g(v)m(ariable)h(is)g(remo)o(v)o(ed,)e(as)h(it)h(wil\ -l)h(b)q(e)e(no)o(w)g(b)q(e)h(inherited)h(from)d(C.)151 1013 y(This)k(refactor\ -ing)f(c)o(hanges)h(the)f(relativ)o(e)h(ph)o(ysical)h(ordering)e(of)g(v)m(aria\ -bles)i(in)f(the)g(class,)g(but)f(the)151 1070 y(v)m(ariable)g(t)o(yp)q(e)e -(and)g(references)h(remain)g(the)f(same.)1063 1053 y fs(9)151 1145 y fl(Preco\ -nditions:)193 1238 y(1.)22 b fj(8)16 b fl(C)f fj(2)g fl(sub)q(classesOf\(C\):) -326 1295 y(\()p fj(9)g fl(V)l(ar)g fj(2)h fl(C.lo)q(callyDe\014nedMem)o(b)q -(erV)l(ariables)i fj(^)326 1351 y fl(V)l(ar.name)d(=)g(V.name\))g fj(\))401 -1408 y fl(matc)o(hingA)o(ttributesP\(V)l(ar,)f(V\).)251 1464 y(\(the)h(v)m -(ariable)i(is)e(de\014ned)i(iden)o(tically)h(in)e(all)g(sub)q(classes)g(where) -g(it)f(is)h(de\014ned\))193 1537 y(2.)22 b fj(8)16 b fl(mem)o(b)q(er)f fj(2)g -fl(C.lo)q(callyDe\014nedMem)o(b)q(erV)l(ariabl)q(es,)326 1594 y(mem)o(b)q(er.\ -name)g fj(6)p fl(=)h(V.name\))251 1650 y(\(the)c(v)m(ariable)i(isn't)e(alread\ -y)g(de\014ned)i(lo)q(cally)g(in)f(\(as)e(a)h(priv)m(ate)h(mem)o(b)q(er)f(of)t -(\))f(the)h(sup)q(erclass\).)151 1744 y(Since)20 b(\(b)o(y)d(precondition)i -(one\))f(the)g(v)m(ariable)h(is)g(de\014ned)g(iden)o(tically)h(in)f(all)g(sub) -q(classes)g(where)f(it)151 1801 y(is)f(de\014ned,)g(replacing)h(the)e(lo)q -(cal)h(de\014nitions)h(in)f(the)g(sub)q(classes)g(b)o(y)f(a)g(de\014nition)i -(inherited)g(from)151 1857 y(C)f(will)i(not)e(c)o(hange)h(the)f(b)q(eha)o(vio\ -r)h(of)f(the)g(program,)g(preserving)h(program)e(prop)q(ert)o(y)h(sev)o(en)h -(\(se-)151 1913 y(man)o(tically)f(equiv)m(alen)o(t)h(references)f(and)f(op)q -(erations\).)22 b(Other)16 b(program)f(prop)q(erties)i(are)f(trivially)151 -1970 y(preserv)o(ed.)351 1953 y fs(10)37 2064 y fh(B.)23 b fi(move)s 14 2 v 14 -w(memb)n(er)s 14 2 v 14 w(variable)s 14 2 v 13 w(to)s 14 2 v 14 w(sub)n(class\ -es)151 2139 y fl(Argumen)o(ts:)d(v)m(ariable)c(V,)f(sub)q(class)s 14 2 v 14 w -(list.)151 2214 y(Mo)o(v)o(e)21 b(the)g(mem)o(b)q(er)h(v)m(ariable)g(from)f -(its)h(curren)o(t)f(con)o(taining)h(class)g(to)e(eac)o(h)i(of)f(its)g(immedia\ -te)151 2270 y(sub)q(classes.)151 2346 y(Preconditions:)37 2418 y 750 2 v 89 -2445 a fu(9)107 2461 y fp(This)15 b(refactoring)g(c)o(hanges)h(the)f(relativ) -o(e)h(ph)o(ysical)h(p)q(osition)f(of)f(v)n(ariables)h(within)g(instances)g -(of)f(the)f(class.)23 b(Programs)37 2506 y(that)14 b(test)e(the)h(ph)o(ysical) -j(p)q(ositions)f(of)e(v)n(ariables)i(could)f(see)f(their)h(b)q(eha)o(vior)h -(c)o(hange)e(\(see)g(the)g(discussion)j(in)e(section)g(4.1.2\).)74 2536 y fu -(10)107 2552 y fp(This)h(refactoring)g(c)o(hanges)h(the)f(relativ)o(e)h(ph)o -(ysical)h(p)q(osition)f(of)f(v)n(ariables)h(within)g(instances)g(of)f(the)f -(class.)23 b(Programs)37 2598 y(that)14 b(test)e(the)h(ph)o(ysical)j(p)q(osit\ -ions)f(of)e(v)n(ariables)i(could)f(see)f(their)h(b)q(eha)o(vior)h(c)o(hange)e -(\(see)g(the)g(discussion)j(in)e(section)g(4.1.2\).)952 2760 y fl(51)g eop bop -193 42 a fl(1.)22 b(referencesT)l(o\(V,)15 b(con)o(tainingClass\(V\)\))g(=)h -fj(;)251 98 y fl(\(the)h(v)m(ariable)i(is)f(not)f(referenced)h(b)o(y)g(mem)o -(b)q(ers)f(of,)g(nor)g(referenced)i(on)e(instances)h(of,)f(con-)251 154 y(tai\ -ningClass\(V\)\))193 227 y(2.)22 b(V.accessCon)o(trolMo)q(de)15 b fj(6)p fl -(=)g(priv)m(ate.)251 284 y(\(the)g(v)m(ariable)i(is)e(already)h(inherited)h -(b)o(y)e(the)g(immediate)i(sub)q(classes.)151 378 y(After)g(the)f(refactoring\ -,)h(V)g(will)h(still)h(b)q(e)e(de\014ned)h(in)g(all)g(sub)q(classes)g(that)e -(curren)o(tly)h(reference)h(it.)151 434 y(Therefore,)c(program)f(prop)q(ert)o -(y)h(sev)o(en)h(\(seman)o(tically)g(equiv)m(alen)o(t)h(references)f(and)g(op) -q(erations\))f(is)151 491 y(preserv)o(ed)i(b)o(y)f(preconditions;)h(other)f -(program)f(prop)q(erties)i(are)f(trivially)i(preserv)o(ed.)1673 474 y fs(11) -37 634 y fd(5.5)70 b(Comp)r(osite)21 b(Refactorings)37 735 y fl(These)h(refac\ -torings)e(build)j(up)q(on)f(the)f(other)g(lo)o(w-lev)o(el)h(refactorings,)g -(to:)30 b(abstract)20 b(v)m(ariable)j(access,)37 792 y(con)o(v)o(ert)14 b(b)q -(et)o(w)o(een)g(a)g(co)q(de)g(segmen)o(t)g(and)g(a)g(corresp)q(onding)h(funct\ -ion)g(call,)g(and)f(p)q(erform)g(more)f(p)q(o)o(w)o(erful)37 848 y(mo)o(ving) -j(op)q(erations.)37 942 y fh(A.)22 b fi(abstr)n(act)s 14 2 v 14 w(ac)n(c)n -(ess)s 14 2 v 12 w(to)s 14 2 v 14 w(memb)n(er)s 14 2 v 14 w(variable)151 1017 -y fl(Abstract)e(access)h(to)e(a)i(mem)o(b)q(er)f(v)m(ariable)i(b)o(y)e(de\014\ -ning)i(functions)g(for)d(accessing)j(the)e(v)m(alue)i(or)151 1074 y(address) -15 b(of)g(the)g(v)m(ariable,)h(and)f(for)f(up)q(dating)i(its)f(v)m(alue.)21 b -(Replace)c(v)m(ariable)f(references)g(with)f(calls)151 1130 y(to)h(these)g -(functions,)h(and)g(\(if)f(the)h(access)f(con)o(trol)g(mo)q(de)h(of)f(the)g -(v)m(ariable)i(is)e(public\))j(limit)e(access)151 1187 y(to)e(the)g(v)m(ariab\ -le)i(b)o(y)e(making)g(it)g(protected.)151 1262 y(Argumen)o(ts:)20 b(v)m(ariab\ -le)c(V.)151 1337 y(After)f(c)o(hec)o(king)h(its)f(preconditions,)i(this)e(ref\ -actoring:)193 1431 y(1.)22 b(calls)16 b(create)s 14 2 v 14 w(mem)o(b)q(er)s 14 -2 v 13 w(function)g(to)f(create)g(the)g(access)g(and)h(up)q(date)f(functions) -251 1487 y(\(named)g(get)s 14 2 v 13 w fk(<)e(V)22 b(>)p fl(,)16 b(set)s 14 2 -v 13 w fk(<)d(V)22 b(>)p fl(,)15 b(address)s 14 2 v 14 w(of)s 14 2 v 13 w fk -(<)e(V)22 b(>)p fl(\))193 1560 y(2.)g(calls)12 b(con)o(v)o(ert)s 14 2 v 13 w -(v)m(ariable)s 14 2 v 15 w(references)s 14 2 v 14 w(to)s 14 2 v 12 w(function) -s 14 2 v 15 w(calls)g(to)e(replace)i(references)g(to)e(V)h(with)g(calls)251 -1617 y(to)k(the)g(access)g(and)h(up)q(date)f(functions.)193 1690 y(3.)22 b -(if)17 b(the)f(access)g(con)o(trol)g(mo)q(de)h(of)e(V)i(is)f(public,)j(calls) -e(c)o(hange)s 14 2 v 13 w(access)s 14 2 v 14 w(con)o(trol)s 14 2 v 13 w(mo)q -(de)f(to)g(mak)o(e)251 1746 y(V)f(protected.)151 1840 y(Preconditions:)193 -1934 y(1.)22 b fj(\030)p fl(mem)o(b)q(erNamed\(get)s 14 2 v 14 w fk(<)12 b -(V)23 b(>)15 b fl(con)o(tainingClass\(V\)\))g fj(^)251 1990 y(\030)p fl(mem)o -(b)q(erNamed\(set)s 14 2 v 14 w fk(<)e(V)22 b(>)15 b fl(con)o(tainingClass\(V\ -\)\))h fj(^)251 2047 y(\030)p fl(mem)o(b)q(erNamed\(address)s 14 2 v 14 w(of) -s 14 2 v 13 w fk(<)d(V)22 b(>)16 b fl(con)o(tainingClass\(V\)\).)251 2103 y -(\(access)f(to)g(the)g(v)m(ariable)i(has)e(not)f(already)i(b)q(een)g(abstract\ -ed\))151 2197 y(F)l(or)j(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(func\ -tion:)29 b(preconditions)22 b(one)d(through)h(four)f(are)g(satis\014ed)h(b)o -(y)g(precondi-)151 2253 y(tion)d(one)f(of)g(this)h(refactoring;)f(preconditio\ -n)i(\014v)o(e)f(is)f(satis\014ed)h(b)q(ecause)h(the)e(new)h(functions)g(only) -151 2310 y(con)o(tain)f(a)g(reference)h(to)e(V,)h(whic)o(h)h(remains)f(visibl\ -e)j(within)e(its)f(class.)23 b(F)l(or)15 b(the)i(refactoring)e(con-)151 2366 y -(v)o(ert)s 14 2 v 13 w(v)m(ariable)s 14 2 v 15 w(references)s 14 2 v 14 w(to) -s 14 2 v 13 w(function)s 14 2 v 14 w(calls:)31 b(precondition)22 b(one)e(is)h -(satis\014ed)g(b)o(y)f(the)h(functions)151 2423 y(w)o(ere)16 b(created)h(in)g -(the)g(prior)g(step.)23 b(F)l(or)16 b(c)o(hange)s 14 2 v 14 w(access)s 14 2 v -13 w(con)o(trol)s 14 2 v 13 w(mo)q(de:)23 b(since)18 b(this)f(refactoring)f -(is)37 2504 y 750 2 v 74 2531 a fu(11)107 2547 y fp(This)f(refactoring)g(c)o -(hanges)h(the)f(relativ)o(e)h(ph)o(ysical)h(p)q(osition)f(of)f(v)n(ariables)h -(within)g(instances)g(of)f(the)f(class.)23 b(Programs)37 2592 y(that)14 b(tes\ -t)e(the)h(ph)o(ysical)j(p)q(ositions)f(of)e(v)n(ariables)i(could)f(see)f(thei\ -r)h(b)q(eha)o(vior)h(c)o(hange)e(\(see)g(the)g(discussion)j(in)e(section)g -(4.1.2\).)952 2760 y fl(52)g eop bop 151 42 a fl(only)18 b(called)g(if)g(V)f -(is)h(public,)h(preconditions)g(one)e(and)g(t)o(w)o(o)f(are)h(trivially)i(sat\ -is\014ed;)f(precondition)151 98 y(three)g(is)g(satis\014ed)h(b)q(ecause)f(aft\ -er)f(the)h(prior)g(step,)g(the)g(only)g(reference)h(to)e(the)h(v)m(ariable)h -(is)f(from)151 154 y(functions)e(de\014ned)h(in)f(the)f(class.)151 227 y(This) -d(refactoring)f(is)h(constructed)f(using)h(b)q(eha)o(vior)g(preserving)g(refa\ -ctorings)e(and,)i(since)h(it)e(satis\014es)151 283 y(the)k(preconditions)i -(of)e(those)g(refactorings,)f(b)q(eha)o(vior)i(is)g(preserv)o(ed.)37 372 y fh -(B.)23 b fi(c)n(onvert)s 14 2 v 13 w(c)n(o)n(de)s 14 2 v 13 w(se)n(gment)s 14 -2 v 13 w(to)s 14 2 v 14 w(function)151 444 y fl(De\014ne)18 b(a)f(new)g(mem)o -(b)q(er)h(function,)g(with)g(a)f(unique)h(name,)g(whose)f(function)h(b)q(o)q -(dy)g(is)g(equiv)m(alen)o(t)151 501 y(to)g(a)h(statemen)o(t)e(list)j(of)e(an) -h(existing)g(mem)o(b)q(er)g(function.)31 b(Replace)21 b(that)d(statemen)o(t)f -(list)j(in)f(the)151 557 y(existing)d(mem)o(b)q(er)g(function)g(with)f(a)g -(call)h(to)f(the)g(new)h(mem)o(b)q(er)f(function.)151 629 y(Argumen)o(ts:)20 b -(setOf\(statemen)o(t\))13 b(statemen)o(tList.)151 702 y(After)i(c)o(hec)o(kin\ -g)h(its)f(precondition,)i(this)e(refactoring:)193 790 y(1.)22 b(constructs)14 -b(an)g(argumen)o(t)g(list)h(for)e(the)h(new)h(mem)o(b)q(er)f(function.)21 b -(The)14 b(argumen)o(t)f(consists)i(of)251 847 y(v)m(ariables)g(lo)q(cal)g(to) -f(con)o(tainingF)l(unction\(statemen)o(tList\))g(that)f(are)h(referenced)h -(or)e(mo)q(di\014ed)251 903 y(b)o(y)f(statemen)o(tList,)g(but)f(whic)o(h)i -(are)f(declared)h(within)g(statemen)o(tList.)18 b(V)l(ariables)13 b(mo)q(di\ -\014ed)g(is)251 960 y(statemen)o(tList)i(will)i(b)q(e)f(passed-b)o(y-referenc\ -ed;)g(other)f(v)m(ariables)h(will)h(b)q(e)f(passed-b)o(y-v)m(alue.)251 1022 y -(Then,)j(calls)h(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(function)f -(to)f(create)g(the)g(new)h(mem)o(b)q(er)f(function.)30 b(The)18 b(new)251 1078 -y(function)e(is)g(giv)o(en)g(a)e(unique)j(name.)193 1146 y(2.)22 b(calls)g -(replace)s 14 2 v 15 w(statemen)o(t)s 14 2 v 12 w(list)s 14 2 v 14 w(with)s 14 -2 v 14 w(function)s 14 2 v 14 w(call)g(to)f(replace)h(the)f(statemen)o(t)f -(list)h(with)h(a)251 1202 y(call)16 b(to)f(the)g(newly)h(created)g(function.) -151 1291 y(Preconditions:)193 1379 y(1.)22 b(con)o(v)o(ertibleT)l(oF)l(unctio\ -nP\(statemen)o(tList\).)251 1435 y(\(statemen)o(tList)15 b(is)g(con)o(v)o(ert\ -ible)h(to)f(a)g(legal)h(function\))151 1524 y(F)l(or)21 b(create)s 14 2 v 13 w -(mem)o(b)q(er)s 14 2 v 14 w(function:)32 b(preconditions)23 b(one)f(through)e -(four)h(are)g(satis\014ed)h(b)q(ecause)g(the)151 1580 y(function)12 b(is)g -(giv)o(en)g(a)g(unique)h(name;)f(precondition)h(\014v)o(e)f(is)g(satis\014ed) -g(b)q(ecause)g(the)g(new)f(function)i(has)151 1637 y(the)f(same)g(access)g -(to)f(global)h(and)g(mem)o(b)q(er)g(v)m(ariables)h(and)f(functions)h(as)e(the) -h(old)h(function,)g(and)f(an)o(y)151 1693 y(v)m(ariables)g(lo)q(cal)g(to)d -(the)i(old)g(function)g(but)g(not)f(de\014ned)i(in)f(statemen)o(tList)f(are)g -(passed)h(as)f(argumen)o(ts)151 1750 y(to)18 b(the)h(new)g(function.)32 b(F)l -(or)19 b(replace)s 14 2 v 14 w(statemen)o(t)s 14 2 v 12 w(list)s 14 2 v 14 w -(with)s 14 2 v 14 w(function)s 14 2 v 14 w(call,)i(precondition)f(one)g(b)o -(y)151 1806 y(the)e(results)h(of)e(the)h(prior)g(step;)h(precondition)h(t)o -(w)o(o)d(is)h(satis\014ed)h(b)q(ecause,)g(b)o(y)f(construction,)g(the)151 1862 -y(new)e(function)g(is)f(equiv)m(alen)o(t)i(to)e(the)g(statemen)o(t)f(list)i -(it)g(replaces.)151 1935 y(This)c(refactoring)f(is)h(constructed)f(using)h -(b)q(eha)o(vior)g(preserving)g(refactorings)e(and,)i(since)h(it)e(satis\014es) -151 1991 y(the)k(preconditions)i(of)e(those)g(refactorings,)f(b)q(eha)o(vior) -i(is)g(preserv)o(ed.)37 2080 y fh(C.)22 b fi(move)s 14 2 v 14 w(class)151 2152 -y fl(Mo)o(v)o(e)14 b(a)h(class)h(\(c)o(hange)f(its)g(sup)q(erclass\).)151 2225 -y(Argumen)o(ts:)20 b(class)15 b(C,)g(class)g(newSup)q(erclass.)151 2297 y(Aft\ -er)g(c)o(hec)o(king)h(the)f(preconditions,)i(this)e(refactoring:)193 2392 y -(1.)22 b(determines)14 b(the)g(set)f(of)g(inherited)i(mem)o(b)q(ers)e(that)g -(w)o(ould)g(not)g(b)q(e)h(\(iden)o(tically\))h(inherited)h(b)o(y)251 2449 y -(C)f(\(from)f(newSup)q(erclass)j(or)e(one)g(of)g(its)g(sup)q(erclasses\))h -(at)f(its)g(new)h(lo)q(cation)1618 2432 y fs(12)1656 2449 y fl(;)f(then:)37 -2522 y 750 2 v 74 2548 a fu(12)107 2564 y fp(The)f(curren)o(t)h(sub)q(class)i -(of)d(C)g(could)i(share)f(a)g(common)g(sup)q(erclass)i(with)e(newSup)q(erclas\ -s;)i(these)e(classes)h(ma)o(y)e(inherit)37 2610 y(some)k(common)f(b)q(eha)o -(vior)i(but)e(a)g(virtual)h(mem)o(b)q(er)g(function)g(could)g(b)q(e)f(de\014n\ -ed)h(di\013eren)o(tly)h(in)f(those)f(classes.)30 b(Or,)17 b(the)952 2760 y fl -(53)g eop bop 255 42 a fl(\(a\))22 b(for)17 b(eac)o(h)g(mem)o(b)q(er)g(functi\ -on)h(in)g(the)g(set,)f(calls)h(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w -(function)g(to)e(cop)o(y)h(the)336 98 y(function)f(in)o(to)f(C)253 163 y(\(b\ -\))22 b(for)15 b(eac)o(h)g(mem)o(b)q(er)g(v)m(ariable)i(in)f(the)f(set:)365 -227 y(i.)23 b(if)g(the)g(v)m(ariable)h(is)f(de\014ned)h(in)f(an)o(y)g(curren) -o(t)f(sub)q(class)i(of)e(newSup)q(erclass,)j(calls)413 284 y(mo)o(v)o(e)s 14 2 -v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable)s 14 2 v 14 w(to)s 14 2 v 13 w -(sup)q(erclass)14 b(to)f(mo)o(v)o(e)f(the)h(v)m(ariable)i(to)d(newSup)q(ercla\ -ss.)353 349 y(ii.)23 b(otherwise)12 b(if)h(the)f(v)m(ariable)h(is)f(not)g(alr\ -eady)g(a)f(lo)q(cal)i(or)e(inherited)j(mem)o(b)q(er)e(of)g(newSu-)413 405 y -(p)q(erclass,)j(calls)f(create)s 14 2 v 14 w(mem)o(b)q(er)s 14 2 v 13 w(v)m -(ariable)h(to)e(add)h(the)f(v)m(ariable)i(to)e(newSup)q(erclass.)193 478 y -(2.)22 b(calls)16 b(the)g(refactoring)e(c)o(hange)s 14 2 v 14 w(sup)q(erclass) -i(to)f(c)o(hange)g(the)g(sup)q(erclass)i(of)d(C.)151 584 y(Preconditions:)193 -678 y(1.)22 b fj(8)16 b fl(mem)o(b)q(er)f fj(2)g fl(\(mem)o(b)q(ersOf\(C\):) -255 751 y(\(a\))22 b(if)16 b(mem)o(b)q(er)f(is)h(a)f(v)m(ariable)h fj(^)411 -808 y(9)g fl(V)l(ar)f fj(2)g fl(mem)o(b)q(erV)l(ariablesOf\(newSup)q(erclass\ -\))j fj(^)411 864 y fl(mem)o(b)q(er.name)d(=)h(V)l(ar.name,)486 921 y(matc)o -(hingA)o(ttributesP\(mem)o(b)q(er,)f(V)l(ar\).)253 985 y(\(b\))22 b(if)16 b -(mem)o(b)q(er)f(is)h(a)f(function)h fj(^)411 1042 y(9)g fl(F)l(unc)f fj(2)h fl -(mem)o(b)q(erF)l(unctionsOf\(newSup)q(erclass\))h fj(^)411 1098 y fl(mem)o -(b)q(er.name)e(=)h(F)l(unc.name,)486 1155 y(matc)o(hingSignatureP\(mem)o(b)q -(er,)f(F)l(unc\).)336 1211 y(\(attributes)j(of)g(mem)o(b)q(er)h(v)m(ariables) -h(and)e(signatures)h(of)f(mem)o(b)q(er)h(functions)g(in)g(C)g(will)336 1268 y -(matc)o(h)c(with)g(its)h(sup)q(erclasses.\))193 1341 y(2.)22 b(if)16 b(v)m -(ariables)g(needed)h(in)f(the)f(new)h(sup)q(erclass)g(are)f(already)h(de\014n\ -ed)g(in)g(its)g(sub)q(classes,)g(those)251 1397 y(v)m(ariables)h(are)e(de\014\ -ned)h(iden)o(tically)i(in)e(the)f(sub)q(classes)193 1470 y(3.)22 b fj(8)16 b -fl(sub)q(classInstance)g fj(2)g fl(instancesOf\(C\),)326 1527 y fj(8)g fl(V)l -(ar)f fj(2)g fl(v)m(ariablesAssigned\(sub)q(cl)q(assInstance\),)401 1583 y -(V)l(ar.t)o(yp)q(e)g fj(2)g fl(\(C)g fj([)g fl(newSup)q(erclass)476 1640 y fj -([)h fl(sup)q(erclassesOf\(newSup)q(erclass\)\).)251 1696 y(\(eac)o(h)f(assig\ -nmen)o(t)g fi(of)h fl(an)f(instance)h(of)e(the)i(class)f(b)q(eing)i(mo)o(v)o -(ed)d(w)o(ould)i(remain)g(t)o(yp)q(e)f(safe\).)151 1790 y(F)l(or)h(create)s 14 -2 v 14 w(mem)o(b)q(er)s 14 2 v 13 w(function:)24 b(preconditions)19 b(one)e -(and)g(four)g(are)f(satis\014ed)i(b)q(ecause)g(the)f(refac-)151 1846 y(toring) -e(is)h(only)g(in)o(v)o(ok)o(ed)g(if)f(it)h(is)g(not)f(already)g(lo)q(cally)j -(de\014ned)e(or)f(inherited;)i(precondition)g(t)o(w)o(o)d(is)151 1903 y(satis\ -\014ed)f(b)o(y)f(precondition)i(one)e(of)g(this)g(refactoring;)h(precondition) -h(three)e(is)g(satis\014ed)h(b)q(ecause)g(the)151 1959 y(class)19 b(is)g(mo)o -(v)o(ed)e(along)i(with)f(its)h(sup)q(erclasses;)h(precondition)g(\014v)o(e)e -(is)h(satis\014ed)g(b)o(y)f(construction)151 2016 y(-)f(this)g(refactoring)f -(ensures)h(that)e(all)j(referenced)f(v)m(ariables)h(and)f(functions)g(are)f -(visible)j(after)c(the)151 2072 y(mo)o(v)o(e.)151 2147 y(F)l(or)21 b(mo)o(v)o -(e)s 14 2 v 12 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable)s 14 2 v 15 w(to)s 14 -2 v 12 w(sup)q(erclass:)33 b(precondition)23 b(one)e(is)h(satis\014ed)g(b)o -(y)f(precondition)151 2204 y(t)o(w)o(o)e(of)h(this)g(refactoring;)i(precondit\ -ion)g(t)o(w)o(o)d(is)i(satis\014ed)f(b)o(y)g(this)h(refactoring)f(is)g(not)g -(in)o(v)o(ok)o(ed)151 2260 y(when)c(the)f(v)m(ariable)i(is)e(already)h(de\014\ -ned)g(in)g(or)f(inherited)i(b)o(y)e(the)h(sup)q(erclass.)151 2335 y(F)l(or)11 -b(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable:)20 b(this)11 b -(refactoring)g(is)g(only)h(in)o(v)o(ok)o(ed)f(if)h(the)f(v)m(ariable)h(do)q -(es)g(not)e(collide)151 2392 y(with)16 b(an)f(existing)h(v)m(ariable,)g(th)o -(us)f(satisfying)h(precondition)g(one.)37 2473 y 750 2 v 37 2516 a fp(curren) -o(t)f(and)g(new)f(sup)q(erclasses)j(ma)o(y)d(not)h(share)f(a)h(common)g(sup)q -(erclass)h(and)f(all)g(inherited)i(b)q(eha)o(vior)f(w)o(ould)f(need)g(to)f -(b)q(e)37 2561 y(copied.)952 2760 y fl(54)g eop bop 151 42 a fl(F)l(or)18 b -(c)o(hange)s 14 2 v 13 w(sup)q(erclass:)27 b(precondition)20 b(one)f(is)g(sat\ -is\014ed)f(b)o(y)h(precondition)h(three)e(of)g(this)h(refac-)151 98 y(toring;) -j(precondition)g(is)e(satis\014ed)h(b)o(y)f(the)g(results)g(of)g(the)g(prior) -g(steps;)i(precondition)g(three)e(is)151 154 y(satis\014ed)c(b)o(y)f(precondi\ -tion)i(one)e(of)g(this)h(refactoring.)151 230 y(This)c(refactoring)f(is)h(con\ -structed)f(using)h(b)q(eha)o(vior)g(preserving)g(refactorings)e(and,)i(since) -h(it)e(satis\014es)151 286 y(the)k(preconditions)i(of)e(those)g(refactorings,) -f(b)q(eha)o(vior)i(is)g(preserv)o(ed.)1372 270 y fs(13)37 2521 y 750 2 v 74 -2548 a fu(13)107 2564 y fp(This)c(refactoring)h(could)g(c)o(hange)g(the)f(ph) -o(ysical)i(size)f(of)e(instances)j(of)e(the)g(class.)17 b(Programs)c(that)f -(test)f(the)h(ph)o(ysical)j(size)37 2610 y(of)e(ob)r(jects)h(could)g(see)f -(their)h(b)q(eha)o(vior)h(c)o(hange)f(\(see)f(the)g(discussion)j(in)e(section) -g(4.1.2\).)952 2760 y fl(55)g eop bop 37 353 a fc(Chapter)35 b(6)37 560 y fb -(Refactoring)42 b(T)-10 b(o)40 b(Generalize:)37 685 y(Creating)i(an)d(Abstrac\ -t)g(Sup)s(erclass)37 907 y fl(This)16 b(c)o(hapter)e(fo)q(cuses)i(on)e(creati\ -ng)h(an)g(abstract)f(sup)q(erclass)i(that)e(captures)g(the)h(b)q(eha)o(vior)h -(common)e(to)37 964 y(t)o(w)o(o)g(classes.)21 b(It)15 b(can)g(b)q(e)h(general\ -ized)h(to)e(w)o(ork)f(with)h(an)o(y)g(n)o(um)o(b)q(er)h(of)f(classes.)108 1020 -y(Casais)c([30)o(])g(and)g(Bergstein)h([15)o(])f(note)g(that)f(a)h(useful)h -(b)q(eha)o(vior)g(preserving)g(program)e(transformation)37 1077 y(is)15 b(to) -e(mo)o(v)o(e)g(a)g(function)h(or)g(v)m(ariable)h(to)e(a)g(common)g(sup)q(ercl\ -ass)i(from)e(sub)q(classes)i(where)f(it)g(is)g(iden)o(tically)37 1133 y(de\ -\014ned.)22 b(Ho)o(w)o(ev)o(er,)14 b(as)h(this)h(c)o(hapter)f(describ)q(es)i -(de\014ning)g(an)e(abstract)f(sup)q(erclass)j(in)o(v)o(olv)o(es)f(more)f(than) -37 1190 y(just)e(mo)o(ving)g(up)h(iden)o(tically)h(de\014ned)g(mem)o(b)q(ers.) -k(The)14 b(imp)q(ortan)o(t)e(\(and)h(complex\))h(parts)e(of)h(the)g(pro)q(ces\ -s)37 1246 y(come)j(in)h(\014nding)f(the)g(common)f(abstraction)h(that)e(is)j -(often)e(hidden)i(b)q(ehind)h(di\013ering)e(v)o(o)q(cabulary)l(,)g(and)37 1303 -y(ac)o(hieving)h(compatibilit)o(y)g(b)q(et)o(w)o(een)e(the)h(sub)q(class)g -(implemen)o(tations.)1284 1286 y fs(1)108 1359 y fl(When)c(capturing)g(the)g -(abstraction)f(common)h(to)f(t)o(w)o(o)f(classes,)j(one)f(cannot)f(exp)q(ect) -i(that)e(the)h(similari-)37 1416 y(ties)i(will)g(already)f(b)q(e)g(ob)o(vious\ -,)g(con)o(v)o(enien)o(tly)h(separated)e(from)g(the)h(di\013erences,)h(and)f -(de\014ned)h(iden)o(tically)37 1472 y(in)22 b(b)q(oth)f(sub)q(classes.)38 b -(In)22 b(general,)g(ac)o(hieving)g(compatibilit)o(y)g(b)q(et)o(w)o(een)g(the) -e(sub)q(classes)j(ma)o(y)d(require)37 1528 y(c)o(hanging)f(mem)o(b)q(er)e(nam\ -es)h(and)f(other)h(attributes,)f(and)h(splitting)h(function)f(b)q(o)q(dies,)i -(b)q(efore)d(mem)o(b)q(ers)37 1585 y(can)f(b)q(e)g(mo)o(v)o(ed)e(up)i(to)f -(the)g(sup)q(erclass.)108 1641 y(T)l(o)i(illustrate)h(some)f(of)g(the)h(compl\ -exities,)h(recall)f(the)g(example)g(describ)q(ed)h(in)f(section)g(3.2)e(for)h -(cre-)37 1698 y(ating)i(the)g(abstract)f(sup)q(erclass)i ff(Ino)q(de)p fl(,)h -(that)d(captured)h(the)g(abstraction)f(common)h(to)f(the)h ff(BSDIno)q(de)37 -1754 y fl(and)e ff(SystemVIno)q(de)f fl(classes.)24 b(The)16 b(common)g(abstr\ -action)g(w)o(as)g(con)o(tained)h(in)g(functions)g(that)f(w)o(ere)g fi(not)37 -1811 y fl(iden)o(tically)k(de\014ned)e(in)g(the)g(t)o(w)o(o)d(classes)j(b)q -(efore)f(the)g(refactoring)g(w)o(as)f(p)q(erformed.)26 b(In)18 b(particular,) -f(the)37 1867 y(implemen)o(tations)i(of)e(the)h fi(mapUnit)f fl(function)h -(w)o(ere)f(sligh)o(tly)i(di\013eren)o(t)f(due)g(to)e(di\013erences)j(in)f(the) -g(t)o(w)o(o)37 1924 y(\014le)f(formats.)108 1980 y(As)d(sho)o(wn)g(b)q(elo)o -(w)h(in)h(Figure)e(6.1,)g(most)f(but)i(not)f(all)h(of)f(the)g(co)q(de)h(for)f -(the)h fi(mapUnit)f fl(function)h(in)g(the)37 2037 y ff(SystemVIno)q(de)j fl -(class)g(w)o(as)f(the)g(same)h(as)f(for)g(the)h fi(mapUnit)g fl(function)g -(de\014ned)h(in)g(the)f ff(BSDIno)q(de)g fl(class.)37 2093 y(Ho)o(w)o(ev)o -(er,)13 b(the)h(co)q(de)g(for)g(getting)f(and)h(setting)g(a)f(logical)i(blo)q -(c)o(k)g(n)o(um)o(b)q(er)f(w)o(as)f(di\013eren)o(t)h(b)q(et)o(w)o(een)g(the)g -(t)o(w)o(o)37 2149 y(\014le)j(system)d(formats.)108 2206 y(The)f(implemen)o -(tations)i(of)e(the)g fi(mapUnit)g fl(function)h(in)g(eac)o(h)f(sub)q(class)h -(needed)h(to)d(matc)o(h)h(b)q(efore)g(they)37 2262 y(could)22 b(b)q(e)f(repla\ -ced)g(b)o(y)f(a)g(commonly)h(inherited)h(function)f(in)g(the)f(sup)q(erclass.) -36 b(T)l(o)20 b(handle)i(this,)f(the)37 2319 y(co)q(de)f(that)d(di\013ered)j -(b)q(et)o(w)o(een)f(the)f(t)o(w)o(o)f(implemen)o(tations)j(w)o(as)e(placed)h -(in)o(to)g(new)g(functions)g fi(getDir)n(e)n(ct)37 2375 y fl(and)g fi(setDir) -n(e)n(ct)e fl(whic)o(h)i(w)o(ere)f(added)h(to)f(the)g(sub)q(classes.)30 b(The\ -n,)19 b(in)g(b)q(oth)f(de\014nitions)i(of)e(the)g fi(mapUnit)37 2456 y 750 2 v -89 2483 a fu(1)107 2499 y fp(Casais)d([31])e(similarly)18 b(observ)o(es)d(tha\ -t)f(renamings)i(and)f(other)g(attribute)g(re\014nemen)o(ts)g(are)g(sometimes) -g(needed)g(b)q(efore)37 2545 y(functions)g(and)f(v)n(ariables)h(are)e(migrate\ -d)h(to)f(an)h(abstract)f(sup)q(erclass.)952 2760 y fl(56)g eop bop 96 0 a - 27759903 25589105 5788794 19602964 33548697 45192069 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Helvetica-Bold Courier-Bold -%%Pages: 1 -%%BoundingBox: 88 298 510 687 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 0 58.5542 ] concat - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -23.8554 0 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 485 707 ] concat -%I -[ -(AFTER:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 477.084 153.313 ] concat -%I -158 461 158 461 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 437.084 685.313 ] concat -%I -[ -(Inode) -() -( Protected:) -() -( virtual int getDirect\(\)) -( virtual void setDirect\(..\)) -( int mapUnit\(...\) {) -( *) -( index = getDirect\(\)) -( *) -( setDirect\(index\)) -( * }) -() -(BSDInode \(and SystemVInode\)) -() -( Protected:) -() -( int getDirect\(\) {...}) -( void setDirect\(..\) {...}) -() -] Text -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 341.843 797.072 ] concat -%I -[ -(Inode) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.707107 -0.707107 0.707107 0.707107 -208.265 465.137 ] concat -%I -167 613 167 575 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 290.843 747.072 ] concat -%I -[ -(BSDInode) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ -0.733281 -0.679925 0.679926 -0.733281 121.425 1314.19 ] concat -%I -167 613 167 575 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 376.843 747.072 ] concat -%I -[ -(SystemVInode) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 190.843 168.072 ] concat -%I -46 633 46 633 Line -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 13.0121 -1.08432 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 141 709 ] concat -%I -[ -(BEFORE:) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 100.253 686.145 ] concat -%I -[ -(BSDInode) -() -( Protected:) -() -( int mapUnit\(...\) {) -( *) -( code to get) -( physical block #) -( \(BSD specific\)) -( *) -( code to set) -( physical block #) -( \(BSD specific\)) -( * } ) -() -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 98.4096 507.554 ] concat -%I -[ -(SystemVInode) -() -( Protected:) -() -( int mapUnit\(...\) {) -( *) -( code to get) -( physical block #) -( \(SystemV specific\)) -( *) -( code to set) -( physical block #) -( \(SystemV specific\)) -( * } ) -() -() -] Text -End - -End %I eop - -End %I eop - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 492 1749 a fh(Figure)18 b(6.1)p fl(:)i(Refactoring)15 b(The)g -(F)l(unction)i fi(mapUnit)37 1882 y fl(function,)e(the)f(di\013ering)g(co)q -(de)g(w)o(as)f(replaced)i(b)o(y)e(calls)i(to)e(these)h(functions.)20 b(Once) -14 b(the)g(de\014nitions)h(of)e(the)37 1939 y fi(mapUnit)j fl(function)g(in)g -(b)q(oth)f(sub)q(classes)h(matc)o(hed,)f(the)g(function)h(w)o(as)f(mo)o(v)o -(ed)g(to)f(the)h(sup)q(erclass.)108 1995 y(In)h(general,)g(the)f(pro)q(cess)h -(of)e(de\014ning)j(an)f(abstract)e(sup)q(erclass)i(\014rst)f(in)o(v)o(olv)o -(es)h(creating)g(a)f(new)g(class)37 2052 y(and)h(mo)o(ving)g(the)g(t)o(w)o -(o)e(existing)j(classes)f(under)h(it.)k(Then,)16 b(capturing)g(the)g(common)g -(abstraction)f(in)h(the)37 2108 y(sup)q(erclass)h(is)e(an)h(iterativ)o(e)f -(pro)q(cess)g(that)g(ma)o(y)f(in)o(v)o(olv)o(e)i(the)g(follo)o(wing)f(steps:) -106 2214 y fj(\017)22 b fl(making)15 b(function)i(signatures)e(compatible)h -(in)g(b)q(oth)f(sub)q(classes)106 2308 y fj(\017)22 b fl(adding)16 b(function) -g(signatures)f(to)g(the)g(sup)q(erclass)i(proto)q(col)106 2402 y fj(\017)22 b -fl(making)16 b(functions)g(b)q(o)q(dies)g(\(and)g(the)f(v)m(ariables)i(refere\ -nced)f(b)o(y)f(them\))g(compatible)h(in)g(b)q(oth)g(sub-)151 2458 y(classes) -106 2552 y fj(\017)22 b fl(migrating)15 b(common)g(co)q(de)h(and)f(v)m(ariabl\ -es)i(to)d(the)i(sup)q(erclass.)952 2760 y(57)g eop bop 108 42 a fl(Eac)o(h)13 -b(of)g(these)h(steps)f(is)h(describ)q(ed)h(in)f(this)g(c)o(hapter.)19 b(The) -13 b(c)o(hapter)h(closes)f(with)h(a)f(discussion)i(of)e(ho)o(w)37 98 y(in)o -(teraction)j(with)g(the)f(designer)h(migh)o(t)f(b)q(e)h(reduced,)g(and)f(othe\ -r)g(issues.)108 154 y(Casais)k([31)o(])f(deals)i(with)f(sev)o(eral)g(of)g(the) -g(issues)h(discussed)g(in)g(this)f(c)o(hapter:)28 b(renamings,)19 b(re\014nin\ -g)37 211 y(function)d(signatures)f(and)g(v)m(ariable)h(attributes,)e(and)h -(mo)o(ving)f(mem)o(b)q(ers.)20 b(One)15 b(imp)q(ortan)o(t)f(step)h(de\014ned) -37 267 y(here)i(that)e(is)h(not)f(addressed)h(b)o(y)g(Casais)f([31)o(])g(is)i -(ho)o(w)e(to)g(separate)g(out)g(the)h(di\013erences)h(b)q(et)o(w)o(een)f(corr\ -e-)37 324 y(sp)q(onding)h(functions)g(de\014ned)g(in)f(b)q(oth)g(sub)q(classe\ -s,)g(making)g(them)g(matc)o(h,)e(b)q(efore)i(migrating)g(common)37 380 y(co)q -(de)i(to)f(the)g(sup)q(erclass.)26 b(That)17 b(step)g(closely)h(relates)f(wit\ -h)g(the)h(other)e(steps)h(de\014ned)i(in)f(this)f(c)o(hapter.)37 437 y(There) -22 b(are)e(other)h(w)o(a)o(ys)f(in)i(whic)o(h)g(this)f(w)o(ork)f(is)i(di\013e\ -ren)o(t)f(from)f([31)o(]:)32 b(it)21 b(pro)o(vides)g(some)g(heuristics)37 493 -y(for)c(detecting)i(structural)e(similarities,)j(includes)g(access)e(con)o -(trol)f(mo)q(de)h(as)f(an)h(attribute)f(that)g(can)h(b)q(e)37 550 y(re\014ned\ -,)e(and)g(discusses)g(some)f(of)g(the)g(tradeo\013s)f(in)o(v)o(olving)i(user/\ -to)q(ol)f(in)o(teraction.)108 606 y(Before)c(a)f(function)h(signature)g(or)f -(v)m(ariable)i(can)f(b)q(e)g(added)h(to)e(the)g(sup)q(erclass,)j(it)d(m)o(ust) -h(\014rst)f(b)q(e)h(de\014ned)37 663 y(compatibly)i(in)g(the)f(sub)q(classes.) -20 b(Compatibilit)o(y)13 b(is)f(de\014ned)h(di\013eren)o(tly)g(for)e(the)h -(v)m(arious)g(ob)s(ject-orien)o(ted)37 719 y(languages)k(and)f(programming)g -(st)o(yles.)20 b(The)15 b(refactorings)g(de\014ned)h(in)g(this)g(c)o(hapter)f -(require)h(that:)106 803 y fj(\017)22 b fl(for)d(function)h(signatures)f(to)g -(b)q(e)g(compatible)i(the)e(names,)h(argumen)o(t)e(t)o(yp)q(es,)i(return)f -(t)o(yp)q(es)g(and)151 860 y(access)c(con)o(trol)g(mo)q(des)h(m)o(ust)e(matc) -o(h)106 950 y fj(\017)22 b fl(for)13 b(v)m(ariables)h(to)f(b)q(e)h(compatible) -g(the)g(names,)f(t)o(yp)q(es)g(and)g(\(for)g(mem)o(b)q(er)g(v)m(ariables\))h -(access)g(con)o(trol)151 1006 y(mo)q(des)i(m)o(ust)e(matc)o(h.)108 1090 y(F)l -(or)e(eac)o(h)h(of)g(the)f(refactorings)h(describ)q(ed)i(in)e(this)g(and)g -(the)g(follo)o(wing)h(t)o(w)o(o)d(c)o(hapters,)i(the)g(description)37 1147 y -(of)22 b(the)h(refactoring)f(is)g(follo)o(w)o(ed)h(b)o(y)f(sections)h(that)f -(detail)h(its)g(preconditions)g(and)g(argue)f(that)f(it)i(is)37 1203 y(b)q -(eha)o(vior)18 b(preserving.)26 b(As)17 b(with)g(the)g(lo)o(w-lev)o(el)i(refa\ -ctorings)d(de\014ned)j(in)f(the)f(previous)g(c)o(hapter,)g(these)37 1259 y -(sections)e(\(included)h(for)d(completeness\))h(pro)o(vide)g(a)g(lev)o(el)h -(of)e(detail)h(b)q(ey)o(ond)h(what)e(ma)o(y)g(b)q(e)h(of)f(in)o(terest)h(to) -37 1316 y(some)h(readers.)20 b(These)c(sections)f(can)h(b)q(e)g(skipp)q(ed)h -(without)e(missing)h(the)f(in)o(ten)o(t)g(of)g(the)g(refactorings.)37 1457 y -fd(6.1)70 b(Creating)22 b(a)i(Common)e(Sup)r(erclass)37 1559 y fl(The)15 b -(\014rst)e(imp)q(ortan)o(t)h(step)g(in)h(this)f(pro)q(cess)h(\(b)q(efore)f -(dealing)h(with)f(function)h(signatures,)f(common)g(co)q(de)37 1615 y(and)i -(v)m(ariables\))g(is)f(to)f(create)h(the)g(new)g(abstract)f(sup)q(erclass.)21 -b(It)15 b(is)h(assumed)f(here)g(that)f(the)h(t)o(w)o(o)f(classes)37 1672 y -(that)j(share)g(a)g(common)g(abstraction)g(ha)o(v)o(e)g(already)h(b)q(een)g -(selected)h(b)o(y)e(the)g(designer)1580 1655 y fs(2)1618 1672 y fl(and)h(are) -f fi(sibling)37 1728 y fl(classes;)e(that)e(is,)h(they)g(either)g(share)g(a)f -(common)h(direct)g(sup)q(erclass)h(or)e(eac)o(h)h(class)g(is)g(the)g(top)f -(most)g(class)37 1785 y(in)h(its)f(inheritance)h(hierarc)o(h)o(y)l(.)20 b(If) -13 b(the)g(t)o(w)o(o)e(classes)i(are)g(not)f(sibling)j(classes,)e(the)g fi -(move)s 14 2 v 14 w(class)e fl(refactoring,)37 1841 y(describ)q(ed)18 b(in)e -(c)o(hapter)f(\014v)o(e,)g(can)g(b)q(e)h(applied)h(to)d(mo)o(v)o(e)h(one)g -(or)g(b)q(oth)g(of)g(the)g(classes.)37 1934 y(The)h(argumen)o(ts)e(to)h(this) -g(refactoring)g(are:)106 2026 y fj(\017)22 b fl(string)15 b(absSup)q(erclassN\ -ame)106 2116 y fj(\017)22 b fl(class)16 b(C1,)e(C2.)37 2209 y(After)h(c)o(hec) -o(king)h(its)g(preconditions,)g(this)g(refactoring:)93 2302 y(1.)22 b(calls)d -(the)e(create)s 14 2 v 13 w(empt)o(y)s 14 2 v 14 w(class)g(refactoring)g(to)g -(create)h(the)f(new)h(sup)q(erclass,)h(as)e(a)g(sibling)i(of)e(the)151 2358 y -(t)o(w)o(o)d(curren)o(t)h(classes.)93 2448 y(2.)22 b(calls)16 b(the)g(mo)o -(v)o(e)s 14 2 v 12 w(class)g(refactoring)f(to)f(mo)o(v)o(e)h(the)g(t)o(w)o -(o)f(classes)h(under)h(it.)37 2522 y 750 2 v 89 2548 a fu(2)107 2564 y fp(Sec\ -tion)e(6.8.2)e(discusses)j(issues)f(in)o(v)o(olv)o(ed)h(in)e(automatically)j -(selecting)e(t)o(w)o(o)f(classes)h(with)f(common)g(attributes)h(from)e(a)37 -2610 y(set)h(of)g(classes.)952 2760 y fl(58)g eop bop 37 42 a fe(6.1.1)56 b -(Preconditions)37 127 y fl(The)16 b(preconditions)h(for)d(this)i(refactoring) -f(are:)93 220 y(1.)22 b fj(8)16 b fl(class)f fj(2)h fl(Program.classes,)226 -277 y(class.name)f fj(6)p fl(=)h(absSup)q(erclassName.)151 333 y(\(absSup)q -(erclassName)g(do)q(es)g(not)f(clash)g(with)h(the)f(name)g(of)g(an)g(existing) -i(class\))93 423 y(2.)22 b(C1.sup)q(erclass)16 b(=)f(C2.sup)q(erclass)151 480 -y(\(the)g(t)o(w)o(o)f(classes)i(share)f(a)g(common)f(sup)q(erclass\).)37 600 y -fe(6.1.2)56 b(Beha)n(vior)18 b(Preserv)m(ation)37 685 y fl(F)l(or)13 b(create) -s 14 2 v 13 w(empt)o(y)s 14 2 v 13 w(class,)g(precondition)i(1)d(\(the)h(name) -g(of)f(the)h(new)g(class)g(do)q(esn't)g(clash)g(with)g(an)g(already)37 742 y -(existing)k(class\))e(is)h(satis\014ed)f(b)o(y)h(precondition)g(1)f(of)g(this) -h(refactoring.)108 798 y(F)l(or)h(mo)o(v)o(e)s 14 2 v 13 w(class:)26 b(The)18 -b(preconditions)i(are)e(satis\014ed)g(b)q(ecause)h(after)e(the)i(mo)o(v)o(e)e -(classes)h(S1)g(and)h(S2)37 855 y(will)f(inherited)f(the)f(same)f(mem)o(b)q -(ers)h(as)f(b)q(efore)h(\(satisfying)f(precondition)j(1\),)c(no)i(mem)o(b)q -(ers)f(need)i(to)e(b)q(e)37 911 y(lo)q(cally)j(added)e(to)f(the)g(classes)h -(\(satisfying)g(precondition)h(2\))e(and)h(the)f(sup)q(erclasses)i(\(sub)q -(classes\))f(of)f(C1)37 968 y(and)g(C2)e(prior)h(to)g(the)g(refactoring)f(wil\ -l)j(con)o(tin)o(ue)f(to)e(b)q(e)i(sup)q(erclasses)g(\(sub)q(classes\))f(of)g -(C1)g(and)g(C2)f(after)37 1024 y(the)j(refactoring)f(\(satisfying)g(precondit\ -ion)i(3\).)108 1081 y(This)f(refactoring)f(is)g(constructed)h(using)g(b)q(eha) -o(vior)g(preserving)g(refactorings)e(and,)h(since)i(it)e(satis\014es)37 1137 y -(the)h(preconditions)g(of)f(those)g(refactorings,)g(b)q(eha)o(vior)g(is)h(pre\ -serv)o(ed.)37 1278 y fd(6.2)70 b(Making)24 b(F)-6 b(unction)22 b(Signatures)h -(Compatible)37 1380 y fl(F)l(unctions)d(b)q(elong)g(in)g(the)f(sup)q(erclass) -h(proto)q(col)f(if)g(they)g(are)f(part)h(of)f(the)h(common)g(abstraction)f -(rep-)37 1436 y(resen)o(ted)g(b)o(y)f(the)g(sup)q(erclass.)26 b(As)17 b(noted) -g(in)h(c)o(hapter)f(one,)g(determining)h(the)f(correct)g(abstraction)f(is)i -(a)37 1493 y(design)f(decision)g(that)e(cannot)g(b)q(e)h(en)o(tirely)g(automa\ -ted.)k(Heuristics)d(\(suc)o(h)e(as)g(those)g(listed)i(b)q(elo)o(w\))e(can)37 -1549 y(detect)h(similarities)h(b)q(et)o(w)o(een)f(classes,)f(but)g(they)h(are) -f(not)f(fo)q(olpro)q(of.)108 1606 y(Tw)o(o)f(sub)q(classes)j(sharing)e(a)g -(common)g(abstraction)g(ma)o(y)g(ha)o(v)o(e)f(mem)o(b)q(er)i(functions)g(that) -e(are)h(similar)37 1662 y(but)i(not)f(exactly)h(the)f(same.)20 b(This)c(migh) -o(t)g(b)q(e)g(exp)q(ected)g(esp)q(ecially)i(if)e(the)g(t)o(w)o(o)e(classes)i -(w)o(ere)f(dev)o(elop)q(ed)37 1719 y(indep)q(endently)k(of)d(eac)o(h)g(other.) -23 b(The)16 b(name)h(of)e(the)i(function)g(in)g(one)f(class)h(ma)o(y)f(b)q -(e)h(a)f(synon)o(ym)g(of)f(the)37 1775 y(function)g(de\014ned)g(in)g(the)f -(other)f(class.)20 b(Or,)13 b(the)h(functions)h(ma)o(y)e(ha)o(v)o(e)g(the)h -(same)f(names,)h(but)g(the)g(return)37 1831 y(t)o(yp)q(es)20 b(or)g(function) -g(argumen)o(ts)f(ma)o(y)g(b)q(e)i(sligh)o(tly)g(di\013eren)o(t.)33 b(In)21 b -(these)f(cases,)g(the)g(signatures)g(of)f(the)37 1888 y(mem)o(b)q(er)d(functi\ -ons)g(in)g(the)f(sub)q(classes)i(need)f(to)e(b)q(e)i(c)o(hanged)g(b)q(efore)f -(they)g(matc)o(h)g(with)g(eac)o(h)h(other.)108 1944 y(This)g(do)q(es)g(not)f -(imply)l(,)h(ho)o(w)o(ev)o(er,)e(that)h(detecting)h(common)f(abstractions)g -(m)o(ust)g(b)q(e)h(left)g(en)o(tirely)g(to)37 2001 y(the)k(user.)31 b(It)20 b -(is)f(p)q(ossible)i(to)e(automatically)g(infer)h(design)g(similarities)h(from) -e(structural)g(similarities,)37 2057 y(p)q(erform)13 b(some)g(primitiv)o(e)h -(refactorings)e(that)g(mak)o(e)h(the)g(functions)g(more)g(structurally)g(simi\ -lar,)h(and)f(add)37 2114 y(all)k(p)q(ossible)g(matc)o(hes)e(to)g(the)h(proto) -q(col)f(of)h(the)f(abstract)g(class.)21 b(There)16 b(are)f(at)g(least)h(t)o -(w)o(o)e(shortcomings)37 2170 y(to)h(carrying)g(automated)g(supp)q(ort)g(to)f -(this)i(extreme:)93 2254 y(1.)22 b(A)11 b(to)q(ol)g(migh)o(t)g(detect)g(and)g -(act)g(up)q(on)g(structural)g(matc)o(hes)g(that)f(do)h(not)f(corresp)q(ond)i -(to)e(meaningful)151 2311 y(common)17 b(abstractions.)24 b(The)17 b(v)o(o)q -(cabulary)g(used)g(to)f(name)h(classes)g(and)g(class)h(mem)o(b)q(ers)e(is)i -(often)151 2367 y(am)o(biguous.)h(T)l(erms)12 b(suc)o(h)h(as)f(length,)h(size\ -,)h(age,)e(and)h(brigh)o(tness)f(can)h(ha)o(v)o(e)f(di\013eren)o(t)h(meanings) -g(in)151 2424 y(di\013eren)o(t)g(classes,)g(and)g(v)m(ariables)i(with)e(these) -g(names)f(ma)o(y)g(not)h(b)q(elong)g(in)h(a)f(common)f(abstraction)151 2480 y -(ev)o(en)k(though)f(they)g(are)g(de\014ned)h(in)g(b)q(oth)g(classes.)151 2554 -y(If)11 b(the)g(t)o(w)o(o)e(classes)i(that)f(share)h(a)f(common)g(abstraction) -h(w)o(ere)f(dev)o(elop)q(ed)i(indep)q(enden)o(tly)m(,)i(common)151 2610 y(mem) -o(b)q(ers)c(ma)o(y)g(ha)o(v)o(e)g(di\013eren)o(t)g(names.)18 b(This)11 b(sugg\ -ests)e(c)o(hec)o(king)j(for)d(matc)o(hes)h(on)g(attributes)g(other)952 2760 y -(59)g eop bop 151 42 a fl(than)19 b(name.)29 b(Unfortunately)l(,)20 b(mem)o -(b)q(ers)e(with)h(similar)h(attributes)e(need)i(not)e(represen)o(t)g(similar) -151 98 y(abstractions.)i(F)l(or)15 b(example,)h(supp)q(ose)h(an)e(abstract)f -(class)i ff(V)o(ehicle)h fl(is)f(created)f(from)g(the)g(existing)151 154 y -(classes)j ff(Automobile)e fl(and)h ff(Subma)o(rine)p fl(.)24 b(Supp)q(ose)19 -b(that)e(eac)o(h)g(class)h(con)o(tained)g(a)f(function)h(with)g(a)151 211 y -(single,)d(in)o(teger)f(argumen)o(t.)k(These)c(functions)g(are)f(structurally) -h(similar,)h(and)f(an)f(automated)f(to)q(ol)151 267 y(could)j(detect)f(this)g -(similarit)o(y)l(,)h(rename)f(one)g(of)f(the)h(functions)g(and)g(de\014ne)h -(a)f(common)f(function)i(in)151 324 y(the)e(sup)q(erclass.)20 b(But,)13 b(sup\ -p)q(ose)g(that)f(in)i(the)f ff(Automobile)d fl(class,)k(the)e(function)i(is)f -(called)h fi(changeOil)151 380 y fl(whose)e(argumen)o(t)g(is)g(the)h(n)o(um)o -(b)q(er)f(of)g(quarts)g(of)g(oil)h(needed;)h(in)f(the)f ff(Subma)o(rine)e fl -(class,)j(the)g(function)151 437 y(is)20 b(called)h fi(submer)n(ge)d fl(whose) -i(argumen)o(t)e(is)i(the)f(depth)h(to)e(whic)o(h)i(to)f(descend.)33 b(These) -20 b(functions)151 493 y(clearly)12 b(don't)f(share)g(a)g(common)g(abstractio\ -n,)g(but)h(automatically)f(matc)o(hing)g(on)h(attributes)f(w)o(on't)151 550 y -(detect)16 b(this.)93 643 y(2.)22 b(Some)c(of)f(the)h(structural)f(matc)o(hes) -g(ma)o(y)g(collide)j(with)e(other)f(matc)o(hes.)27 b(Supp)q(ose)19 b(a)e(func\ -tion)i(in)151 700 y(one)d(class)g(ma)o(y)e(ha)o(v)o(e)i(a)f(return)g(t)o(yp)q -(e)h(and)f(argumen)o(t)g(t)o(yp)q(es)h(that)f(matc)o(h)f(t)o(w)o(o)h(or)g(mor\ -e)g(functions)151 756 y(in)j(the)f(other)g(class,)h(all)g(with)f(di\013eren)o -(t)h(names.)25 b(In)18 b(this)g(case,)f(it)g(is)h(not)f(clear)h(whic)o(h)g -(of)e(sev)o(eral)151 813 y(matc)o(hes)j(should)h(b)q(e)g(added)g(to)f(the)g -(sup)q(erclass.)33 b(This)20 b(implies)i(that,)d(b)q(efore)g(selecting)i(amon\ -g)151 869 y(these)16 b(p)q(ossible)h(matc)o(hes,)d(it)h(is)h(necessary)f(to)g -(c)o(hec)o(k)g(ho)o(w)g(these)h(functions)g(are)e(used.)108 963 y(Th)o(us,)23 -b(automating)e(the)h(detection)h(of)e(a)h(common)g(abstraction)f(is)h(p)q(oss\ -ible)i(but)e(has)g(its)g(short-)37 1020 y(comings.)i(These)16 b(factors)g(sug\ -gest)f(a)h(middle)i(ground,)e(where)h(a)f(refactoring)g(to)q(ol)g(displa)o -(ys)h(alternativ)o(e)37 1076 y(refactorings)e(and)h(lets)f(the)g(user)h(selec\ -t)g(the)f(one)g(to)g(p)q(erform,)g(as)f(sho)o(wn)h(in)h(Figure)g(6.2.)108 1132 -y(In)g(a)g(m)o(ulti-windo)o(w)h(displa)o(y)g(presen)o(ted)f(to)f(the)h(user,) -g(a)f(refactoring)h(to)q(ol)f(could)i(list)g(the)f(functions)37 1189 y(in)j -(the)e(sup)q(erclass)h(proto)q(col,)f(and)h(list)g(the)f(functions)h(de\014ne\ -d)h(in)f(eac)o(h)f(sub)q(class.)27 b(In)18 b(this)g(example,)g(a)37 1245 y -(function)e(is)f(de\014ned)h(in)g(b)q(oth)e(the)h ff(Automobile)e fl(and)i ff -(Subma)o(rine)d fl(classes)k(for)e(redirecting)i(the)e(v)o(ehicle.)22 b(In)37 -1302 y(one)16 b(class,)g(the)g(function)g(is)h(called)g fi(shiftDir)n(e)n(cti\ -on)e fl(while)i(in)f(the)g(other)f(class)i(it)e(is)i(called)g fi(r)n(e)n(dir) -n(e)n(ct)p fl(.)j(The)37 1358 y(argumen)o(ts)15 b(to)f(the)i(t)o(w)o(o)e(func\ -tions)h(are)g(the)h(same,)e(but)i(are)e(in)i(in)o(v)o(erted)g(order.)108 1415 -y(The)k(refactoring)g(to)q(ol)g(could)i(generate)d(its)i(set)f(of)g(suggested) -g(c)o(hanges)g(based)g(on)g(the)h(structural)37 1471 y(similarities)c(it)d -(detects)g(b)q(et)o(w)o(een)h(the)f(classes.)20 b(The)14 b(to)q(ol)g(could)h -(suggest)f(renaming)g(the)g(function)h(in)g(one)37 1528 y(of)g(the)f(classes) -h(and)g(reordering)g(the)f(argumen)o(ts)g(of)g(one)h(function.)20 b(Once)c -(these)e(c)o(hanges)h(are)f(made,)g(the)37 1584 y(signatures)20 b(will)h(b)q -(e)e(iden)o(tical)i(and)f(the)f(signature)g(can)h(b)q(e)g(added)f(to)g(the)g -(sup)q(erclass)h(proto)q(col.)32 b(The)37 1641 y(to)q(ol)17 b(could)h(suggest) -d(p)q(ossible)k(re\014nemen)o(ts)e(in)g(the)g(lo)o(w)o(est)f(windo)o(w.)24 b -(F)l(or)15 b(example,)j(in)f(comparing)g(t)o(w)o(o)37 1697 y(functions)d(in)g -(di\013eren)o(t)f(classes,)g(the)g(return)g(t)o(yp)q(es)g(and)g(argumen)o(ts) -f(ma)o(y)g(b)q(e)h(the)g(same)g(but)g(the)g(function)37 1753 y(names)21 b(ma) -o(y)e(b)q(e)i(di\013eren)o(t;)h(the)f(to)q(ol)f(w)o(ould)g(suggest)g(renaming) -h(one)f(function)h(to)e(matc)o(h)h(the)g(other.)37 1810 y(Belo)o(w)14 b(is)g -(a)f(set)g(of)f(heuristics)j(that)d(can)i(detect)f(some)g(structural)g(simila\ -rities)j(and)d(suggest)f(re\014nemen)o(ts.)37 1866 y(F)l(or)18 b(example,)i -(heuristic)g(2)f(detects)f(the)h(case)g(where)f(the)h(a)f(function)i(in)f(one) -g(sub)q(class)h(has)e(the)h(same)37 1923 y(argumen)o(ts)12 b(and)h(return)g -(t)o(yp)q(es,)g(as)f(a)h(function)g(\(with)g(a)f(di\013eren)o(t)h(name\))g -(de\014ned)h(in)g(the)e(other)h(sub)q(class.)37 1979 y(These)j(structural)f -(similarities)j(suggest)c(that)h(the)g(t)o(w)o(o)f(functions)108 2036 y(These) -e(heuristics)h(can)f(b)q(e)g(applied,)i(rep)q(eatedly)l(,)f(to)e(iterativ)o -(ely)h(deriv)o(e)h(a)e(sup)q(erclass)i(proto)q(col.)18 b(First,)37 2092 y(the) -d(most)f(ob)o(vious)g(case)h(is)g(c)o(hec)o(k)o(ed,)g(where)g(a)f(function)h -(is)g(iden)o(tically)i(de\014ned)f(in)f(b)q(oth)g(classes.)20 b(When)37 2149 y -(this)c(o)q(ccurs,)g(the)g(heuristic)h(suggests)d(adding)j(the)e(function)i -(signature)e(to)g(the)h(sup)q(erclass)g(proto)q(col.)21 b(In)37 2205 y(other) -14 b(cases,)g(the)g(attributes)g(of)g(a)g(function)g(in)h(one)g(class)f(will) -i(b)q(e)f(similar)g(to)e(but)h(not)g(exactly)h(the)f(same)37 2262 y(as)h(an)f -(equiv)m(alen)o(t)i(function)f(in)g(the)g(other)f(class.)20 b(The)15 b(other) -f(heuristics)h(b)q(elo)o(w)g(handle)h(renaming)f(\(2-4\),)37 2318 y(ret)o(ypi\ -ng)k(\(5-6\),)g(reordering)g(argumen)o(ts)f(\(7\))f(and)i(c)o(hanging)g(acces\ -s)g(con)o(trol)g(mo)q(de)g(\(8\),)f(to)g(mak)o(e)g(the)37 2374 y(signatures)e -(of)f(equiv)m(alen)o(t)h(functions)g(matc)o(h)839 2358 y fs(3)859 2374 y fl -(:)37 2522 y 750 2 v 89 2548 a fu(3)107 2564 y fp(The)11 b(action)i(clauses)g -(of)e(most)g(heuristics)j(suggest)e(applying)j(a)c(primitiv)o(e)j(refactoring\ -,)f(describ)q(ed)g(in)f(c)o(hapter)h(\014v)o(e.)j(The)37 2610 y(precondition) -q(s)g(of)c(those)i(refactorings)g(are)f(somewhat)h(more)f(complex)h(than)g -(the)f(preconditions)j(sho)o(wn)e(here.)952 2760 y fl(60)g eop bop 133 0 a - 26575831 26575831 5065195 15656058 31641026 42231889 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Times-Roman Helvetica -%%Pages: 1 -%%BoundingBox: 77 238 481 642 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.86747 0 0 0.86747 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -136 163 542 550 Rect -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 210 639 ] concat -%I -[ -(PROTOCOL FOR SUPERCLASS: VEHICLE) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -27 189 ] concat -%I -239 435 508 435 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 261 608 ] concat -%I -[ -(int refuel\(int capacity\)) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 62 -3 ] concat - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 176.5 327 ] concat -%I -162 522 7 5 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 177 313.5 ] concat -%I -162 522 7 5 Elli -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 151 504 ] concat -%I -[ -(SUBCLASS: AUTOMOBILE) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -87 55 ] concat -%I -239 435 416 435 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 155 478 ] concat -%I -[ -(void shiftDirection) -( \(direction newDirection,) -( int newSpeed\)) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -34 -161 ] concat - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 176.5 327 ] concat -%I -162 522 7 5 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 177 313.5 ] concat -%I -162 522 7 5 Elli -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 361 503 ] concat -%I -[ -(SUBCLASS: SUBMARINE) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 124 58 ] concat -%I -238 431 405 431 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 368 478 ] concat -%I -[ -(void redirect\(int newSpeed,) -( direction newDirection\)) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 0.999969 -19 ] concat - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 339.5 191 ] concat -%I -162 522 7 5 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 340 177.5 ] concat -%I -162 522 7 5 Elli -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 191 376 ] concat -%I -[ -(POSSIBLE REFINEMENTS:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -47 -71.9999 ] concat -%I -239 435 407 435 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 194 353 ] concat -%I -[ -(in subclass automobile, consider changing the name of function ) -( shiftDirection to redirect) -(in subclass submarine, consider reordering the arguments of) -( the function redirect) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 61 -288 ] concat - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 176.5 327 ] concat -%I -162 522 7 5 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 177 313.5 ] concat -%I -162 522 7 5 Elli -End - -End %I eop - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -6 156.5 ] concat -%I -144 369 547 369 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 0 160.5 ] concat -%I -342 363 342 229 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -2.99998 18.5 ] concat -%I -144 369 547 369 Line -End - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -89 626 90 626 Rect -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 518 1811 a fh(Figure)17 b(6.2)p fl(:)j(De\014ning)c(the)f(Sup) -q(erclass)i(Proto)q(col)133 1945 y fg(1.)24 b(if)71 b(function)23 b(F1)g(is)h -(defined)f(in)g(class)g(A)324 2001 y(function)g(F1)g(is)h(defined)f(in)g(clas\ -s)g(B)324 2058 y(the)g(functions)g(have)g(the)h(same)f(access)g(control)g(mod\ -e,)g(return)g(type,)g(and)372 2114 y(arguments)f(with)i(the)f(same)g(names)g -(and)h(types)205 2170 y(then)f(consider)g(adding)g(function)f(F1)i(to)g(the)f -(superclass)g(protocol)252 2227 y(\(using)g(the)h(refactoring)e(defined)h(in) -h(section)f(6.3\).)133 2340 y(2.)h(if)71 b(function)23 b(F1)g(is)h(defined)f -(in)g(class)g(A)324 2396 y(function)g(F1)g(is)h(not)f(defined)g(in)h(class)f -(B)324 2453 y(function)g(F2)g(is)h(defined)f(in)g(class)g(B)324 2509 y(functi\ -on)g(F2)g(is)h(not)f(defined)g(in)h(class)f(A)324 2566 y(functions)f(F1)i(and) -g(F2)f(have)g(arguments)g(with)g(the)h(same)f(names)g(and)952 2760 y fl(61)g -eop bop 372 42 a fg(types,)23 b(and)g(have)g(the)h(same)f(return)g(type)205 98 -y(then)g(consider)g(renaming)f(function)h(F2)h(in)f(class)h(B)f(to)h(F1)252 -154 y(\(using)f(the)h(refactoring)e(change_member_function_name)o(\).)133 267 -y(3.)i(if)71 b(function)23 b(F1)g(is)h(defined)f(in)g(class)g(A)324 324 y(fun\ -ction)g(F1)g(is)h(not)f(defined)g(in)h(class)f(B)324 380 y(function)g(F2)g -(is)h(defined)f(in)g(class)g(B)324 437 y(function)g(F2)g(is)h(not)f(defined)g -(in)h(class)f(A)324 493 y(the)g(arguments)g(in)h(function)e(F2)i(of)f(class)h -(B)f(can)h(be)f(arranged)g(such)372 550 y(that)g(the)g(corresponding)f(argume\ -nts)h(in)h(both)f(functions)g(have)372 606 y(types)g(that)g(are)h(the)f(same,) -g(parent/child)f(or)i(siblings)205 663 y(then)f(consider)g(renaming)f(functio\ -n)h(F2)h(in)f(class)h(B)f(to)h(F1)252 719 y(\(using)f(the)h(refactoring)e(cha\ -nge_member_function_name)o(\).)133 832 y(4.)i(if)71 b(function)23 b(F1)g(is)h -(defined)f(in)g(class)g(A)324 888 y(function)g(F1)g(is)h(defined)f(in)g(class) -g(B)324 945 y(the)g(types)g(of)h(their)f(corresponding)f(arguments)h(and)g -(return)g(value)372 1001 y(are)g(the)g(same.)205 1058 y(then)g(consider)g(cha\ -nging)f(\(as)i(needed\))f(the)g(argument)g(names)g(in)h(function)f(F1)252 1114 -y(of)h(class)f(B)h(to)f(match)h(the)f(argument)g(names)g(in)h(class)f(A,)252 -1171 y(\(using)g(the)h(refactoring)e(change_variable_name\).)133 1284 y(5.)i -(if)71 b(function)23 b(F1)g(is)h(defined)f(in)g(class)g(A)324 1340 y(function) -g(F1)g(is)h(defined)f(in)g(class)g(B)324 1396 y(a)h(type)f(of)g(an)h(argument) -f(\(or)g(return)g(value\))g(in)h(one)f(function)372 1453 y(is)g(the)h(subtype) -f(to)g(the)h(type)f(of)g(the)h(corresponding)e(argument)372 1509 y(\(or)h(ret\ -urn)g(value\))g(in)h(another)f(function)205 1566 y(then)g(consider)g(changing) -f(child-type)h(to)g(parent-type)252 1622 y(\(using)g(the)h(refactoring)e(chan\ -ge_type\).)133 1735 y(6.)i(if)71 b(function)23 b(F1)g(is)h(defined)f(in)g(cla\ -ss)g(A)324 1792 y(function)g(F1)g(is)h(defined)f(in)g(class)g(B)324 1848 y -(a)h(type)f(of)g(an)h(argument)f(\(or)g(return)g(value\))g(in)h(one)f(functio\ -n)372 1905 y(shares)g(a)g(common)g(supertype)g(with)g(the)h(type)f(of)h(the)f -(corresponding)372 1961 y(argument)f(\(or)i(return)f(value\))g(in)g(another)g -(function)205 2017 y(then)g(consider)g(changing)f(both)i(types)f(to)g(be)h -(their)f(common)g(ancestor)252 2074 y(\(using)g(the)h(refactoring)e(change_ty\ -pe\).)133 2187 y(7.)i(if)71 b(function)23 b(F1)g(is)h(defined)f(in)g(class)g -(A)324 2243 y(function)g(F1)g(is)h(defined)f(in)g(class)g(B)324 2300 y(the)g -(arguments)g(in)h(function)e(F1)i(of)f(class)h(B)f(can)h(be)f(arranged)g(such) -324 2356 y(that)g(the)h(corresponding)e(arguments)g(in)i(both)f(functions)g -(have)g(types)324 2413 y(that)g(are)h(the)f(same,)g(parent/child)f(or)i(sibli\ -ngs)205 2469 y(then)f(consider)g(reordering)f(the)i(arguments)e(of)i(F1)f(in) -h(class)f(B)252 2526 y(\(using)g(the)h(refactoring)e(reorder_function_argumen\ -ts\))o(.)952 2760 y fl(62)g eop bop 133 42 a fg(8.)24 b(if)71 b(function)23 b -(F1)g(is)h(defined)f(in)g(class)g(A)324 98 y(function)g(F1)g(is)h(defined)f -(in)g(class)g(B)324 154 y(their)g(access)g(control)g(modes)g(are)h(different) -205 211 y(then)f(consider)g(changing)f(the)i(least)f(permissive)g(mode)g(to)g -(match)252 267 y(the)h(most)f(permissive)g(mode,)252 324 y(\(using)g(the)h -(refactoring)e(change_access_control_mode\))o(.)108 430 y fl(Heuristics)c(suc) -o(h)e(as)g(these)h(could)g(b)q(e)h(applied)g(incremen)o(tally)g(to)e(mak)o -(e)g(the)g(functions)h(conform,)f(or)37 487 y(they)g(could)g(b)q(e)g(c)o(hain\ -ed)g(together)f(to)f(\014nd)i(all)g(p)q(ossible)h(matc)o(hes.)108 543 y(F)l -(or)c(eac)o(h)i(heuristic,)g(the)f(name)g(of)g(the)g(corresp)q(onding)h(refac\ -toring)e(is)i(sho)o(wn)e(in)i(paren)o(theses.)20 b(This)37 599 y(is)e(done)g -(here)g(to)e(mak)o(e)h(clear)h(the)f(relationships)i(b)q(et)o(w)o(een)f(the)f -(suggested)g(re\014nemen)o(ts)h(and)f(primitiv)o(e)37 656 y(refactorings.)28 b -(Ho)o(w)o(ev)o(er,)17 b(in)h(the)g(user)g(in)o(terface)g(\(sho)o(wn)f(in)i -(Figure)f(6.2\),)f(the)h(refactoring)f(names)h(are)37 712 y(not)g(displa)o -(y)o(ed.)29 b(Rather,)19 b(when)f(the)g(user)g(selects)h(an)f(attribute)f(to) -h(up)q(date)g(and)g(en)o(ters)g(a)f(new)i(v)m(alue,)37 769 y(the)j(corresp)q -(onding)g(refactoring)f(is)h(automatically)g(triggered.)38 b(Suc)o(h)23 b(an) -e(up)q(date)h(b)o(y)f(the)h(user)f(ma)o(y)37 825 y(b)q(e)h(in)g(resp)q(onse)g -(to)e(a)h(re\014nemen)o(t)g(suggested)g(b)o(y)g(the)g(to)q(ol,)h(or)e(migh)o -(t)h(b)q(e)h(a)f(re\014nemen)o(t)g(\(suc)o(h)g(as)g(a)37 882 y(renaming\))f -(based)f(on)g(the)g(user's)g(design)h(insigh)o(t.)32 b(Before)19 b(the)g(prim\ -itiv)o(e)h(refactoring)f(is)h(p)q(erformed,)37 938 y(whose)d(preconditions)h -(are)e(c)o(hec)o(k)o(ed.)25 b(If)17 b(the)g(c)o(hange)f(is)h(v)m(alid,)i(the) -d(refactoring)h(is)g(p)q(erformed,)g(and)f(the)37 995 y(user)22 b(displa)o -(y)h(is)f(up)q(dated.)40 b(When)22 b(the)g(function)h(signatures)e(matc)o(h,) -i(the)e(user)h(selects)h(to)e(add)g(the)37 1051 y(function)g(signature)e(to)g -(the)h(sup)q(erclass)h(proto)q(col,)f(in)g(whic)o(h)g(case)g(the)f(refactorin\ -g)h(describ)q(ed)h(in)f(the)37 1108 y(next)c(section)g(is)f(in)o(v)o(ok)o(ed.) -108 1164 y(These)f(heuristics)i(detect)e(similarities)i(based)e(on)f(a)h(smal\ -l)g(set)g(of)f(structural)h(attributes.)19 b(More)14 b(p)q(o)o(w-)37 1220 y -(erful)j(similarit)o(y)f(detection)h(is)f(p)q(ossible,)h(as)e(discussed)i(in) -f(the)g(arti\014cial)h(in)o(telligence)h(mac)o(hine)e(learning)37 1277 y(lite\ -rature)h(on)e(analogy-based)h(systems)g([28)o(,)f(39,)g(51)o(,)h(64)o(].)21 b -(Analogy-based)c(systems)e(ha)o(v)o(e)g(v)o(ery)h(limited)37 1333 y(p)q(o)o -(w)o(er)h(unless)i(their)f(analysis)g(is)g(based)g(on)f(a)g(w)o(ell-de\014ned) -j(domain)e(mo)q(del.)28 b(Suc)o(h)18 b(approac)o(hes)f(are)g(of)37 1390 y(dub\ -ious)j(v)m(alue)f(in)g(man)o(y)e(applications)j(of)e(refactoring,)g(where)g -(the)g(design)h(of)f(the)g(application)h(is)g(not)37 1446 y(w)o(ell)e(underst\ -o)q(o)q(d)e(and)h(is)g(ev)o(olving.)37 1589 y fd(6.3)70 b(Adding)23 b(F)-6 b -(unction)23 b(Signatures)g(to)g(the)f(Sup)r(erclass)h(Proto)r(col)37 1691 y fl -(Once)15 b(the)e(signature)h(of)f(a)g(function)h(in)g(b)q(oth)g(sub)q(classes) -g(matc)o(h,)f(the)h(function)g(signature)f(can)h(b)q(e)g(added)37 1747 y(to)d -(the)h(sup)q(erclass.)19 b(The)12 b(follo)o(wing)g(refactoring)f(adds)g(a)g -(function)h(signature)f(to)g(the)h(sup)q(erclass)g(proto)q(col.)37 1804 y(The) -k(argumen)o(ts)e(to)h(this)g(refactoring)g(are:)106 1910 y fj(\017)22 b fl -(the)15 b(mem)o(b)q(er)h(function)g(\(F1\))e(as)h(de\014ned)h(in)g(the)f(\014\ -rst)g(sub)q(class)h(\(C1\))106 2004 y fj(\017)22 b fl(the)15 b(mem)o(b)q(er)h -(function)g(\(F2\))e(as)h(de\014ned)h(in)g(the)f(second)h(sub)q(class)g(\(C2\ -\))37 2110 y(After)f(c)o(hec)o(king)h(its)g(preconditions,)g(this)g(refactori\ -ng:)93 2216 y(1.)22 b(calls)12 b(the)f(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 -2 v 13 w(function)h(refactoring)e(to)g(add)h(the)g(function)h(\(signature\))e -(as)g(a)h(protected)151 2273 y(mem)o(b)q(er)18 b(of)e(the)i(sup)q(erclass.)27 -b(The)17 b(function)i(is)e(de\014ned)i(as)e(virtual)h(in)g(the)f(sup)q(erclas\ -s)i(\(referred)151 2329 y(to)c(b)q(elo)o(w)g(as)g(`commonSup)q(erclass'\),)g -(allo)o(wing)h(it)g(to)e(b)q(e)i(\(re\)de\014ned)g(in)g(the)f(sub)q(classes.) -1748 2313 y fs(4)37 2413 y 750 2 v 89 2440 a fu(4)107 2456 y fp(In)j(C++,)h -(the)g(function)h(can)f(b)q(e)f(de\014ned)i(as)f(a)f(pure)h(virtual)i(functio\ -n)f(b)o(y)f(assigning)i(its)e(v)n(alue)h(to)e(b)q(e)h(`0')f(in)h(the)37 2501 y -(sup)q(erclass.)952 2760 y fl(63)g eop bop 37 42 a fe(6.3.1)56 b(Precondition\ -s)37 127 y fl(The)16 b(precondition)h(for)d(this)i(refactoring)f(is:)93 234 y -(1.)22 b fj(8)16 b fl(mem)o(b)q(er)f fj(2)g fl(commonSup)q(erclass.lo)q(cally\ -De\014ne)q(dMem)o(b)q(erF)l(uncti)q(ons,)226 290 y(mem)o(b)q(er.name)g fj(6)p -fl(=)h(F1.name.)151 347 y(\(the)f(mem)o(b)q(er)g(function)h(is)g(not)f(alread\ -y)g(lo)q(cally)i(de\014ned)g(in)f(the)f(common)g(sup)q(erclass\))93 440 y(2.) -22 b(matc)o(hingSignaturesP\(F1,)14 b(F2\))151 497 y(\(the)h(signatures)g(of) -g(the)g(mem)o(b)q(er)h(function)g(in)g(b)q(oth)f(sub)q(classes)i(matc)o(h\)) -37 618 y fe(6.3.2)56 b(Beha)n(vior)18 b(Preserv)m(ation)37 704 y fl(F)l(or)10 -b(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(function:)18 b(precondition) -12 b(1)e(\(the)g(mem)o(b)q(er)g(function)h(is)g(not)f(already)g(de\014ned)i -(lo)q(cally\))37 761 y(is)24 b(satis\014ed)f(b)o(y)g(precondition)h(1)e(of)h -(this)g(refactoring;)i(precondition)g(2)d(\(the)g(signature)h(is)h(iden)o(tic\ -al)37 817 y(to)19 b(that)g(of)g(an)o(y)g(inherited)j(function)e(with)g(the)g -(same)f(name\))g(is)h(satis\014ed)g(b)o(y)g(precondition)h(2)e(of)g(this)37 -874 y(refactoring)14 b(and)g(the)f fi(Comp)n(atible)i(Signatur)n(es)e(in)i -(Memb)n(er)f(F)m(unction)g(R)n(e)n(de\014nition)e fl(program)g(prop)q(ert)o -(y;)37 930 y(precondition)24 b(3)d(\(the)h(signatures)f(of)h(corresp)q(onding) -g(functions)h(in)f(sub)q(classes)h(are)f(iden)o(tical)h(to)e(the)37 987 y(sig\ -nature)d(b)q(eing)g(added)g(to)f(the)g(sup)q(erclass\))h(is)g(satis\014ed)g -(b)o(y)f(precondition)i(2)e(of)g(this)g(refactoring)g(and)37 1043 y(b)o(y)h -(construction;)i(precondition)f(4)f(\(if)g(there)g(is)g(an)g(inherited)i(func\ -tion)f(with)f(the)g(same)f(name,)i(either)37 1099 y(the)c(inherited)h(functio\ -n)f(is)f(unreferenced)i(on)e(instances)h(of)f(C)g(\(or)f(its)h(sub)q(classes\ -\),)h(or)f(the)g(new)h(function)37 1156 y(is)20 b(seman)o(tically)h(equiv)m -(alen)o(t)f(to)f(the)g(function)h(it)g(replaces\))g(is)f(satis\014ed)h(b)q -(ecause)g(there)f(are)g(no)g(name)37 1212 y(collisions)d(-)e(the)g(new)g(clas\ -s)g(has)g(no)g(lo)q(cal)g(functions)h(or)e(instances,)i(and)f(its)f(sub)q(cla\ -sses)i(already)f(o)o(v)o(erride)37 1269 y(the)g(function;)h(precondition)h -(5)d(\(regarding)h(references)g(in)h(the)f(function)h(b)q(o)q(dy\))f(is)g(sat\ -is\014ed)h(b)q(ecause)f(the)37 1325 y(function)j(signature)e(has)g(no)g(funct\ -ion)h(b)q(o)q(dy)l(.)108 1382 y(This)e(refactoring)f(is)h(constructed)g(using) -g(a)g(b)q(eha)o(vior)g(preserving)g(refactoring)f(and,)h(since)g(it)g(satis\ -\014es)37 1438 y(the)i(preconditions)g(of)f(that)g(refactorings,)f(b)q(eha)o -(vior)i(is)g(preserv)o(ed.)37 1581 y fd(6.4)70 b(Making)24 b(F)-6 b(unction) -22 b(Bo)r(dies)g(Compatible)37 1683 y fl(Often,)14 b(in)g(abstract)e(classes) -i(the)f(abstraction)g(is)h(represen)o(ted)g(not)f(only)g(b)o(y)h(the)f(functi\ -on)h(signatures)f(but)37 1739 y(also)k(b)o(y)f(the)g(implemen)o(tations)i(of) -d(some)h(functions.)24 b(Often)17 b(these)f(implemen)o(tations)i(are)e(only)g -(partial;)37 1796 y(that)f(is,)g(the)g(implemen)o(tations)h(include)h(calls)f -(to)e(other)h(functions)g(that)f(are)h(de\014ned)h(in)g(the)f(sub)q(classes.) -108 1852 y(As)j(in)g(the)f fi(mapunit)i fl(example,)f(the)g(function)g(b)q -(o)q(dies)h(in)f(the)g(sub)q(classes)h(ma)o(y)d(b)q(e)j(similar)f(but)g(not) -37 1909 y(iden)o(tical.)28 b(Before)18 b(the)f(function)h(b)q(o)q(dy)g(can)f -(b)q(e)h(migrated)f(to)g(the)g(sup)q(erclass,)i(di\013erences)f(need)g(to)f -(b)q(e)37 1965 y(separated)e(from)g(the)g(common)g(co)q(de.)108 2022 y(The)c -(approac)o(hes)g(for)f(detecting)h(program)f(di\013erences)i(in)o(v)o(olv)o -(e)f(string)g(comparison,)g(tree)f(comparison)37 2078 y(or)16 b(a)g(com)o(bin\ -ation)g(of)g(these)g(tec)o(hniques)h([12)o(].)22 b(Program)15 b(di\013erences) -i(ha)o(v)o(e)f(b)q(een)h(studied)g(in)g(regard)e(to)37 2135 y(sp)q(elling)j -(correction)d([54,)f(109)o(],)h(parsing)g(error)g(correction)g([119)o(],)f -(v)o(ersion)i(storage)e([99)o(])g(and)i(other)f(uses.)108 2191 y(String)f(com\ -parison)f(\014nds)i(the)e(minim)o(um)i(cost)e(sequence)h(of)f(edit)i(op)q(era\ -tions)e(to)g(con)o(v)o(ert)g(one)g(string)37 2247 y(in)o(to)h(another.)19 b -(The)14 b(standard)f(algorithm)h(for)f(string)g(comparison)h(is)g(describ)q -(ed)h(b)o(y)f(W)l(agner)f(and)h(Fisher)37 2304 y([120)o(].)19 b(The)14 b(user) -g(sp)q(eci\014es)i(the)e(cost)f(of)g(insertion,)i(replacemen)o(ts)f(and)g(del\ -etion)h(of)f(particular)g(elemen)o(ts.)37 2360 y(Dynamic)20 b(programming)f -(is)h(used)g(to)f(build)i(a)f(cost)e(table;)k(then,)f(the)e(table)h(is)g(anal\ -yzed)g(to)f(\014nd)h(the)37 2417 y(minim)o(um)d(cost)d(sequence.)22 b(Sev)o -(eral)15 b(re\014nemen)o(ts)h(ha)o(v)o(e)f(b)q(een)h(prop)q(osed)f([12].)108 -2473 y(String)g(comparison)f(algorithms)h(ha)o(v)o(e)f(their)g(limitations.) -21 b(In)15 b(comparing)g(t)o(w)o(o)e(programs,)g(one)i(limi-)37 2530 y(tation) -h(is)g(that)e(often)i(there)f(is)h(no)g(w)o(a)o(y)e(to)h(relate)g(c)o(hanges) -h(with)g(eac)o(h)f(other.)21 b(F)l(or)15 b(example,)h(if)f(c)o(hanges)952 2760 -y(64)g eop bop 37 42 a fl(are)15 b(made)h(at)e(the)i(b)q(eginning)h(and)e(end) -h(of)f(a)g(conditional)i(statemen)o(t,)d(these)h(c)o(hanges)g(will)i(not)e -(b)q(e)h(adja-)37 98 y(cen)o(t)g(and)h(string)f(comparison)g(approac)o(hes)f -(cannot)h(in)o(terrelate)h(the)f(c)o(hanges.)22 b(Also,)16 b(sligh)o(t)g(di\ -\013erences)37 154 y(in)h(programming)e(st)o(yle)h(\(extra)e(paren)o(theses,) -i(blank)g(lines,)h(etc.\))k(can)16 b(result)g(in)g(di\013erences)h(\015agged) -f(b)o(y)37 211 y(string)i(comparison,)f(ev)o(en)h(though)f(the)g(t)o(w)o(o)f -(programs)h(ma)o(y)f(b)q(e)i(syn)o(tactically)g(the)g(same.)26 b(These)17 b -(and)37 267 y(other)e(limitations)i(ha)o(v)o(e)e(motiv)m(ated)g(sev)o(eral)g -(tec)o(hniques)i(in)o(v)o(olving)f(tree)f(comparison.)108 324 y(T)l(ree)f(com\ -parison)h(algorithms)f(detect)g(syn)o(tactic)g(di\013erences)h(b)q(et)o(w)o -(een)g(programs)d(b)o(y)j(building)h(syn-)37 380 y(tax)11 b(trees)h(and)f(com\ -paring)h(the)f(trees.)19 b(T)l(ree)12 b(comparison)f(is)h(computationally)h -(exp)q(ensiv)o(e,)g(and)f(extensiv)o(e)37 437 y(researc)o(h)i(has)f(gone)g -(in)o(to)h(reducing)g(the)g(cost)f(b)o(y)g(\014rst)g(limiting)j(the)d(analysi\ -s)i(to)d(a)h(subset)h(of)f(\\in)o(teresting)37 493 y(trees",)k(and)h(then)g -(further)f(reducing)h(the)g(searc)o(h)f(b)o(y)g(detecting)h(and)g(eliminating) -h(matc)o(hing)f(subtrees.)37 550 y(T)l(ree)e(comparison)f(algorithms)g(are)g -(describ)q(ed)i(in)f([94)o(,)f(111)o(,)g(115)o(,)g(116)o(,)g(124)o(].)108 606 -y(These)i(tec)o(hniques)g(can)g(b)q(e)g(used)g(in)g(refactoring)f(as)g(follo) -o(ws:)23 b(Supp)q(ose)17 b(the)f(function)i fi(abstr)n(actable-)37 663 y(F)m -(unction)10 b fl(is)h(de\014ned)h(in)g(classes)f ff(Class1)g fl(and)g ff(Clas\ -s2)p fl(.)18 b(A)11 b(string)g(or)f(tree)g(comparison)h(algorithm)g(is)g(appl\ -ied,)37 719 y(pro)q(ducing)j(a)e(set)g(of)g(insertion,)h(replacemen)o(ts)g -(and)g(deletion)g(op)q(erations)g(to)e(get)h(from)g fi(abstr)n(actableF)m(unc\ --)37 775 y(tion)j fl(in)h ff(Class1)f fl(to)g fi(abstr)n(actableF)m(unction)e -fl(in)j ff(Class2)p fl(.)k(F)l(or)14 b(eac)o(h)h(edit)h(op)q(eration,)f(de\ -\014ne)h(a)e(new)i(function)37 832 y(in)h(b)q(oth)e(classes:)106 923 y fj(\ -\017)22 b fl(for)13 b(eac)o(h)h(insertion,)h(de\014ne)g(in)g ff(Class2)f fl -(a)f(new)i(function)f(whose)g(b)q(o)q(dy)h(con)o(tains)f(the)f(inserted)i(co) -q(de;)151 979 y(de\014ne)f(in)g ff(Class1)g fl(a)f(new)g(function)h(with)g -(the)f(same)g(name)g(whose)g(b)q(o)q(dy)h(is)f(n)o(ull.)21 b(Con)o(v)o(ert)12 -b(in)i ff(Class2)151 1036 y fl(the)21 b(inserted)h(co)q(de)g(to)f(a)f(call)j -(to)d(the)h(new)h(function;)i(at)d(the)g(corresp)q(onding)h(lo)q(cation)g(wit\ -hin)151 1092 y fi(abstr)n(actableF)m(unction)14 b fl(in)i ff(Class1)p fl(,)f -(add)g(a)g(call)h(to)f(the)g(new)h(function.)106 1185 y fj(\017)22 b fl(for) -17 b(eac)o(h)g(replacemen)o(t,)h(de\014ne)g(in)g ff(Class1)f fl(a)g(new)g(fun\ -ction)h(whose)f(b)q(o)q(dy)h(con)o(tains)f(the)g(replaced)151 1241 y(co)q(de;) -27 b(de\014ne)d(in)f ff(Class2)g fl(a)f(new)h(function)h(with)f(the)g(same)f -(name)h(whose)f(b)q(o)q(dy)i(con)o(tains)e(the)151 1298 y(replacing)f(co)q -(de.)35 b(In)21 b ff(Class1)p fl(,)g(con)o(v)o(ert)e(the)h(replaced)h(co)q -(de)g(to)e(a)h(call)h(to)f(the)g(new)g(function;)j(in)151 1354 y ff(Class2)p -fl(,)15 b(con)o(v)o(ert)g(the)g(replacing)i(co)q(de)e(with)h(a)f(call)h(to)f -(the)g(new)g(function.)106 1447 y fj(\017)22 b fl(for)16 b(eac)o(h)g(deletion\ -,)h(in)g ff(Class1)f fl(de\014ne)i(a)d(new)i(function)g(whose)f(b)q(o)q(dy)g -(con)o(tains)h(the)f(deleted)h(co)q(de;)151 1503 y(de\014ne)d(in)g ff(Class2) -f fl(a)g(new)g(function)g(with)h(the)f(same)f(name)h(whose)g(b)q(o)q(dy)g(is) -h(n)o(ull.)20 b(In)14 b ff(Class1)p fl(,)f(con)o(v)o(ert)151 1559 y(the)22 b -(deleted)i(co)q(de)f(to)e(a)h(call)i(to)d(the)i(new)f(function;)k(at)c(the)g -(corresp)q(onding)h(lo)q(cation)g(within)151 1616 y fi(abstr)n(actableF)m(unc\ -tion)14 b fl(in)i ff(Class2)p fl(,)f(add)g(a)g(call)h(to)f(the)g(new)h(functi\ -on.)108 1707 y(Using)g(these)g(algorithms,)f(the)g(task)g(of)g(comparing)h -(t)o(w)o(o)e(functions)i(and)g(splitting)g(a)o(w)o(a)o(y)e(di\013erences)37 -1763 y(in)o(to)i(separate)e(functions)i(could)h(b)q(e)e(automated,)f(but)i -(there)f(are)g(shortcomings.)108 1820 y(When)h(a)f(new)h(function)g(is)g(de\ -\014ned,)h(it)f(should)g(b)q(e)h(giv)o(en)f(a)f(descriptiv)o(e)i(name)f(and)f -(con)o(tain)h(related)37 1876 y(co)q(de.)21 b(F)l(unction)16 b(names)f(that)g -(are)g(auto-generated)f(probably)i(w)o(on't)e(b)q(e)i(descriptiv)o(e.)21 b -(Ho)o(w)o(ev)o(er,)14 b(this)i(is)37 1933 y(not)f(a)f(ma)s(jor)f(problem,)i -(as)f(a)g(refactoring)g(could)i(later)e(b)q(e)h(applied)i(to)c(c)o(hange)i -(the)g(function)g(names)f(and)37 1989 y(mak)o(e)h(them)g(more)g(descriptiv)o -(e.)108 2045 y(More)k(imp)q(ortan)o(tly)l(,)h(when)g(t)o(w)o(o)e(functions)i -(are)f(compared,)g(a)g(segmen)o(t)g(of)g(con)o(tiguous)g(co)q(de)h(that)37 -2102 y(app)q(ears)e(in)g(one)f(function)h(but)f(not)g(in)h(the)f(other)g(ma)o -(y)f(not)h(b)q(elong)h(in)g(a)f(new)g(function.)26 b(P)o(erhaps)17 b(the)37 -2158 y(con)o(tiguous)f(co)q(de)h(should)f(b)q(e)h(divided)g(further)f(in)o -(to)g(sev)o(eral)g(functions.)22 b(Con)o(v)o(ersely)l(,)15 b(sometimes)h(when) -37 2215 y(t)o(w)o(o)i(functions)h(are)g(compared,)g(segmen)o(ts)f(of)g(co)q -(de)h(that)f(di\013er)h(b)q(et)o(w)o(een)g(them)g(ma)o(y)f(b)q(e)h(preceded)h -(or)37 2271 y(follo)o(w)o(ed)e(b)o(y)f(segmen)o(ts)f(of)h(related)g(co)q(de)h -(that)e(\(coinciden)o(tally\))j(are)e(the)g(same)g(in)h(b)q(oth)f(functions.) -26 b(In)37 2328 y(order)18 b(for)f(the)h(new)f(functions)i(to)e(represen)o -(t)g(meaningful)i(abstractions,)f(this)g(\\common")e(co)q(de)j(migh)o(t)37 -2384 y(really)i(b)q(elong)g(together)e(with)h(the)g(di\013ering)h(segmen)o -(ts)e(in)i(those)f(new)g(functions.)34 b(F)l(ully)21 b(automated)37 2441 y -(tec)o(hniques)c(w)o(on't)d(pic)o(k)i(this)g(up.)108 2497 y(Rak)e([93)o(])f -(describ)q(es)j(an)d(approac)o(h)g(that)g(com)o(bines)i(automated)e(analysis) -h(with)g(user)g(in)o(teraction,)g(for)37 2554 y(abstracting)g(a)g(function)g -(\(Smalltalk)h(metho)q(d\))f(in)o(to)g(a)f(sup)q(erclass)i(from)f(its)g(sub)q -(class)h(implemen)o(tations.)37 2610 y(A)j(parse)f(of)g(eac)o(h)h(function)g -(pro)q(duces)g(a)f(stream)g(of)g(tok)o(ens;)g(the)h(tok)o(en)f(streams)f(are) -h(compared)h(using)952 2760 y(65)g eop bop 37 42 a fl(W)l(agner)19 b(and)g -(Fisher's)g(string)g(comparison)h(algorithm)f(to)f(determine)i(the)f(di\013er\ -ence)i(regions.)31 b(On)20 b(a)37 98 y(displa)o(y)d(terminal,)g(the)f(functio\ -ns)g(implemen)o(tations)i(are)d(displa)o(y)o(ed)i(side-b)o(y-side,)h(with)e -(the)g(di\013erence)37 154 y(regions)g(highligh)o(ted.)23 b(The)15 b(user)h -(can)g(expand)g(or)f(split)h(the)g(di\013erence)g(regions.)21 b(Then,)16 b -(for)e(eac)o(h)i(di\013er-)37 211 y(ence)i(region,)e(a)g(new)h(function)g(is) -g(added)g(to)f(eac)o(h)g(sub)q(class)h(to)f(con)o(tain)h(the)f(di\013erences.) -24 b(Then,)17 b(in)g(the)37 267 y(function)d(b)q(eing)h(abstracted,)e(the)g -(di\013ering)h(co)q(de)g(is)f(replaced)i(b)o(y)e(a)g(call)h(to)f(the)g(newly) -h(created)f(function.)37 324 y(This)19 b(pro)q(cess)f(is)h(rep)q(eated)f(un)o -(til)h(the)f(function)h(implemen)o(tations)g(are)f(iden)o(tical,)i(at)d(whic) -o(h)i(p)q(oin)o(t)f(the)37 380 y(function)f(can)e(b)q(e)h(migrated)f(to)f(the) -i(sup)q(erclass.)108 437 y(Rak)21 b(c)o(hose)g(a)g(string)g(comparison)h(appr\ -oac)o(h)e(b)q(ecause)i(it)g(w)o(as)e(simpler)i(to)f(implemen)o(t)h(than)f(the) -37 493 y(tree)d(comparison)g(approac)o(hes.)28 b(Ho)o(w)o(ev)o(er,)18 b(it)g -(has)g(shortcomings.)28 b(A)18 b(stream)f(of)g(tok)o(ens)h(represen)o(ting)37 -550 y(a)g(di\013erence)i(region)e(ma)o(y)g(cross)g(the)g(b)q(oundary)h(b)q -(et)o(w)o(een)f(subtrees)h(of)f(the)g(function)h(parse,)g(in)g(whic)o(h)37 606 -y(case)h(that)e(region)h(is)h(not)e(alw)o(a)o(ys)h(con)o(v)o(ertible)h(to)e -(a)h(function.)32 b(This)20 b(shortcoming)e(can)i(b)q(e)f(o)o(v)o(ercome)37 -663 y(b)o(y)e(expanding)h(the)e(di\013erence)i(region)e(un)o(til)i(it)f(corre\ -sp)q(onds)f(to)g(a)g(syn)o(tactically)i(meaningful)g(program)37 719 y(part.) -108 775 y(Bec)o(kman-Da)o(vies)25 b([12)o(])f(analyzed)h(string)f(and)h(tree) -f(comparison)h(approac)o(hes)f(\(and)g(h)o(ybrid)h(ap-)37 832 y(proac)o(hes\)) -18 b(for)e(\014nding)j(program)e(di\013erences.)28 b(That)17 b(analysis)h(sho) -o(w)o(ed)f(that)g(no)h(approac)o(h)f(is)h(optimal)37 888 y(in)i(all)g(cases.) -32 b(Bec)o(kman-Da)o(vies)19 b(further)g(concluded)i(that,)e(among)f(the)i -(approac)o(hes)e(for)h(\014nding)h(and)37 945 y(displa)o(ying)g(program)d(di\ -\013erences)j(to)d(a)h(user,)h(an)f(alternativ)o(e)g(should)h(b)q(e)g(c)o(hos\ -en)g(based)f(primarily)i(on)37 1001 y(what)f(seems)g(in)o(tuitiv)o(ely)h(b)q -(est)f(to)f(that)h(user,)g(while)h(minimizing)i(computational)d(costs)f(and)h -(w)o(orking)37 1058 y(within)e(the)e(limitations)i(of)d(the)i(displa)o(y)g -(terminal.)37 1201 y fd(6.5)70 b(Making)24 b(V)-6 b(ariables)22 b(Compatible) -37 1302 y fl(Ha)o(ving)14 b(created)g(the)g(abstract)f(sup)q(erclass)i(and)f -(determined)h(the)f(function)h(signatures,)f(it)g(is)g(sometimes)37 1359 y -(necessary)i(to)f(add)g(mem)o(b)q(er)h(v)m(ariables)g(to)f(the)g(abstract)g -(sup)q(erclass.)21 b(Although)16 b(abstract)e(classes)i(often)37 1415 y(do)j -(not)f(ha)o(v)o(e)h(mem)o(b)q(er)g(v)m(ariables,)h(sometimes)f(they)g(need)g -(to)f(b)q(e)h(mo)o(v)o(ed)g(there.)30 b(The)19 b(most)f(common)37 1472 y(reas\ -on)d(is)h(that)e(they)i(are)f(referenced)h(b)o(y)f(common)g(co)q(de)h(that)e -(b)q(elongs)i(in)g(the)f(sup)q(erclass.)108 1528 y(As)j(w)o(as)e(the)i(case)g -(with)g(function)g(signatures,)g(v)m(ariables)h(de\014ned)g(in)f(one)g(sub)q -(class)g(ma)o(y)f(b)q(e)h(struc-)37 1585 y(turally)12 b(similar)g(to,)f(but)g -(not)g(exactly)g(matc)o(h,)g(conceptually)h(equiv)m(alen)o(t)h(v)m(ariables)f -(in)g(the)f(other)g(sub)q(class.)37 1641 y(F)l(or)18 b(example,)h(supp)q(ose) -g(t)o(w)o(o)e(ob)s(jects,)h(one)g(of)f(eac)o(h)i(sub)q(class,)g(eac)o(h)f(con) -o(tain)h(a)e(coun)o(ter)h(of)g(references)37 1698 y(to)f(themselv)o(es.)26 b -(When)17 b(the)h(coun)o(ter)e(reac)o(hes)h(zero,)g(the)h(ob)s(ject)e(marks)g -(itself)i(for)f(deletion.)27 b(Ho)o(w)o(ev)o(er,)37 1754 y(in)17 b(one)g(sub) -q(class)g(the)f(coun)o(ter)g(is)g(called)i fi(r)n(efCount)d fl(while)j(in)f -(the)f(other)f(sub)q(class)i(the)f(coun)o(ter)g(is)h(called)37 1810 y fi(r)n -(efer)n(enc)n(es)p fl(.)25 b(Before)18 b(the)g(v)m(ariable)h(is)f(added)g(to) -f(the)g(sup)q(erclass,)i(the)f(name)f(of)h(one)f(of)g(these)h(v)m(ariables)37 -1867 y(needs)e(to)f(b)q(e)h(c)o(hanged)f(to)g(matc)o(h)g(the)g(other)g(v)m -(ariable.)108 1923 y(Structural)h(heuristics)g(similar)h(to)d(those)h(listed) -i(in)f(section)g(6.2)e(could)j(detect)e(similarities)j(in)e(name,)37 1980 y -(access)d(con)o(trol)f(mo)q(de)h(and)g(t)o(yp)q(e.)19 b(In)13 b(cases)g(where) -f(the)h(attributes)f(of)h(the)f(v)m(ariables)i(di\013er,)f(the)g(follo)o(wing) -37 2036 y(refactorings)22 b(that)e(c)o(hange)i(v)m(ariable)h(attributes)e(can) -h(b)q(e)g(applied)i(to)d(mak)o(e)g(the)h(v)m(ariable)h(attributes)37 2093 y -(matc)o(h,)15 b(pro)o(vided)h(that)e(their)i(preconditions)h(are)e(met:)106 -2187 y fj(\017)22 b fl(c)o(hange)s 14 2 v 14 w(v)m(ariable)s 14 2 v 14 w(name) -16 b(\(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable,)g(new)s 14 2 v 14 w(v)m(ariabl\ -e)s 14 2 v 15 w(name\))106 2280 y fj(\017)22 b fl(c)o(hange)s 14 2 v 14 w(acc\ -ess)s 14 2 v 13 w(con)o(trol)s 14 2 v 13 w(mo)q(de)16 b(\(mem)o(b)q(er)s 14 2 -v 13 w(v)m(ariable,)g(new)s 14 2 v 14 w(access)s 14 2 v 13 w(con)o(trol)s 14 2 -v 14 w(mo)q(de\))106 2374 y fj(\017)22 b fl(c)o(hange)s 14 2 v 14 w(t)o(yp)q -(e)15 b(\(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable,)h(new)s 14 2 v 14 w(t)o(yp) -q(e\).)952 2760 y(66)g eop bop 37 42 a fd(6.6)70 b(Migrating)23 b(V)-6 b(aria\ -bles)22 b(to)h(the)f(Sup)r(erclass)37 143 y fl(This)16 b(refactoring)f(migrat\ -es)g(a)g(v)m(ariable)h(to)f(the)g(abstract)f(sup)q(erclass.)21 b(The)16 b(arg\ -umen)o(ts)e(to)h(this)37 199 y(refactoring)g(are:)106 306 y fj(\017)22 b fl -(the)15 b(mem)o(b)q(er)h(v)m(ariable)g(\(V1\))f(in)h(one)f(sub)q(class)h(\(C1\ -\))106 400 y fj(\017)22 b fl(the)15 b(mem)o(b)q(er)h(v)m(ariable)g(\(V2\))f -(in)h(the)f(other)g(sub)q(class)h(\(C2\))37 506 y(After)f(c)o(hec)o(king)h -(its)g(preconditions,)g(this)g(refactoring:)93 612 y(1.)22 b(calls)17 b(the)e -(mo)o(v)o(e)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable)s 14 2 v 15 w -(to)s 14 2 v 13 w(sup)q(erclass)h(refactoring)f(to)g(mo)o(v)o(e)g(the)g(v)m -(ariable)i(to)e(the)g(su-)151 669 y(p)q(erclass.)37 790 y fe(6.6.1)56 b(Preco\ -nditions)37 876 y fl(The)16 b(preconditions)h(for)d(this)i(refactoring)f(are:) -93 982 y(1.)22 b(matc)o(hingA)o(ttributesP\(V1,)14 b(V2\))151 1039 y(\(the)h -(attributes)g(of)g(the)g(mem)o(b)q(er)g(v)m(ariables)i(matc)o(h.\))93 1133 y -(2.)22 b(V1.accessCon)o(trolMo)q(de)14 b fj(6)p fl(=)i(priv)m(ate)151 1189 y -(\(the)f(access)g(con)o(trol)g(mo)q(de)h(of)f(eac)o(h)g(v)m(ariable)h(is)g -(not)f(priv)m(ate\))37 1311 y fe(6.6.2)56 b(Beha)n(vior)18 b(Preserv)m(ation) -37 1397 y fl(F)l(or)e(mo)o(v)o(e)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(v)m -(ariable)s 14 2 v 15 w(to)s 14 2 v 13 w(sup)q(erclass:)23 b(precondition)18 b -(1)e(\(the)g(v)m(ariable)i(is)f(de\014ned)h(iden)o(tically)h(in)37 1453 y(all) -j(sub)q(classes)g(where)g(it)f(is)g(de\014ned\))h(is)g(satis\014ed)f(b)o(y)g -(precondition)h(1)f(of)f(this)i(refactoring)e(and)h(and)37 1509 y(b)q(ecause) -i(\(b)o(y)d(construction,)j(from)d(prior)h(steps\))g(no)g(other)g(sub)q(class\ -es)h(are)f(de\014ned;)k(precondition)e(2)37 1566 y(\(the)18 b(v)m(ariable)i -(isn't)e(already)g(de\014ned)i(or)e(inherited)h(b)o(y)g(the)f(sup)q(erclass\)) -h(is)f(satis\014ed)h(b)o(y)f(precondition)37 1622 y(2)f(of)f(this)h(refactori\ -ng)f(and)h(program)e(prop)q(ert)o(y)i(four)f(\(inherited)i(Mem)o(b)q(er)e(V)l -(ariables)i(Not)e(Rede\014ned\),)37 1679 y(whic)o(h)i(states)e(that)g(a)g(mem) -o(b)q(er)h(v)m(ariable)h(inherited)g(from)e(a)g(sup)q(erclass)i(is)f(not)f -(rede\014ned)i(in)g(an)o(y)e(of)g(its)37 1735 y(sub)q(classes.)108 1792 y(Thi\ -s)e(refactoring)f(is)h(constructed)g(using)g(a)g(b)q(eha)o(vior)g(preserving) -g(refactoring)f(and,)h(since)g(it)g(satis\014es)37 1848 y(the)i(preconditions) -g(of)f(that)g(refactoring,)f(b)q(eha)o(vior)i(is)g(preserv)o(ed.)37 1991 y fd -(6.7)70 b(Migrating)23 b(Common)f(Co)r(de)g(to)h(the)g(Abstract)g(Sup)r(ercla\ -ss)37 2093 y fl(In)18 b(this)f(step,)g(common)f(co)q(de)i(is)f(migrated)f(to) -g(the)h(sup)q(erclass.)26 b(Before)17 b(migrating)f(the)h(function)h(b)q(o)q -(dy)37 2149 y(to)d(the)g(sup)q(erclass,)h(di\013erences)h(b)q(et)o(w)o(een)e -(the)g(functions)h(are)f(computed)h(using)g(one)f(of)g(the)g(comparison)37 -2206 y(algorithms)k(describ)q(ed)h(in)f(section)g(6.4.)28 b(V)l(ariables)19 b -(and)f(functions)h(referenced)h(b)o(y)e(the)g(common)g(co)q(de)37 2262 y(m)o -(ust)i(b)q(e)g(visible)i(from)e(the)f(sup)q(erclass)i(b)q(efore)g(it)f(can)g -(b)q(e)g(mo)o(v)o(ed)g(there.)34 b(The)20 b(refactorings)f(de\014ned)37 2319 y -(earlier)e(can)e(b)q(e)h(applied)h(to)d(mo)o(v)o(e)h(v)m(ariables)h(\(and)f -(add)h(function)g(signatures\))f(to)f(the)i(sup)q(erclass.)108 2375 y(This)d -(refactoring)g(is)g(applied)i(for)d(eac)o(h)h(function)g(b)q(o)q(dy)h(that)e -(is)h(to)f(b)q(e)i(added)f(to)f(the)h(sup)q(erclass.)20 b(The)37 2432 y(argum\ -en)o(ts)15 b(to)f(this)i(refactoring)f(are:)106 2538 y fj(\017)22 b fl(the)11 -b(sub)q(class)g(implemen)o(tations)h(of)e(the)h(mem)o(b)q(er)g(function)g(\(F\ -1)f(in)h(C1,)g(and)g(F2)f(in)h(C2\))f(represen)o(ted)151 2594 y(as)15 b(a)g -(list)h(of)f(alternating)g(common)g(and)g(di\013ering)h(co)q(de)g(segmen)o -(ts.)952 2760 y(67)g eop bop 37 42 a fl(After)15 b(c)o(hec)o(king)h(its)g(pre\ -conditions,)g(this)g(refactoring:)93 148 y(1.)22 b(for)15 b(eac)o(h)g(di\013e\ -ring)h(co)q(de)g(segmen)o(t,)e(this)i(refactoring:)170 242 y(\(a\))22 b(calls) -e(the)g(con)o(v)o(ert)s 14 2 v 13 w(co)q(de)s 14 2 v 14 w(segmen)o(t)s 14 2 v -13 w(to)s 14 2 v 12 w(function)g(refactoring)f(to)g(create)g(a)g(new)g(functi\ -on)i(in)251 298 y(eac)o(h)h(sub)q(class.)40 b(The)22 b(name)g(of)f(the)h(new) -g(function)g(is)g(automatically)g(generated)g(and)g(is)251 355 y(distinct)17 b -(from)d(the)h(name)g(of)g(an)o(y)g(existing)h(mem)o(b)q(er.)1200 338 y fs(5) -168 428 y fl(\(b\))22 b(calls)16 b(the)g(refactoring)e(de\014ned)j(in)f(secti\ -on)g(6.3,)e(to)g(add)i(the)f(signature)g(of)g(the)g(new)h(function)251 484 y -(to)f(the)g(sup)q(erclass)h(proto)q(col)93 578 y(2.)22 b(calls)c(the)g(add)s -14 2 v 13 w(function)s 14 2 v 14 w(b)q(o)q(dy)g(refactoring)f(to)g(add)g(a)g -(function)h(b)q(o)q(dy)g(to)e(the)h(mem)o(b)q(er)h(function)151 634 y(signatu\ -re)d(in)i(the)e(sup)q(erclass)93 728 y(3.)22 b(calls)g(the)g(delete)s 14 2 v -14 w(mem)o(b)q(er)s 14 2 v 14 w(functions)g(refactoring)f(to)g(delete)h(the)f -(mem)o(b)q(er)h(function)g(from)e(the)151 785 y(sub)q(classes.)37 906 y fe -(6.7.1)56 b(Preconditions)37 992 y fl(The)16 b(preconditions)h(for)d(this)i -(refactoring)f(are:)93 1098 y(1.)22 b fj(9)16 b fl(mem)o(b)q(er)f fj(2)226 -1155 y fl(C1.o)o(wner.sup)q(erclass.lo)q(callyDe\014nedMem)o(b)q(erF)l(unctio\ -ns,)301 1211 y(where)h(mem)o(b)q(er.name)f(=)g(sub)q(classMem)o(b)q(erF)l(unc\ -tion1.name)i fj(^)376 1268 y fl(mem)o(b)q(er.functionBo)q(dy)f(=)g fj(;)p fl -(.)151 1324 y(\(the)f(function)h(signature,)f(but)g(not)g(the)h(function)g -(b)q(o)q(dy)l(,)f(is)h(already)f(de\014ned)i(in)f(the)f(sup)q(erclass\))93 -1418 y(2.)22 b(let)14 b(setOfDi\013eringCo)q(deSegmen)o(ts)h(b)q(e)f(the)g -(set)f(of)h(di\013ering)g(co)q(de)h(segmen)o(ts)e(for)g(the)h(t)o(w)o(o)e(mem) -o(b)q(er)151 1474 y(functions.)226 1531 y fj(8)k fl(co)q(deSegmen)o(t)f fj -(2)h fl(setOfDi\013eringCo)q(deSegmen)o(ts)301 1587 y(con)o(v)o(ertibleT)l -(oF)l(unctionP\(co)q(deSegmen)o(t\).)151 1644 y(\(eac)o(h)f(di\013ering)h(co) -q(de)g(segmen)o(t)f(can)g(b)q(e)h(con)o(v)o(erted)f(to)f(a)h(legal)h(function\ -\).)93 1738 y(3.)22 b(for)15 b(eac)o(h)g(commonCo)q(deSegmen)o(t)g(of)g(F1)f -(and)i(F2,)226 1794 y fj(8)g fl(V)f fj(2)g fl(v)m(ariablesReferencedBy\(commo\ -nCo)q(deSe)q(gmen)o(t\),)301 1851 y fj(8)h fl(class)f(in)h(\(C1)f fj([)g fl -(C2)g fj([)g fl(C1.sup)q(erclass\))376 1907 y(class)h fj(\032)f fl(scop)q(eOf\ -\(V\))451 1963 y(where)h(mem)o(b)q(er.name)f(=)g(refdV)l(ariable.name.)21 b fj -(_)226 2020 y(8)16 b fl(F)e fj(2)i fl(functionsCalledBy\(commonCo)q(deSegmen) -o(t\),)301 2076 y fj(8)g fl(class)f(in)h(\(C1)f fj([)g fl(C2)g fj([)g fl(C1.s\ -up)q(erclass\))376 2133 y(class)h fj(\032)f fl(scop)q(eOf\(F\).)151 2189 y -(\(the)21 b(scop)q(e)g(of)f(all)i(v)m(ariables)g(and)f(functions)h(referenced) -g(b)o(y)e(the)h(common)g(co)q(de)g(includes)i(the)151 2246 y(sup)q(erclass)16 -b(and)g(b)q(oth)f(sub)q(classes\).)37 2329 y 750 2 v 89 2356 a fu(5)107 2372 y -fp(The)e(refactoring)h fm(change)r 12 2 v 10 w(memb)n(er)r 12 2 v 12 w(functi\ -on)r 12 2 v 9 w(name)e fp(could)i(later)g(b)q(e)f(applied)j(to)d(mak)o(e)g -(the)g(name)g(more)h(descriptiv)o(e.)952 2760 y fl(68)g eop bop 37 42 a fe -(6.7.2)56 b(Beha)n(vior)18 b(Preserv)m(ation)37 127 y fl(F)l(or)f(step)g(1-\(\ -a\),)f(a)h(call)h(to)e(con)o(v)o(ert)s 14 2 v 13 w(co)q(de)s 14 2 v 14 w(segm\ -en)o(t)s 14 2 v 13 w(to)s 14 2 v 13 w(function:)24 b(precondition)19 b(1)e -(\(eac)o(h)f(new)i(function)37 184 y(is)e(a)f(legal)h(function\))g(is)g(satis\ -\014ed)f(b)o(y)g(precondition)i(2)e(of)g(this)g(refactoring.)108 240 y(F)l -(or)d(step)h(1-\(b\),)g(a)f(call)i(to)f(the)g(refactoring)f(de\014ned)j(in)e -(section)h(6.3:)k(precondition)c(1)f(\(the)f(signatures)37 297 y(of)g(the)h -(mem)o(b)q(er)f(function)h(in)g(b)q(oth)f(sub)q(classes)i(matc)o(h\))d(is)i -(satis\014ed)f(the)h(results)f(of)g(the)g(prior)h(step,)f(where)37 353 y(eac) -o(h)18 b(new)g(function)g(is)g(created)g(in)g(b)q(oth)g(sub)q(classes)h(with) -f(the)f(same)h(signature;)g(precondition)h(2)f(\(the)37 410 y(mem)o(b)q(er)h -(function)f(is)h(not)e(lo)q(cally)j(de\014ned)f(in)g(the)f(sup)q(erclass\))h -(is)f(satis\014ed)g(b)q(ecause)h(b)o(y)f(construction)37 466 y(the)e(new)f -(function)h(has)f(a)g(unique)i(name.)108 523 y(F)l(or)i(step)h(2,)g(in)h(the) -f(call)h(to)e(add)s 14 2 v 13 w(function)s 14 2 v 15 w(b)q(o)q(dy:)29 b(preco\ -ndition)22 b(1)d(\(all)i(v)m(ariables)g(and)f(functions)37 579 y(referenced) -15 b(in)g(the)f(function)h(b)q(o)q(dy)f(are)g(visible)i(from)d(the)h(sup)q -(erclass\))g(is)h(satis\014ed)f(b)o(y)g(precondition)h(3)f(of)37 635 y(this)j -(refactoring;)e(precondition)j(2)d(\(the)h(mem)o(b)q(er)g(function)h(is)g(unr\ -eferenced)g(lo)q(cally)h(in)e(the)g(sup)q(erclass)37 692 y(or)f(the)g(sup)q -(erclass)i(is)e(abstract\))f(is)i(satis\014ed)g(b)q(ecause)g(the)f(sup)q(ercl\ -ass)h(is)g(abstract.)108 748 y(F)l(or)11 b(step)g(3,)h(in)g(the)g(call)h(to)d -(delete)s 14 2 v 15 w(mem)o(b)q(er)s 14 2 v 13 w(functions:)19 b(precondition) -13 b(1)e(\(the)h(function)g(to)f(b)q(e)h(deleted)37 805 y(is)17 b(unreference\ -d)g(or)f(redundan)o(t\))g(is)g(satis\014ed)h(b)q(ecause,)f(as)g(a)f(result)i -(of)e(the)h(prior)g(step,)g(the)g(function)h(is)37 861 y(redundan)o(t.)108 918 -y(This)f(refactoring)f(is)g(constructed)h(using)g(b)q(eha)o(vior)g(preserving) -g(refactorings)e(and,)h(since)i(it)e(satis\014es)37 974 y(the)h(preconditions) -g(of)f(those)g(refactorings,)g(b)q(eha)o(vior)g(is)h(preserv)o(ed.)37 1114 y -fd(6.8)70 b(Discussion)37 1217 y fe(6.8.1)56 b(Reducing)18 b(In)n(teraction)g -(with)g(the)h(Designer)37 1303 y fl(Giv)o(en)i(t)o(w)o(o)e(concrete)h(classes\ -,)h(it)g(is)f(p)q(ossible)i(to)e(de\014ne)h(a)f(higher)h(lev)o(el)g(refactori\ -ng)f(that)f(automati-)37 1359 y(cally)h(creates)e(a)g(new)g(common)g(sup)q -(erclass)h(that)e(has)i(no)f(instances)h(and)f(whic)o(h)h(con)o(tains)f(simil\ -arities)37 1415 y(detectable)f(b)o(y)e(structural)g(analysis,)g(using)h(the)g -(follo)o(wing)g(algorithm:)106 1494 y fj(\017)22 b fl(create)15 b(the)g(abstr\ -act)g(sup)q(erclass,)g(as)g(describ)q(ed)i(in)f(section)g(6.1)106 1580 y fj -(\017)22 b fl(add)16 b(function)g(signatures)g(to)f(the)h(sup)q(erclass)h(-)e -(add)h(all)h(iden)o(tical)g(signatures)f(to)f(the)h(sup)q(erclass.)151 1636 y -(Going)d(b)q(ey)o(ond)i(exact)e(matc)o(hes,)g(apply)h(heuristics)h(and)e(refa\ -ctorings)g(describ)q(ed)i(in)g(section)f(6.2)e(to)151 1692 y(detect)k(functio\ -ns)h(with)f(similar)h(signatures,)e(refactor)g(them)h(to)f(b)q(e)h(the)g(same\ -,)f(and)h(add)g(them)g(to)151 1749 y(the)f(sup)q(erclass.)106 1835 y fj(\017) -22 b fl(mo)o(v)o(e)15 b(v)m(ariables)j(to)d(the)h(sup)q(erclass)h(-)f(the)g -(same)g(algorithm)g(is)g(applied)i(as)d(in)i(the)f(previous)h(step,)151 1891 y -(but)e(applied)j(to)c(mem)o(b)q(er)h(v)m(ariables,)i(as)d(describ)q(ed)k(in)e -(section)f(6.6.)106 1977 y fj(\017)22 b fl(for)14 b(all)i(functions)g(whose)f -(signatures)g(are)f(de\014ned)j(in)e(the)g(sup)q(erclass,)h(detect)f(common)g -(co)q(de)g(and)151 2033 y(di\013ering)g(co)q(de)g(using)g(one)f(of)g(the)g -(approac)o(hes)g(describ)q(ed)i(in)f(section)g(6.4.)j(Apply)e(the)e(refactori\ -ng)151 2090 y(describ)q(ed)j(in)f(section)g(6.8)e(to:)202 2176 y fh({)23 b fl -(separate)15 b(di\013ering)h(co)q(de)g(in)o(to)f(new)g(functions)202 2241 y fh -({)23 b fl(mo)o(v)o(e)18 b(v)m(ariables)i(and)e(add)h(function)g(signatures)g -(to)e(the)i(sup)q(erclass)h(as)e(referenced)h(b)o(y)f(the)251 2297 y(common)d -(co)q(de,)g(if)h(these)f(ha)o(v)o(e)g(not)g(already)h(b)q(een)g(migrated)f -(to)f(sup)q(erclass.)202 2362 y fh({)23 b fl(mo)o(v)o(e)15 b(the)g(common)g -(co)q(de)g(to)g(the)g(sup)q(erclass.)108 2441 y(It)i(migh)o(t)f(b)q(e)h(that) -f(this)h(algorithm)g(will)h(pro)q(duce)f(go)q(o)q(d)g(results)g(in)g(practice\ -,)g(so)g(that)e(a)i(user)f(could)37 2497 y(just)h(run)f(it)h(and)f(then)h(bac) -o(k)f(it)h(out)f(if)h(the)f(results)h(w)o(eren't)f(what)f(w)o(as)h(in)o(tende\ -d.)25 b(Ho)o(w)o(ev)o(er)15 b(it)i(is)g(lik)o(ely)37 2554 y(that,)i(in)h(orde\ -r)f(to)f(capture)h(in)h(the)f(sup)q(erclass)h(an)f(abstraction)g(that)f(the)h -(user)h(can)f(understand)g(and)37 2610 y(later)d(use)f(to)g(extend)h(the)f -(system,)f(some)h(user)g(in)o(teraction)h(will)h(b)q(e)f(needed.)952 2760 y -(69)g eop bop 37 42 a fe(6.8.2)56 b(Other)18 b(Issues)37 127 y fl(Giv)o(en)e -(t)o(w)o(o)e(classes,)h(this)h(c)o(hapter)f(de\014nes)h(an)g(approac)o(h)e -(for)h(creating)g(a)g(common)g(abstract)f(sup)q(erclass)37 184 y(that)h(con)o -(tains)g(a)g(set)f(of)h(mem)o(b)q(er)g(function)h(signatures,)f(and)g(p)q(oss\ -ibly)i(a)d(set)h(of)g(mem)o(b)q(er)g(v)m(ariables)h(and)37 240 y(the)k(partia\ -l)f(implemen)o(tations)h(of)f(some)g(functions.)32 b(After)19 b(refactoring,) -g(the)g(de\014nitions)i(in)f(the)f(sub-)37 297 y(classes)c(are)f(streamlined,) -h(as)f(some)g(of)g(the)h(b)q(eha)o(vior)f(that)g(had)g(b)q(een)i(lo)q(cally)g -(de\014ned)f(is)g(no)o(w)f(inherited.)37 353 y(The)i(commonalities)g(and)g -(di\013erences)g(b)q(et)o(w)o(een)f(the)h(sub)q(classes)g(are)f(made)g(more)g -(explicit.)108 410 y(A)i(related)h(issue,)g(outside)g(the)f(scop)q(e)h(of)f -(this)g(c)o(hapter,)g(is)h(whether)g(an)f(algorithm)g(can)g(b)q(e)h(de\014ned) -37 466 y(for)g(selecting)i(from)e(a)g(set)g(of)g(classes)h(t)o(w)o(o)e(classe\ -s)i(that)f(share)g(a)h(common)f(abstraction.)29 b(Recall)20 b(from)37 523 y -(section)15 b(6.1)e(that)h(the)g(classes)g(that)g(shared)g(a)g(common)f(abstr\ -action)h(w)o(ere)g(passed)g(as)g(argumen)o(ts)f(to)g(the)37 579 y(refactoring) -19 b(that)f(created)h(the)g(sup)q(erclass.)31 b(Casais)19 b([30)o(])f(describ) -q(es)i(a)f(global)g(reorganization)g(sc)o(heme)37 635 y(that)12 b(is)i(based) -e(on)h(recognizing)h(classes)f(with)g(common)f(attributes.)19 b(Classes)13 b -(are)f(automatically)h(brough)o(t)37 692 y(together)j(that)g(share)g(common)g -(attributes,)g(and)h(higher)g(lev)o(el)h(classes)e(are)h(in)o(tro)q(duced)g -(to)f(con)o(tain)g(the)37 748 y(common)f(mem)o(b)q(ers.)20 b(One)c(shortcomin\ -g)e(of)h(this)g(approac)o(h)g(is)g(that)f(in)i(c)o(ho)q(osing)f(classes)h(wit\ -h)f(common)37 805 y(attributes)d(it)h(lo)q(oks)f(only)h(for)e(matc)o(hing)i -(names.)18 b(Also,)13 b(its)g(ma)s(jor)d(motiv)m(ation)j(is)f(to)g(remo)o(v)o -(e)f(duplication)37 861 y(of)17 b(attributes)f(and)h(not)f(to)g(mo)q(del)h -(reusable)h(design)g(abstractions.)23 b(Th)o(us,)17 b(newly)g(de\014ned)h(cla\ -sses)f(ma)o(y)37 918 y(not)d(corresp)q(ond)h(to)f(meaningful)h(design)h(abstr\ -actions)e(and)g(hence)h(the)g(design)g(ma)o(y)f(b)q(e)h(made)f(less)h(clear) -37 974 y(b)o(y)h(the)f(automatic)g(reorganization.)108 1031 y(Inferring)i(a)e -(common)g(abstraction)g(from)g(similar)i(names)e(and)h(other)f(structural)h -(similarities)i(is)e(not)37 1087 y(fo)q(olpro)q(of)21 b(\(as)f(sho)o(wn)h(in) -h(section)f(6.2\).)36 b(Consider)22 b(an)e(extreme)h(example,)i(where)e(t)o -(w)o(o)f(classes)h(b)q(oth)37 1144 y(con)o(tain)d(the)f(v)m(ariables)h fi(dep) -n(endencies,)f(p)n(arts)g fl(and)g fi(r)n(esour)n(c)n(es)p fl(,)f(and)i(the)f -(functions)g fi(start,)i(r)n(e)n(dir)n(e)n(ct,)e(halt)37 1200 y fl(and)h fi -(maintain)p fl(.)27 b(These)18 b(classes)g(are)f(structurally)i(quite)f(simil\ -ar,)h(but)f(if)g(one)f(class)h(represen)o(ts)g(an)g ff(Au-)37 1256 y(tomobile) -d fl(and)i(the)g(other)g(class)g(represen)o(ts)g(a)g ff(Soft)o(w)o(a)o(re)f -(Project)p fl(,)h(they)h(probably)f(don't)g(share)g(a)f(useful)37 1313 y(comm\ -on)f(abstraction.)k(F)l(requen)o(tly)l(,)c(attributes)f(with)h(the)g(same)f -(name)h(ha)o(v)o(e)f(v)o(ery)g(di\013eren)o(t)h(meanings;)37 1369 y(con)o(v)o -(ersely)l(,)h(classes)f(that)f(share)h(a)f(common)h(abstraction)f(ma)o(y)g -(ha)o(v)o(e)g(attributes)h(that)f(are)h(named)g(quite)37 1426 y(di\013eren)o -(tly)l(,)i(due)f(to)f(acciden)o(t)i(or)e(history)l(.)22 b(Th)o(us,)15 b(en)o -(tirely)i(automating)e(this)h(pro)q(cess)g(is)g(unlik)o(ely)i(to)d(b)q(e)37 -1482 y(successful.)108 1539 y(The)d(refactorings)g(de\014ned)h(here)g(assumed) -f(that)f(the)i(abstract)e(sup)q(erclass)i(w)o(as)e(created)h(based)g(on)g(the) -37 1595 y(commonalities)18 b(b)q(et)o(w)o(een)e fi(two)g fl(classes.)23 b(As) -16 b(noted)g(earlier,)h(it)f(can)g(b)q(e)h(generalized)h(to)d(w)o(ork)g(with) -h(three)37 1652 y(or)h(more)f(classes.)26 b(In)17 b(some)g(cases)g(it)g(ma)o -(y)f(b)q(e)i(desirable)g(to)e(create)h(an)g(abstract)f(sup)q(erclass)i(with)f -(only)37 1708 y(one)g(sub)q(class.)24 b(Con\014dence)17 b(that)f(a)g(reusable) -h(abstraction)f(has)g(b)q(een)h(found)g(cannot)f(b)q(e)h(attained)f(un)o(til) -37 1765 y(it)i(has)f(b)q(een)h(applied)h(to)e(more)g(than)g(one)g(concrete)g -(example)h(in)g(the)g(problem)g(domain.)26 b(Nonetheless,)37 1821 y(these)16 b -(refactorings)f(can)g(b)q(e)h(applied)h(to)d(migrate)h(b)q(eha)o(vior)h(from) -e(a)h(single)i(class)e(to)g(its)g(sup)q(erclass.)952 2760 y(70)g eop bop 37 -353 a fc(Chapter)35 b(7)37 560 y fb(Refactoring)42 b(T)-10 b(o)40 b(Sp)s(ecia\ -lize:)37 685 y(Sub)s(classing,)i(and)d(Simplifyi)q(ng)37 809 y(Conditional)q -(s)37 1050 y fd(7.1)70 b(Motiv)l(ation)37 1152 y fl(Sometimes)16 b(the)f(desi\ -gn)g(of)g(an)f(ob)s(ject-orien)o(ted)h(application)i(framew)o(ork)c(can)i(b)q -(e)g(impro)o(v)o(ed)g(b)o(y)g(decom-)37 1208 y(p)q(osing)i(a)e(large,)h(compl\ -ex)g(class)h(in)o(to)e(sev)o(eral)h(smaller)h(classes.)k(The)16 b(complex)h -(class)f(usually)h(em)o(b)q(o)q(dies)37 1265 y(b)q(oth)f(a)g(general)g(abstra\ -ction)g(and)g fi(sever)n(al)f(di\013er)n(ent)g fl(concrete)h(cases)g(that)f -(are)h(candidates)g(for)g(sp)q(ecial-)37 1321 y(ization.)21 b(One)15 b(clue)g -(for)f(ho)o(w)f(to)h(decomp)q(ose)h(suc)o(h)f(a)g(complex)h(class)g(is)f(to)g -(analyze)h(the)f(set)g(of)g(\015ags,)f(tags)37 1378 y(and)j(conditional)h(sta\ -temen)o(ts)d(con)o(tained)i(in)g(the)f(class.)108 1434 y(This)i(c)o(hapter)f -(describ)q(es)h(ho)o(w)f(to)f(sp)q(ecialize)k(a)d(class)g(b)o(y)g(adding)h -(sub)q(classes)g(corresp)q(onding)g(to)e(the)37 1490 y(conditions)i(in)g(a)e -(conditional)j(statemen)o(t.)i(F)l(or)15 b(eac)o(h)h(condition,)h(a)e(sub)q -(class)i(\(represen)o(ting)f(a)f(subt)o(yp)q(e\))37 1547 y(is)j(created)f(who\ -se)g(design)h(abstraction)e(implies)j(that)d(condition.)27 b(In)17 b fi(C++)p -fl(,)f(the)h(class)h(proto)q(col)e(is)i(not)37 1603 y(su\016cien)o(t)j(to)e -(describ)q(e)i(this)f(design)h(abstraction)e(b)q(ecause)h(it)g(do)q(es)g(not) -f(mak)o(e)g(explicit)j(the)e(in)o(v)m(arian)o(t)37 1660 y(conditions)e(of)d -(a)h(class.)23 b(T)l(o)16 b(represen)o(t)g(this)g(design)h(information,)g(the) -f(class)g(proto)q(col)g(is)h(supplemen)o(ted)37 1716 y(with)f(a)f fi(class)g -(invariant)p fl(.)108 1773 y(Sp)q(ecializi)q(ng)j(a)d(class)g(and)h(simplifyi\ -ng)h(conditionals)g(in)o(v)o(olv)o(es)f(sev)o(eral)f(steps:)93 1858 y(1.)22 b -(c)o(ho)q(osing)16 b(a)f(conditional)h(whose)g(conditions)g(suggest)f(sub)q -(classes)93 1949 y(2.)22 b(for)g(eac)o(h)h(condition)h(in)g(the)f(conditional\ -,)j(creating)d(a)f(sub)q(class)i(with)f(a)g(class)g(in)o(v)m(arian)o(t)g(that) -151 2005 y(matc)o(hes)15 b(the)g(condition)93 2095 y(3.)22 b(cop)o(ying)14 b -(the)f(b)q(o)q(dy)h(of)f(the)h(conditional)h(to)d(eac)o(h)i(sub)q(class,)g -(and)g(in)g(eac)o(h)f(sub)q(class)i(simplifying)g(the)151 2152 y(conditional) -i(based)f(on)f(the)g(in)o(v)m(arian)o(t)h(that)e(is)i(true)f(for)g(the)g(sub) -q(class)93 2242 y(4.)22 b(sp)q(ecializin)q(g)17 b(some)d(\(or)f(all\))i(expre\ -ssions)h(that)d(create)i(instances)g(of)f(the)g(sup)q(erclass.)21 b(Sp)q(ecia\ -lizi)q(ng)151 2299 y(an)16 b(expression)h(in)o(v)o(olv)o(es)g(replacing)h(an) -e(expression)h(that)e(creates)h(an)g(instance)h(of)f(the)g(sup)q(erclass)151 -2355 y(with)j(an)f(expression)h(that)e(creates)h(an)g(instance)h(of)f(one)h -(of)e(the)i(newly)g(created)f(sub)q(class.)30 b(This)151 2412 y(can)14 b(b)q -(e)h(done)f(safely)h(only)f(if)h(all)g(instances)g(created)f(b)o(y)g(the)g -(expression)h(are)e(kno)o(wn)h(to)g(satisfy)f(the)151 2468 y(in)o(v)m(arian)o -(t)j(de\014ned)g(on)g(a)e(sub)q(class.)108 2554 y(Cho)q(osing)19 b(the)f(`cor\ -rect')g(conditional)i(up)q(on)f(whic)o(h)g(to)f(partition)h(a)f(class)h(\(ste\ -p)f(one\))g(dep)q(ends)j(on)37 2610 y(the)14 b(abstraction)e(that)g(the)h(des\ -igner)h(in)o(tends.)20 b(A)13 b(to)q(ol)g(could)h(assist)f(the)g(designer)g -(in)h(making)f(this)h(c)o(hoice)952 2760 y(71)g eop bop 37 42 a fl(b)o(y)15 b -(displa)o(ying)h(the)e(conditionals)i(that)e(app)q(ear)g(in)i(mem)o(b)q(er)e -(functions)h(of)f(the)h(class,)f(highligh)o(ting)j(those)37 98 y(conditionals) -g(that)e(app)q(ear)g(most)g(frequen)o(tly)l(.)108 154 y(This)j(c)o(hapter)e -(de\014nes)i(refactorings)f(for)f(steps)h(t)o(w)o(o)f(through)g(four.)25 b -(These)17 b(steps)g(are)g(de\014ned)h(here)37 211 y(as)f(separate)f(refactori\ -ngs,)g(mostly)g(for)g(clarit)o(y)h(but)f(also)h(b)q(ecause)g(they)g(could)h -(b)q(e)f(in)o(v)o(ok)o(ed)g(separately)l(.)37 267 y(Sp)q(ecializi)q(ng)d(inst\ -ances)e(can)f(sometimes)g(b)q(e)h(done)f(automatically)l(,)h(but)f(in)h(some) -f(cases)g(an)g(instance)h(of)e(the)37 324 y(sup)q(erclass)17 b(migh)o(t)f(sat\ -isfy)g(the)f(in)o(v)m(arian)o(ts)i(of)e(sev)o(eral)h(sub)q(classes.)23 b(Cho) -q(osing)16 b(among)f(these)h(sub)q(classes)37 380 y(ma)o(y)f(b)q(e)h(done)f -(incorrectly)i(without)e(some)g(input)h(from)e(the)i(user.)108 437 y(The)e -(tec)o(hniques)i(de\014ned)f(in)g(this)f(c)o(hapter)g(rely)h(hea)o(vily)g(on) -f(data)f(\015o)o(w)g(analysis)i(to)f(c)o(hec)o(k)g(that)f(class)37 493 y(in)o -(v)m(arian)o(ts)18 b(hold)g(on)g(instances)g(of)e(a)h(class.)27 b(Class)17 b -(in)o(v)m(arian)o(ts)h(and)f(data)g(\015o)o(w)g(analysis)h(are)f(describ)q -(ed,)37 550 y(resp)q(ectiv)o(ely)l(,)22 b(in)d(sections)g(7.2)f(and)h(7.3.)29 -b(Sections)20 b(7.4)d(through)i(7.9)e(describ)q(e)k(ho)o(w)d(to)g(use)h(data) -f(\015o)o(w)37 606 y(analysis)g(to)e(handle)i(sev)o(eral)f(imp)q(ortan)o(t)f -(issues)i(regarding)e(class)h(in)o(v)m(arian)o(ts,)h(and)f(de\014ne)g(refacto\ -rings.)37 663 y(Section)e(7.10)c(discusses)k(p)q(ossible)g(extensions)f(to)e -(the)h(sub)q(classing)i(algorithms)e(de\014ned)i(here;)e(other)g(uses)37 719 y -(of)i(class)h(in)o(v)m(arian)o(ts)g(in)g(the)f(ob)s(ject)f(orien)o(ted)i(lite\ -rature)g(are)f(also)g(discussed.)108 775 y(This)f(thesis)h(sp)q(eci\014cally) -h(addresses)e(ho)o(w)g(class)g(in)o(v)m(arian)o(ts)g(can)g(b)q(e)g(used)h(for) -e(simplifying)j(condition-)37 832 y(als)j(in)f(mem)o(b)q(er)h(functions)f(of) -g(newly)h(created)f(sub)q(classes.)29 b(Class)18 b(in)o(v)m(arian)o(ts)g(coul\ -d)h(b)q(e)g(applied)h(more)37 888 y(generally)d(in)f(refactoring,)e(whic)o -(h)i(is)g(an)f(area)g(for)f(future)i(researc)o(h.)37 1032 y fd(7.2)70 b(Class) -22 b(In)n(v)l(arian)n(ts)37 1133 y fl(An)f fi(invariant)f fl(is)h(something)f -(that)g(remains)h(constan)o(t)e(\(i.e.)35 b(do)q(es)21 b(not)f(c)o(hange\).) -35 b(A)20 b fi(class)g(invariant)37 1189 y fl(is)g(a)e(predicate)i(whose)e -(only)i(free)f(v)m(ariables)h(are)e(mem)o(b)q(er)h(v)m(ariables)h(of)e(the)h -(class.)31 b(A)19 b(class)g(in)o(v)m(arian)o(t)37 1246 y(expresses)d(general) -g(consistency)g(constrain)o(ts)f(that)f(apply)i(to)f(ev)o(ery)g(instance)h -(of)f(a)f(class.)108 1302 y(In)h(general,)g(determining)h(if)f(an)f(arbitrary) -g(predicate)i(is)f(a)f(class)h(in)o(v)m(arian)o(t)g(is)g(undecidable.)22 b -(F)l(or)14 b(the)37 1359 y(purp)q(oses)j(of)f(this)h(thesis,)g(an)g(extremely) -f(narro)o(w)g(set)g(of)g(class)h(in)o(v)m(arian)o(ts)g(are)f(considered)1684 -1342 y fs(1)1721 1359 y fl(whic)o(h)h(are)37 1415 y(of)e(the)h(form:)133 1522 -y fg(<memberVariable>)22 b(==)h(<value>)37 1628 y fl(where:)157 1734 y fg(mem\ -berVariable:)45 b(a)24 b(member)f(variable)g(of)h(the)f(class)157 1791 y(valu\ -e:)261 b(an)24 b(integer,)f(or)g(the)h(value)f(of)h(an)f(enumerated)g(type.) -108 1897 y fl(F)l(or)15 b(the)g(class)g(in)o(v)m(arian)o(t)h(to)f(b)q(e)h(cor\ -rect:)106 1991 y fj(\017)22 b fl(the)17 b fi(cr)n(e)n(ate)g fl(pro)q(cedure)g -(for)g(the)g(class)g(\(a)f(constructor)g(function)i(in)g(C++\),)f(when)g(appl\ -ied,)i(m)o(ust)151 2047 y(yield)e(a)e(state)f(satisfying)i(the)f(class)h(in)o -(v)m(arian)o(t)106 2141 y fj(\017)22 b fl(the)14 b(class)g(in)o(v)m(arian)o -(t)h(m)o(ust)e(hold)i(throughout)e(the)h(remainder)g(of)g(the)f(lifetime)j -(of)d(eac)o(h)h(instance)h(of)151 2197 y(the)g(class.)108 2291 y(The)f(algori\ -thm)g(for)g(sub)q(classing)i(and)e(simplifying)i(conditionals,)g(outlined)f -(in)g(section)g(7.1,)e(in)o(v)o(olv)o(es)37 2348 y(class)j(in)o(v)m(arian)o -(ts)g(at)e(sev)o(eral)i(steps.)k(Tw)o(o)14 b(imp)q(ortan)o(t)h(problems)g(ari\ -se)h(regarding)f(class)h(in)o(v)m(arian)o(ts:)93 2441 y(1.)22 b(Ho)o(w)15 b -(can)g(it)g(b)q(e)h(determined)h(whether)e(a)g(predicate)h(is)g(a)f(class)g -(in)o(v)m(arian)o(t)h(for)f(a)g(class?)37 2523 y 750 2 v 89 2549 a fu(1)107 -2565 y fp(There)e(are)g(decision)i(pro)q(cedures)g(for)d(less)i(restrictiv)o -(e)h(sets)e(of)g(class)h(in)o(v)n(arian)o(ts.)952 2760 y fl(72)g eop bop 93 42 -a fl(2.)22 b(Giv)o(en)16 b(a)f(correct)f(class)i(in)o(v)m(arian)o(t,)f(ho)o -(w)g(can)g(it)h(b)q(e)g(used,)f(to:)170 129 y(\(a\))22 b(simplify)17 b(a)e -(conditional)i(statemen)o(t?)168 196 y(\(b\))22 b(sp)q(ecialize)c(an)d(expres\ -sion)h(that)f(creates)g(an)g(instance)h(of)f(the)g(sup)q(erclass?)108 284 y -(None)g(of)g(these)g(issues)h(is)g(decidable,)h(in)f(general.)k(Ho)o(w)o(ev)o -(er,)14 b(they)h(are)g(decidable)i(in)f(some)f(cases,)g(as)37 340 y(discussed) -i(later)e(in)h(this)g(c)o(hapter.)37 459 y fe(7.2.1)56 b(Example)37 545 y fl -(T)l(o)17 b(illustrate)h(ho)o(w)e(a)g(class)i(in)o(v)m(arian)o(t)f(could)h -(b)q(e)f(used)g(to)g(simplify)h(a)e(conditional,)j(recall)f(the)f(example)37 -601 y(sho)o(wn)i(in)g(Figure)g(7.1)e(and)i(\014rst)f(presen)o(ted)h(in)h(c)o -(hapter)e(3.)30 b(In)19 b(the)g fi(T)m(yp)n(e)n(d)f(Smal)r(ltalk)g fl(\(TS\)) -g(compiler,)37 658 y(instances)i(of)e(the)h ff(Flo)o(wNo)q(de)f fl(class,)i -(represen)o(ting)f(a)f(basic)i(blo)q(c)o(k,)g(w)o(ere)e(con)o(tainers)h(of)f -(a)g(sequence)i(of)37 714 y(straigh)o(t)d(line)i(co)q(de)f(\(assignmen)o(ts\)) -e(ending)j(with)e(a)g(statemen)o(t)g(that)f(alters)h(the)h(\015o)o(w)f(of)f -(con)o(trol.)26 b(The)37 771 y(ending)19 b(statemen)o(t)d(in)i(the)g(sequence) -g(could)h(b)q(e)f(a)f(return)g(statemen)o(t,)f(a)h(conditional)i(jump)f(state\ -men)o(t)37 827 y(or)e(an)g(unconditional)i(jump)e(statemen)o(t.)21 b(In)16 b -(the)g(early)g(designs,)h(it)f(had)g(not)g(b)q(een)h(clear)f(that)f(the)h(t)o -(yp)q(e)37 884 y(of)i(the)h(ending)g(statemen)o(t)e(w)o(as)h(an)g(imp)q(ortan) -o(t)g(discriminator)h(among)e ff(Flo)o(wNo)q(des)p fl(.)30 b(Ho)o(w)o(ev)o -(er,)18 b(as)f(the)37 940 y(design)h(matured,)e(the)h(implemen)o(tation)h(of) -e ff(Flo)o(wNo)q(de)g fl(w)o(as)g(man)o(ually)h(refactored:)22 b ff(Flo)o(wNo) -q(de)17 b fl(b)q(ecame)37 996 y(an)f(abstract)e(sup)q(erclass)j(and)e(the)h -(concrete)f(sub)q(classes)i ff(UncondJumpFlo)o(wNo)q(de)p fl(,)e ff(CondJumpF\ -lo)o(wNo)q(de)37 1053 y fl(and)h ff(ReturnFlo)o(wNo)q(de)h fl(w)o(ere)e(added\ -.)108 1109 y(The)20 b(v)m(alue)i(of)e(the)g(op)q(co)q(de)h(in)g(the)f(ending) -h(statemen)o(t)e(is)i(represen)o(ted)g(as)f(the)g(mem)o(b)q(er)g(v)m(ariable) -37 1166 y fi(\014nal)s 14 2 v 13 w(statement)c fl(in)g(the)g ff(Flo)o(wNo)q -(de)g fl(class.)22 b(Supp)q(ose)17 b(that)e(the)h(v)m(alue)h(of)e fi(\014nal) -s 14 2 v 13 w(statement)g fl(is)h(assigned)h(in)37 1222 y(the)12 b fi(cr)n -(e)n(ate)e fl(pro)q(cedure)i(of)f(the)g ff(Flo)o(wNo)q(de)g fl(class)g(\(and) -g(its)h(sub)q(classes,)g(and)f(that)g(there)g(are)g(no)g(assignmen)o(ts)37 -1279 y(to)22 b(c)o(hange)g(the)g(v)m(alue)h(of)e(that)h(mem)o(b)q(er)g(v)m -(ariable.)41 b(Then,)24 b(in)f(the)f ff(Flo)o(wNo)q(de)g fl(example)h(ab)q -(o)o(v)o(e,)f(the)37 1335 y(predicate)17 b(assigned)e(as)g(the)g(class)h(in)o -(v)m(arian)o(t)g(of)f(the)g(class)g ff(CondJumpFlo)o(wNo)q(de)g fl(w)o(ould)h -(b)q(e:)157 1414 y fg(final_statement)22 b(==)h(conditional_jump)108 1492 y fl -(Note)15 b(that)g(this)h(predicate)g(is)g(sp)q(eci\014ed)h(in)g(terms)d(of)h -(a)g(\014xed)h(v)m(alue)h(of)e(the)g(mem)o(b)q(er)h(v)m(ariable.)22 b(This)37 -1548 y(in)o(v)m(arian)o(t)13 b(could)f(b)q(e)g(used)g(to)f(simplify)i(the)f -(conditional)h(expression)f(in)h(the)e fi(optimize)h fl(function,)h(remo)o -(ving)37 1605 y(the)i(conditional)g(test)f(and)g(all)h(other)e(co)q(de)i(exce\ -pt)f(a)g(co)q(de)h(segmen)o(t)e(\(S1)h(in)g ff(CondJumpFlo)o(wNo)q(de)p fl -(,)g(S2)g(in)37 1661 y ff(UncondJumpFlo)o(wNo)q(de)i fl(or)f(S3)g(in)h(the)f -ff(ReturnFlo)o(wNo)q(de)i fl(class\).)108 1718 y(In)f(general,)f(man)o(y)g -(conditions)h(in)g(a)f(conditional)i(statemen)o(t)d(are)h(of)g(the)g(form:) -157 1796 y fg(<memberVariable>==<value>)37 1875 y fl(where)j fi(value)f fl -(is)h(a)f(constan)o(t.)26 b(The)18 b(v)m(alue)g(of)f fi(memb)n(erV)m(ariable) -g fl(is)g(often)h(set)f(b)o(y)g(an)g(assignmen)o(t)h(whose)37 1931 y(righ)o -(t-hand-side)g(is)f(either)f(a)g(constan)o(t)f(or)h(a)f(parameter)h(to)f(the) -h(function)h(con)o(taining)g(the)f(assignmen)o(t.)37 1988 y(In)h(the)e(latter) -g(case,)h(the)f(argumen)o(t)g(in)h(calls)h(to)e(the)h(function)g(is)g(lik)o -(ely)h(to)e(b)q(e)h(a)g(constan)o(t.)k(These)c(cases)37 2044 y(are)f(lik)o -(ely)i(to)e(mak)o(e)g(up)g(the)h(v)m(ast)e(ma)s(jorit)o(y)g(of)h(conditional) -i(simpli\014cations,)1413 2027 y fs(2)1450 2044 y fl(and)e(are)g(easy)g(to)f -(c)o(hec)o(k.)37 2163 y fe(7.2.2)56 b(Discussion)37 2249 y fl(Data)12 b(\015o) -o(w)g(analysis)h(tec)o(hniques)h(are)e(b)q(oth)h(safe)f(and)g(p)q(o)o(w)o(erf\ -ul)h(enough)g(to)f(handle)i(some)e(cases)g(in)o(v)o(olving)37 2305 y(predicat\ -es)h(b)q(eing)g(asserted)e(as)h(class)g(in)o(v)m(arian)o(ts.)19 b(The)12 b -(follo)o(wing)g(section)h(pro)o(vides)f(bac)o(kground)f(on)h(data)37 2362 y -(\015o)o(w)j(analysis.)37 2430 y 750 2 v 89 2457 a fu(2)107 2473 y fp(Determi\ -ning)e(what)e(p)q(ercen)o(tage)h(of)f(conditionals)j(are)d(co)o(v)o(ered)h -(b)o(y)f(these)g(cases)h(w)o(ould)f(require)i(an)e(exhaustiv)o(e)i(study)f -(of)37 2519 y(programs,)h(b)q(ey)o(ond)h(the)e(scop)q(e)h(of)f(this)h(researc) -o(h.)18 b(Soft)o(w)o(are)12 b(engineering)j(studies)e(of)f(refactoring)i(larg\ -e)f(programs,)g(written)37 2564 y(in)f(sev)o(eral)g(practical)h(\(alb)q(eit)f -(complicated\))h(languages)g(with)e(sev)o(eral)h(di\013eren)o(t)h(programming) -f(st)o(yles,)g(is)f(an)h(area)f(for)f(future)37 2610 y(researc)o(h)k(noted)g -(in)g(c)o(hapter)f(11.)952 2760 y fl(73)g eop bop 73 0 a - 28483502 22365798 5920358 28680847 34403860 51046645 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Helvetica-Bold Courier-Bold -%%Pages: 1 -%%BoundingBox: 90 436 523 776 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 348 966 ] concat -%I -[ -(BEFORE:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 1 -6 ] concat -%I -158 461 158 461 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 195 937 ] concat -%I -[ -(FlowNode:) -( enum {conditional_jump, unconditional_jump,) -( return_statement} final_statement;) -( void optimize\(\) {) -( if \(final_statement == conditional_jump\)) -( <code segment S1>) -( else if \(final_statement == unconditional_jump\)) -( <code segment S2>) -( else if \(final_statement == return_statement\)) -( <code segment S3>) -( }) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-bold-r-*-140-* -/Helvetica-Bold 14 SetF -%I t -[ 1 0 0 1 351 794 ] concat -%I -[ -(AFTER:) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 348 763 ] concat -%I -[ -(FlowNode) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 114.711 718.229 ] concat -%I -[ -( CondJumpFlowNode:) -() -( \(class invariant:) -( final_statement ==) -( conditional_jump\)) -() -( void optimize\(\) {) -( <code segment S1>) -( }) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -1 -14 ] concat -%I -332 773 201 741 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -12 -14 ] concat -%I -431 774 561 742 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -1 -14 ] concat -%I -460 770 460 771 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 9 -4 ] concat -%I -460 770 460 771 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -1 -14 ] concat -%I -376 763 376 677 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 300.458 653.494 ] concat -%I -[ -( UncondJumpFlowNode:) -() -( \(class invariant:) -( final_statement ==) -( unconditional_jump\)) -() -( void optimize\(\) {) -( <code segment S2>) -( }) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 477.53 718.88 ] concat -%I -[ -( ReturnFlowNode:) -() -( \(class invariant:) -( final_statement ==) -( return_statement\)) -() -( void optimize\(\) {) -( <code segment S3>) -( }) -] Text -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 455 1545 a fh(Figure)18 b(7.1)p fl(:)h(Simplifying)f(Mem)o(b)q -(er)e(F)l(unction)g fi(optimize)37 1678 y fd(7.3)70 b(Bac)n(kground:)33 b(Dat\ -a)23 b(Flo)n(w)f(Analysis)37 1779 y fl(A)h(refactoring)g(that)e(simpli\014es) -k(a)e(conditional)h(statemen)o(t)e(can)h(b)q(e)g(though)o(t)f(of)g(as)g(a)h -(kind)h(of)e(co)q(de)37 1836 y(optimization.)j(Some)16 b(tec)o(hniques)i(that) -d(help)j(in)f(optimizing)h(co)q(de)f(for)e(compilers)j(can)e(also)h(b)q(e)g -(applied)37 1892 y(in)c(refactoring.)314 1876 y fs(3)352 1892 y fl(Optimizing) -g(a)e(program)f(in)o(v)o(olv)o(es)i(t)o(w)o(o)e(tasks:)18 b(analyzing)12 b -(the)f(program)g(and)g(mo)q(difying)37 1949 y(it.)21 b(In)15 b(general,)h(the) -f(analysis)h(step)f(is)h(the)f(most)g(di\016cult.)108 2005 y(Lo)q(cal)g(optim\ -izations)f(are)f(c)o(hanges)h(that)f(are)g(applied)j(to)d(sequen)o(tial)h(co) -q(de)h(segmen)o(ts)e(\()p fi(b)n(asic)g(blo)n(cks)p fl(\).)37 2062 y(They)j -(are)f(the)g(easiest)g(optimizations)h(to)e(implemen)o(t)j(and,)e(un)o(til)h -(recen)o(tly)l(,)f(compilers)i(rarely)e(did)h(more)37 2118 y(than)g(lo)q(cal) -g(optimization.)22 b(Examples)15 b(of)g(lo)q(cal)i(optimizations)f(are)f(ev)m -(aluating)i(\(within)f(a)f(basic)h(blo)q(c)o(k\))37 2175 y(constan)o(t)f(expr\ -essions)h(in)g(adv)m(ance)g(and)f(eliminating)j(some)c(useless)j(instructions\ -.)37 2256 y 750 2 v 89 2283 a fu(3)107 2298 y fp(Not)12 b(all)j(tec)o(hniques) -g(apply)g(in)f(refactoring,)g(since)g(the)f(motiv)n(ation)i(for)e(refactoring) -i(is)e(di\013eren)o(t)i(from)e(the)g(motiv)n(ation)37 2344 y(for)i(optimizing) -i(co)q(de)e(in)h(compilers.)23 b(In)15 b(compilers)i(the)d(optimizations)k -(are)d(made)g(to)f(increase)i(the)f(sp)q(eed)g(or)g(reduce)g(the)37 2390 y -(memory)k(size)g(of)e(an)i(implemen)o(tation;)k(the)18 b(resultan)o(t)i(co)q -(de)e(is)h(not)f(mean)o(t)g(to)g(b)q(e)g(h)o(uman)h(readable.)34 b(Some)18 b -(compiler)37 2435 y(optimization)q(s)d(restructure)e(the)f(co)q(de)g(in)h(a)f -(w)o(a)o(y)g(that)g(mak)o(es)h(it)f(more)h(di\016cult)g(to)f(understand)i(b)o -(y)f(a)f(h)o(uman)h(designer.)18 b(By)37 2481 y(con)o(trast,)12 b(the)f(motiv) -n(ation)h(for)f(refactoring)h(is)f(to)g(pro)q(duce)g(a)g(design)h(than)g(can) -f(b)q(e)g(more)f(clearly)j(understo)q(o)q(d)f(b)o(y)f(a)g(designer.)952 2760 y -fl(74)g eop bop 108 42 a fl(Global)15 b(optimizations)g(are)e(more)h(complex) -h(than)f(lo)q(cal)h(optimizations,)g(b)q(ecause)g(they)f(ha)o(v)o(e)f(to)h -(deal)37 98 y(with)21 b(the)f(\015o)o(w)g(of)g(con)o(trol)f(across)h(basic)h -(blo)q(c)o(ks.)35 b(Refactorings)20 b(that)g(simplify)i(conditionals)g(can)e -(b)q(e)37 154 y(though)o(t)15 b(of)g(as)g(a)f(kind)j(of)d(global)i(optimizati\ -on.)108 211 y(T)l(o)c(optimize)h(a)f(program)f(or)g(a)h(pro)q(cedure)h(within) -g(a)f(program,)f(it)i(is)f(usually)i(necessary)e(to)f(determine)37 267 y(the) -j(sets)g(of)f(v)m(ariables)j(read)d(and)h(up)q(dated)h(b)o(y)f(that)f(pro)q -(cedure.)20 b(Unless)15 b(these)f(sets)g(can)g(b)q(e)h(determined,)37 324 y -(w)o(orst)e(case)g(assumptions)h(m)o(ust)f(b)q(e)i(made.)k(F)l(or)13 b(exampl\ -e,)h(if)h(the)e(pro)q(cedure)i(includes)h(a)d(call)i(to)e(another)37 380 y -(pro)q(cedure,)18 b(in)g(the)e(absence)i(of)e(information)h(ab)q(out)f(the)h -(called)h(pro)q(cedure)g(it)f(m)o(ust)f(b)q(e)h(assumed)g(that)37 437 y(all)h -(v)m(ariables)f(visible)h(to)e(the)g(called)i(pro)q(cedure)f(will)h(b)q(e)f -(read)f(and)g(up)q(dated.)24 b(This)17 b(assumption,)f(while)37 493 y(safe,)e -(prev)o(en)o(ts)g(man)o(y)g(optimizations.)20 b(One)15 b(can)g(exp)q(ect)g -(to)e(do)i(b)q(etter)f(if)h(the)f(e\013ects)g(of)g(a)g(call)h(are)f(more)37 -550 y(carefully)i(analyzed.)21 b(The)15 b(analysis)g(of)g(the)f(e\013ects)h -(of)f(a)g(call)i(is)f(generally)h(termed)f fi(interpr)n(o)n(c)n(e)n(dur)n(al) -g(data)37 606 y(\015ow)i(analysis.)i fl([1)o(,)c(44)o(,)g(106)o(])37 728 y fe -(7.3.1)56 b(In)n(terpro)r(cedural)17 b(Data)i(Flo)n(w)g(Analysis)37 814 y fl -(A)i(pro)q(cedure)g(or)f(subprogram)f(can)h(b)q(e)h(represen)o(ted)g(as)f(a)g -fi(data)h(\015ow)g(gr)n(aph)g fl(of)f(basic)g(blo)q(c)o(ks,)i(where)37 870 y -(directed)c(edges)f(connecting)h(the)f(basic)g(blo)q(c)o(ks)h(represen)o(t)e -(the)h(\015o)o(w)f(of)h(con)o(trol)f(within)i(the)f(pro)q(cedure.)37 927 y -(The)d(calling)h(relationships)g(among)e(pro)q(cedures)i(in)f(a)f(program)f -(can)i(b)q(e)g(represen)o(ted)g(using)g(a)f fi(c)n(al)r(l)h(gr)n(aph)p fl(,) -37 983 y(where)i(eac)o(h)f(no)q(de)h(represen)o(ts)f(a)g(pro)q(cedure)h(and)g -(directed)g(arcs)f(represen)o(t)g(calls)h(b)q(et)o(w)o(een)g(pro)q(cedures.) -108 1039 y(The)i(\015o)o(w)f(of)g(con)o(trol)g(for)g(the)g(en)o(tire)h(progra\ -m)f(can)g(b)q(e)h(represen)o(ted)g(using)g(a)g fi(data)h(\015ow)f(gr)n(aph)g -fl(for)37 1096 y(eac)o(h)k(pro)q(cedure)f(and)h(a)e fi(c)n(al)r(l)h(gr)n(aph) -h fl(that)e(in)o(terrelates)h(the)g(pro)q(cedures.)38 b(It)21 b(is)h(not)e -(alw)o(a)o(ys)h(p)q(ossible)37 1152 y(to)d(determine)h(statically)g(what)f -(sequence)h(of)f(basic)h(blo)q(c)o(ks)g(a)f(program)f(will)j(execute;)g(there\ -fore,)e(it)h(is)37 1209 y(usually)e(assumed)e(that)g(all)h(paths)f(in)h(eac)o -(h)f(data)g(\015o)o(w)g(graph)f(are)h(p)q(ossible.)108 1265 y(Tw)o(o)j(useful) -i(sets)e(to)g(asso)q(ciate)h(with)g(eac)o(h)g(pro)q(cedure)h(call)g(are)e fi -(Def)h fl(and)g fi(Use)p fl(.)30 b(A)19 b fi(Def)g fl(set)f(is)h(the)37 1322 y -(set)e(of)g(v)m(ariables)h(that)e(ma)o(y)h(b)q(e)g(de\014ned)i(\(assigned\))e -(during)h(a)e(call,)i(and)g(the)f fi(Use)f fl(set)h(is)g(the)g(set)g(of)g(all) -37 1378 y(v)m(ariables)h(or)d(named)i(constan)o(ts)e(that)g(ma)o(y)g(b)q(e)i -(used)f(\(read\))g(in)h(the)f(call.)23 b(The)16 b fi(Def)g fl(and)g fi(Use)g -fl(sets)f(for)h(a)37 1435 y(pro)q(cedure)i(can)f(b)q(e)g(computed)g(from)e -(its)i(data)f(\015o)o(w)g(graph.)24 b(The)16 b(sets)g(de\014ned)i(for)e(a)g -(called)j(pro)q(cedure)37 1491 y(can)d(help)g(determine)h(what)d(optimization\ -s)i(are)f(p)q(ossible)i(in)f(the)f(pro)q(cedures)h(that)f(call)h(it.)108 1548 -y(Some)21 b(data)g(\015o)o(w)f(problems)i(can)g(b)q(e)f(describ)q(ed)i(as)e fi -(any)h(p)n(ath)f fl(problems,)i(where)f(the)f(analysis)h(is)37 1604 y(concern\ -ed)e(with)e(whether)h(a)f(prop)q(ert)o(y)f(holds)i(on)f(one)h(or)f(more)f(p)q -(ossible)j(paths)e(through)g(a)g(program.)37 1660 y(Other)f(data)f(\015o)o -(w)f(problems)i(are)f fi(al)r(l)h(p)n(ath)g fl(problems,)f(where)h(it)f(is)h -(necessary)g(to)e(determine)i(whether)g(a)37 1717 y(prop)q(ert)o(y)e(holds)h -(o)o(v)o(er)f(all)h(paths.)108 1773 y(Some)h(data)e(\015o)o(w)h(problems)i -(are)e(solv)o(ed)h(using)g fi(forwar)n(d)h(\015ow)f fl(analysis,)g(follo)o -(wing)g(the)g(direction)h(of)37 1830 y(\015o)o(w)d(in)h(a)f(program.)j(Consid\ -er,)e(for)e(example,)i(computing)f(for)g(a)f(v)m(ariable)j(reference)f(the)f -(set)g(of)f(assign-)37 1886 y(men)o(ts)19 b(to)f(that)f(v)m(ariable)j(\(the)f -fi(r)n(e)n(aching)f(de\014nitions)p fl(\))f(that)h(ma)o(y)g(precede)i(it)e -(without)h(an)f(in)o(terv)o(ening)37 1943 y(reassignmen)o(t.)i(This)14 b(anal\ -ysis)g(can)g(b)q(e)g(done)g(b)o(y)f(\014nding)i(all)f(assignmen)o(ts)g(to)e -(the)i(v)m(ariable,)h(and)f(mo)o(ving)37 1999 y(forw)o(ard)g(through)h(the)h -(\015o)o(w)e(graph)h(to)g(see)g(if)h(the)f(v)m(ariable)i(reference)f(in)g(que\ -stion)f(can)h(b)q(e)g(reac)o(hed.)108 2056 y(Other)j(data)e(\015o)o(w)h(probl\ -ems)h(are)f(solv)o(ed)g(using)h fi(b)n(ackwar)n(d)h(\015ow)e fl(analysis,)h -(where)g(the)f(direction)i(of)37 2112 y(analysis)g(is)e(opp)q(osite)h(the)g -(\015o)o(w)e(of)h(con)o(trol)g(of)g(the)h(program.)28 b(F)l(or)17 b(example,) -j(to)d(construct)h(the)h(set)f(of)37 2169 y(references)g(to)f(a)g(v)m(ariable) -h(that)f(ma)o(y)f(follo)o(w)h(a)g(particular)h(assignmen)o(t)f(\(often)g(call\ -ed)h(a)f fi(de\014nition-use)37 2225 y(chain)f fl(or)e fi(du-chain)p fl(\),)h -(analysis)h(can)g(b)q(e)g(done)f(b)o(y)g(\014nding)i(all)f(references)g(to)e -(that)h(v)m(ariable,)h(and)g(mo)o(ving)37 2281 y(bac)o(kw)o(ard)c(through)g -(the)h(\015o)o(w)f(of)g(con)o(trol)g(to)f(determine)j(if)f(the)f(assignmen)o -(t)h(in)g(question)g(can)f(b)q(e)h(reac)o(hed.)108 2338 y(Man)o(y)j(data)f -(\015o)o(w)h(problems)h(can)g(b)q(e)g(solv)o(ed)f(b)o(y)h(asso)q(ciating)f -(with)h(eac)o(h)g(basic)g(blo)q(c)o(k)g(or)f(pro)q(cedure)37 2394 y(a)f(serie\ -s)h(of)f(\\sets":)106 2488 y fj(\017)22 b fl(the)13 b fi(Gen)g fl(and)g fi -(Kil)r(le)n(d)f fl(sets,)h(whic)o(h)h(are)f(\(resp)q(ectiv)o(ely\))h(the)f -(sets)g(of)g(de\014nitions)h(that)f(are)f(generated)151 2545 y(b)o(y)17 b(\(o\ -r)g(in)o(v)m(alidated)i(b)o(y\))e(a)g(blo)q(c)o(k.)27 b(F)l(or)17 b(example,) -i(if)e(the)h(blo)q(c)o(k)g(con)o(tained)g(a)f(single)i(assignmen)o(t)151 2601 -y(statemen)o(t)14 b(of)h(the)g(form:)952 2760 y(75)g eop bop 270 42 a fg(X)24 -b(=)g(2;)151 148 y fl(then)17 b(the)g fi(Gen)g fl(set)g(\(for)f(v)m(ariable)i -(X\))e(w)o(ould)i(the)f(v)m(alue)h(2,)f(and)g(the)g fi(Kil)r(le)n(d)f fl(set) -g(\(for)g(v)m(ariable)j(X\))151 205 y(w)o(ould)d(b)q(e)g(all)g(other)f(v)m -(alues)h(of)f(X)g(that)f(migh)o(t)h(ha)o(v)o(e)g(reac)o(hed)h(the)f(blo)q(c)o -(k.)106 297 y fj(\017)22 b fl(the)c fi(In)e fl(and)i fi(Out)f fl(sets,)h(whic) -o(h)g(are)f(\(resp)q(ectiv)o(ely\))h(the)g(sets)f(of)g(de\014nitions)i(that)e -(reac)o(h)g(\(or)f(exit\))151 353 y(a)f(blo)q(c)o(k.)23 b(These)16 b(sets)f -(are)g(constructed)h(from)f fi(Gen)g fl(and)h fi(Kil)r(le)n(d)f fl(sets)g(of) -h(blo)q(c)o(ks)g(and)g(the)g(program)151 409 y(\015o)o(w)f(relationships)i -(b)q(et)o(w)o(een)e(basic)h(blo)q(c)o(ks.)108 498 y(Solving)j(a)e(particular) -h(problem)g(in)o(v)o(olv)o(es)g(de\014ning)g(and)g(generating)g(the)f fi(Gen) -g fl(and)g fi(Kil)r(le)n(d)g fl(sets)g(for)37 555 y(eac)o(h)i(basic)g(blo)q -(c)o(k,)h(and)f(c)o(haracterizing)g(the)g(problem)g(as)g(either)g(an)f(an)o -(y)h(path)f(or)g(all)i(path)e(problem,)37 611 y(and)f(as)f(either)h(a)f(forw) -o(ard)f(\015o)o(w)h(or)g(bac)o(kw)o(ard)f(\015o)o(w)h(problem.)24 b(F)l(or)15 -b(example,)j(the)e(reac)o(hing)h(de\014nitions)37 668 y(problem)h(is)g(an)f -(an)o(y)g(path,)g(forw)o(ard)f(\015o)o(w)g(problem.)27 b(The)17 b fi(Gen)g fl -(set)g(for)f(a)h(blo)q(c)o(k)h(is)f(de\014ned)i(to)d(con)o(tain)37 724 y(the) -i(de\014nitions)i(that)c(app)q(ear)i(in)h(the)e(blo)q(c)o(k)i(and)f(reac)o -(h)f(the)h(end)g(of)f(the)h(blo)q(c)o(k.)28 b(The)18 b fi(Kil)r(le)n(d)e fl -(set)i(for)f(a)37 781 y(blo)q(c)o(k)e(is)f(de\014ned)h(to)e(con)o(tain)h(the) -g(de\014nitions)h(that)e(app)q(ear)h(somewhere)g(in)h(the)e(blo)q(c)o(k)i(but) -f(do)f(not)h(reac)o(h)37 837 y(the)i(end)g(of)e(the)i(blo)q(c)o(k.)21 b(By)15 -b(con)o(trast,)e(constructing)j(the)f fi(du-chain)h fl(in)o(v)o(olv)o(es)g -(an)o(y)f(path,)g(bac)o(kw)o(ard)f(\015o)o(w)37 894 y(analysis.)21 b(The)14 b -fi(Gen)g fl(set)f(for)h(a)f(blo)q(c)o(k)i(is)g(de\014ned)g(to)e(con)o(tain)i -(the)f(set)f(of)h(statemen)o(ts)f(that)g(use)h(a)g(v)m(ariable)37 950 y(b)q -(efore)20 b(it)f(is)g(de\014ned)h(in)f(that)f(blo)q(c)o(k.)32 b(The)19 b fi -(Kil)r(le)n(d)f fl(set)g(for)g(a)h(blo)q(c)o(k)g(is)g(de\014ned)i(to)d(con)o -(tain)h(the)f(set)h(of)37 1006 y(statemen)o(ts)c(that)f(use)i(the)f(v)m(ariab\ -les)h(after)f(it)g(is)h(\(re\)de\014ned)g(in)g(the)f(blo)q(c)o(k.)108 1063 y -(After)i(the)g fi(Gen)g fl(and)h fi(Kil)r(le)n(d)e fl(sets)h(ha)o(v)o(e)g(b)q -(een)i(determined)f(for)f(eac)o(h)h(basic)g(blo)q(c)o(k,)g(the)f fi(In)g fl -(and)g fi(Out)37 1119 y fl(sets)e(can)h(b)q(e)g(determined)g(using)g(\015o)o -(w)f(graphs)g(and)h(generic)g(data)e(\015o)o(w)h(equations)h(suc)o(h)g(as)e -(describ)q(ed)k(in)37 1176 y([44].)108 1232 y(Tw)o(o)h(common)g(approac)o(hes) -h(for)f(solving)i(data)e(\015o)o(w)h(problems)g(are)g fi(iter)n(ative)f fl -(and)h fi(structur)n(e)n(d)g fl(ap-)37 1289 y(proac)o(hes)15 b([44)o(].)k(Ite\ -rativ)o(e)14 b(approac)o(hes)g([56)o(,)g(118)o(])g(rep)q(eatedly)i(tra)o(v)o -(erse)d(the)h(\015o)o(w)g(graphs)g(un)o(til)h(there)g(are)37 1345 y(no)k(more) -f(c)o(hanges.)30 b(Structured)19 b(solutions)h(\(e.g.,)e([7)o(,)g(67,)g(107)o -(]\))g(are)g(more)g(complex,)i(but)f(ha)o(v)o(e)f(m)o(uc)o(h)37 1402 y(b)q -(etter)e(w)o(orse)e(case)h(p)q(erformance.)37 1544 y fd(7.4)70 b(Chec)n(king) -22 b(Whether)g(a)i(Predicate)d(is)h(a)h(Class)g(In)n(v)l(arian)n(t)37 1645 y -fl(In)d(general,)f(the)g(problem)h(of)e(determining)i(whether)f(an)f(arbitrar\ -y)h(predicate)g(is)g(a)g(class)g(in)o(v)m(arian)o(t)g(is)37 1702 y(undecidabl\ -e.)k(The)15 b(approac)o(h)f(tak)o(en)g(here)h(is)g(to)f(restrict)h(the)f(lang\ -uage)h(of)f(class)h(in)o(v)m(arian)o(ts,)g(and)g(apply)37 1758 y(conserv)m -(ativ)o(e)i(analysis)f(tec)o(hniques.)23 b(F)l(ortunately)l(,)15 b(the)h(lang\ -uage)g(of)f(class)h(in)o(v)m(arian)o(ts)g(\(de\014ned)h(earlier,)37 1815 y -(in)22 b(section)g(7.2\))d(is)j(expressiv)o(e)f(enough,)h(and)f(data)g(\015o) -o(w)f(analysis)i(tec)o(hniques)g(p)q(o)o(w)o(erful)f(enough,)h(to)37 1871 y -(handle)15 b(some)f(common)f(cases.)19 b(Data)13 b(\015o)o(w)g(tec)o(hniques) -i(are)e(conserv)m(ativ)o(e;)i(if)f(a)f(class)h(in)o(v)m(arian)o(t)h(is)f(sho) -o(wn)37 1928 y(to)20 b(b)q(e)i(correct)e(using)h(data)f(\015o)o(w)g(tec)o(hni\ -ques)h(then)g(it)g(is)g(correct,)g(but)g(there)f(will)i(b)q(e)g(cases)e(where) -h(a)37 1984 y(predicate)c(is)e(a)g(class)h(in)o(v)m(arian)o(t)g(but)f(it)g -(cannot)g(b)q(e)h(v)o(eri\014ed)g(using)g(data)f(\015o)o(w)g(analysis.)1600 -1968 y fs(4)108 2041 y fl(One)21 b(feature)e(of)g(these)h(predicates)h(that)e -(mak)o(es)g(them)g(di\016cult)j(to)d(v)m(alidate)i(is)f(that)f(eac)o(h)h(clau\ -se)37 2097 y(asserts)e(a)h(v)m(alue)h(\(or)e(range)g(of)g(v)m(alues\))i(of)e -(a)h(mem)o(b)q(er)g(v)m(ariable;)i(a)e(mem)o(b)q(er)f(v)m(ariable)j(can)d(c)o -(hange)h(its)37 2154 y(v)m(alue)e(o)o(v)o(er)d(time.)20 b(F)l(or)15 b(example\ -,)h(the)f(assertion:)157 2243 y fg(Y==3)37 2331 y fl(ma)o(y)c(b)q(e)h(true)f -(when)h(an)f(ob)s(ject)f(is)i(\014rst)f(initialized,)k(but)c(if)h(an)f(op)q -(eration)g(is)h(in)o(v)o(ok)o(ed)f(that)g(assigns)g(another)37 2388 y(v)m(alu\ -e)18 b(to)e(mem)o(b)q(er)g(v)m(ariable)i fi(Y)p fl(,)d(then)i(the)f(assertion) -h(no)f(longer)g(holds.)24 b(Therefore,)16 b(to)g(determine)h(that)37 2444 y -(a)e(predicate)h(holds,)g(it)f(m)o(ust)g(b)q(e)h(sho)o(wn)f(that:)37 2522 y -750 2 v 89 2548 a fu(4)107 2564 y fp(There)h(are)g(program)g(analysis)j(and)d -(v)o(eri\014cation)j(tec)o(hniques)f(more)e(p)q(o)o(w)o(erful)h(than)f(data)h -(\015o)o(w,)f(but)g(the)g(analysis)j(is)37 2610 y(more)14 b(exp)q(ensiv)o(e)h -(and)e(is)h(still)h(not)e(alw)o(a)o(ys)h(decidable.)952 2760 y fl(76)g eop bop -106 42 a fj(\017)22 b fl(the)15 b fi(cr)n(e)n(ate)g fl(pro)q(cedure)h(returns) -f(a)g(state)g(implied)i(b)o(y)e(the)h(predicate)106 134 y fj(\017)22 b fl(the) -d(predicate)h(implies)h(the)e(range)f(of)h(v)m(alues)h(that)e(eac)o(h)h(mem)o -(b)q(er)g(v)m(ariable)h(\(in)g(the)f(predicate\))151 190 y(migh)o(t)c(hold)h -(after)f(the)g(ob)s(ject)g(is)g(created.)108 290 y(The)i(\014rst)g(condition) -i(can)e(b)q(e)h(easily)g(determined)g(if,)g(for)f(all)h(mem)o(b)q(er)f(v)m -(ariables)h(referenced)g(in)g(the)37 347 y(predicate,)d(either)e(the)g fi(cr) -n(e)n(ate)g fl(pro)q(cedure)h(assigns)f(a)g(constan)o(t)f(v)m(alue)i(to)f(eac) -o(h)g(v)m(ariable,)h(or)f(eac)o(h)g(v)m(ariable)37 403 y(is)i(assigned)f(the) -f(v)m(alue)i(of)e(an)h(argumen)o(t)f(to)g(the)g(create)h(pro)q(cedure)g(and)g -(the)f(pro)q(cedure)i(is)f(alw)o(a)o(ys)f(called)37 460 y(with)j(constan)o -(t)e(argumen)o(ts.)108 516 y(Determining)23 b(the)g(range)f(of)g(v)m(alues)i -(that)d(a)i(v)m(ariable)g(migh)o(t)g(hold)g(after)f(it)g(is)h(created)g(requi\ -res)37 573 y(\014nding)d(all)f(places)g(where)g(it)g(ma)o(y)e(b)q(e)i(assigne\ -d)g(a)f(v)m(alue,)i(and)e(what)g(v)m(alues)h(ma)o(y)f(b)q(e)h(assigned)g(ther\ -e.)37 629 y(In)o(terpro)q(cedural)14 b(all)f(paths)f(data)g(\015o)o(w)f(analy\ -sis)i(is)g(a)f(\\safe")f(tec)o(hnique)j(that)d(can)i(lo)q(cate)f(all)i(assign\ -men)o(ts)37 686 y(that)h(migh)o(t)g(b)q(e)h(made)f(to)g(a)g(v)m(ariable.)108 -742 y(Data)22 b(\015o)o(w)g(analysis)i(can)e(determine)i(where)f(assignmen)o -(ts)g(to)f(a)h(v)m(ariable)h(are)e(made)h(and)g(what)37 798 y(expressions)18 b -(are)d(assigned)i(to)f(the)g(v)m(ariable.)24 b(Determining)18 b(whether)e(a)g -(predicate)h(is)g(violated)g(requires)37 855 y(kno)o(wing)22 b(the)f fi(value) -g fl(of)f(the)h(expressions)h(assigned)g(to)e(the)h(v)m(ariable.)39 b(In)21 b -(man)o(y)g(common)f(cases)h(the)37 911 y(assigned)j(v)m(alue)g(is)f(a)f(const\ -an)o(t,)i(in)f(whic)o(h)h(case)f(the)f(v)m(alue)i(is)g(kno)o(wn)e(directly)l -(,)k(or)c(the)h(v)m(ariable)h(is)37 968 y(assigned)15 b(the)g(v)m(alue)g(of)f -(another)g(v)m(ariable,)h(in)h(whic)o(h)f(case)f(data)g(\015o)o(w)f(analysis) -j(can)e(b)q(e)h(used)g(to)e(attempt)37 1024 y(to)g(determine)i(the)e(set)h -(of)f(reac)o(hing)h(v)m(alues)g(of)f(that)g(v)m(ariable.)21 b(Data)12 b(\015o) -o(w)h(analysis)h(is)g(less)g(lik)o(ely)i(to)c(w)o(ork)37 1081 y(with)k(more)f -(complicated)h(expressions.)108 1137 y(Sev)o(eral)i(factors)f(in\015uence)j -(the)e(scop)q(e)g(of)g(the)g(analysis.)28 b(The)18 b(access)g(con)o(trol)g -(mo)q(de)g(of)g(a)f(v)m(ariable)37 1194 y(\(priv)m(ate,)d(protected)e(or)g -(public\))i(determines)g(the)e(range)h(of)f(functions)h(that)f(ma)o(y)g(refer\ -ence)h(the)f(v)m(ariable.)37 1250 y(Also,)19 b(if)g(the)f(v)m(ariable)i(is)f -(passed)f(b)o(y)g(reference)h(in)g(a)f(function)h(call,)h(the)e(function)i -(and)e(the)g(transitiv)o(e)37 1307 y(closure)e(of)e(the)h(set)f(of)g(function\ -s)h(whic)o(h)h(migh)o(t)e(receiv)o(e)i(the)e(argumen)o(t)g(b)o(y)h(reference) -g(m)o(ust)f(b)q(e)h(c)o(hec)o(k)o(ed.)108 1363 y(Data)g(\015o)o(w)h(analysis) -i(is)f(less)g(lik)o(ely)h(to)e(b)q(e)h(able)h(to)e(detect)g(when)h(a)g(predic\ -ate)g(holds)g(if)g(the)g(v)m(ariable)37 1419 y(b)q(eing)e(analyzed)g(is)f(par\ -t)f(of)g(a)g(v)m(arian)o(t)h(\014eld,)h(or)e(p)q(oin)o(ters)h(to)f(the)g(v)m -(ariable)i(are)e(passed)h(and)g(manipulated)37 1476 y(using)19 b(p)q(oin)o -(ter)f(arithmetic)g(and)f(other)g(\(dangerous\))g(op)q(erations.)26 b(Suc)o -(h)18 b(features)g(mak)o(e)e(it)i(di\016cult)h(or)37 1532 y(imp)q(ossible)14 b -(to)d(determine)i(where)f(a)f(v)m(ariable)i(is)f(assigned.)19 b(F)l(ortunatel\ -y)l(,)12 b(few)f(ob)s(ject)g(orien)o(ted)h(languages)37 1589 y(allo)o(w)19 b -(p)q(oin)o(ter)h(arithmetic)f(and)g(similar)h(op)q(erations.)30 b(C++)19 b -(is)h(an)e(exception,)j(since)e(it)g(is)h(a)e(sup)q(erset)37 1645 y(of)h(C.)f -(Ho)o(w)o(ev)o(er,)g(sub)q(classing)j(can)e(eliminate)h(the)f(need)h(for)e -(v)m(arian)o(t)h(structures)f(in)i(C++,)g(and)f(C++)37 1702 y(encourages)d -(a)f(st)o(yle)g(that)f(in)o(v)o(olv)o(es)i(few)o(er)f(p)q(oin)o(ter)h(manipul\ -ations)g(than)f(do)q(es)h(C.)37 1844 y fd(7.5)70 b(Refactoring:)30 b(Create) -22 b(Sub)r(classes)g(and)i(Assign)f(In)n(v)l(arian)n(ts)37 1946 y fl(The)17 b -(\014rst)f(imp)q(ortan)o(t)g(step)g(in)h(the)g(refactoring)e(pro)q(cess)i(is) -g(to)e(create)i(the)f(new)g(sub)q(classes,)i(and)e(assign)37 2002 y(the)21 b -(class)g(in)o(v)m(arian)o(ts.)37 b(This)21 b(refactoring)f(creates)g(sub)q -(classes)i(that)e(corresp)q(ond)h(to)f(the)g(en)o(umerated)37 2058 y(v)m(alue\ -s)d(of)e(a)g(mem)o(b)q(er)g(v)m(ariable.)108 2115 y(The)h(argumen)o(ts)e(to)g -(this)i(refactoring)f(are:)106 2204 y fj(\017)22 b fl(the)15 b(class)h(b)q -(eing)g(sp)q(ecialized)j(\(C\))106 2297 y fj(\017)j fl(the)15 b(mem)o(b)q(er) -h(v)m(ariable)g(\(en)o(umeratedMem)o(b)q(erV)l(ar\))f(w)o(as)f(en)o(umerated) -h(v)m(alues)i(are)d(used)i(to)f(create)151 2353 y(sub)q(classes.)37 2453 y -(After)g(c)o(hec)o(king)h(its)g(preconditions,)g(this)g(refactoring)f(\(for)f -(eac)o(h)h(en)o(umerated)g(v)m(alue\):)93 2554 y(1.)22 b(calls)17 b(the)f(cre\ -ate)s 14 2 v 14 w(empt)o(y)s 14 2 v 13 w(class)g(refactoring)g(to)f(create)h -(a)g(sub)q(class,)h(whose)f(name)g(corresp)q(onds)g(to)151 2610 y(the)f(en)o -(umerated)h(v)m(alue)952 2760 y(77)g eop bop 93 42 a fl(2.)22 b(calls)17 b -(the)e(create)s 14 2 v 14 w(mem)o(b)q(er)s 14 2 v 13 w(function)i(refactoring) -e(to)g(add)h(a)f(constructor)g(\()p fi(ie)g fl(create\))g(function)h(to)151 98 -y(the)g(sub)q(class.)23 b(The)16 b(constructor)f(function)i(establishes)g(ini\ -tial)h(conditions)f(implied)h(b)o(y)e(the)g(class)151 154 y(in)o(v)m(arian)o -(t.)21 b(F)l(or)14 b(example,)i(if)f(the)h(class)f(in)o(v)m(arian)o(t)h(is:) -270 267 y fg(X==3,)151 392 y fl(the)f(constructor)g(will)i(assign)e(the)g(v)m -(alue)i fi(3)e fl(to)g(mem)o(b)q(er)g(v)m(ariable)i fi(X)p fl(.)93 517 y(3.) -22 b(assigns)15 b(a)g(predicate)h(to)f(the)g(class)h(as)f(the)g(class)g(in)o -(v)m(arian)o(t.)37 639 y fe(7.5.1)56 b(Preconditions)37 724 y fl(The)16 b(pre\ -conditions)h(for)d(this)i(refactoring)f(are:)106 831 y fj(\017)22 b(8)16 b fl -(C)f fj(2)g fl(Program.classes,)226 887 y fj(8)h fl(en)o(umV)l(al)g fj(2)f fl -(en)o(umeratedMem)o(b)q(erV)l(ar.t)o(yp)q(e,)301 944 y(C.name)g fj(6)p fl(=)g -(en)o(umV)l(al.name.)151 1000 y(\(none)g(of)g(the)g(names)h(of)e(the)i(en)o -(umerated)f(v)m(alues)h(clash)g(with)g(the)f(names)g(of)g(existing)h(classes\ -\).)106 1094 y fj(\017)22 b(8)16 b fl(F)e fj(2)i fl(\(C.lo)q(callyDe\014nedMe\ -m)o(b)q(erF)l(unctions)i fj([)d fl(inheritedMem)o(b)q(erF)l(unctions\(C\)\),) -226 1150 y fj(8)h fl(en)o(umV)l(al)g fj(2)f fl(en)o(umeratedMem)o(b)q(erV)l -(ar.t)o(yp)q(e,)301 1207 y(F.name)g fj(6)p fl(=)g(en)o(umV)l(al.name.)151 1263 -y(\(none)h(of)g(the)g(names)g(of)g(the)g(en)o(umerated)g(v)m(alues)h(clash)g -(with)g(the)f(names)g(of)f(mem)o(b)q(er)i(functions)151 1320 y(of)e(the)g(sup) -q(erclass\).)37 1441 y fe(7.5.2)56 b(Beha)n(vior)18 b(Preserv)m(ation)37 1527 -y fl(F)l(or)d(create)s 14 2 v 13 w(empt)o(y)s 14 2 v 13 w(class:)21 b(precond\ -ition)16 b(1)f(\(the)g(name)g(do)q(esn't)g(clash)h(with)g(an)f(already)g(exis\ -ting)h(class\))37 1584 y(is)g(satis\014ed)g(b)o(y)f(precondition)i(1)e(of)f -(this)i(refactoring.)108 1640 y(F)l(or)g(create)s 14 2 v 14 w(mem)o(b)q(er)s -14 2 v 13 w(function:)24 b(preconditions)19 b(1)d(and)i(2)e(\(the)h(name)g -(of)f(the)h(constructor)g(function)37 1697 y(do)q(esn't)e(clash)g(with)f(an)h -(already)f(lo)q(cally)i(de\014ned)g(mem)o(b)q(er)e(function,)h(and)g(has)f -(a)g(compatible)h(signature)37 1753 y(with)i(an)o(y)f(inherited)i(function)f -(with)g(the)f(same)g(name\))g(are)g(satis\014ed)h(b)o(y)f(precondition)i(2)e -(of)g(this)h(refac-)37 1809 y(toring;)d(precondition)h(3)e(\(regarding)g(sub) -q(classes)i(of)d(eac)o(h)i(newly)g(de\014ned)h(class\))e(is)h(satis\014ed)g -(b)q(ecause)g(the)37 1866 y(newly)g(created)e(classes)h(b)o(y)f(construction) -h(ha)o(v)o(e)f(no)g(sub)q(classes;)i(precondition)g(4)e(\(if)g(there)h(is)f -(an)h(inherited)37 1922 y(function)19 b(with)f(the)g(same)f(name,)h(either)g -(the)g(inherited)i(function)e(is)g(unreferenced)h(on)f(instances)g(of)g(C)37 -1979 y(\(or)f(its)h(sub)q(classes\),)h(or)e(the)h(new)f(function)i(is)f(seman) -o(tically)h(equiv)m(alen)o(t)g(to)e(the)h(function)g(it)g(replaces\))37 2035 y -(is)h(satis\014ed)f(b)o(y)f(precondition)i(2)e(of)g(this)h(refactoring;)g(pre\ -condition)h(5)e(\(the)h(function)g(will)h(compile\))g(is)37 2092 y(satis\014e\ -d)i(b)q(ecause)f(the)f(mem)o(b)q(er)h(v)m(ariables)h(are)e(visible)j(to)d(the) -g(constructor,)g(and)h(the)g(assignmen)o(t)f(is)37 2148 y(t)o(yp)q(e-correct.) -108 2205 y(The)e(third)g(step)f(\(attac)o(hing)f(a)i(predicate)g(as)f(the)g -(class)h(in)o(v)m(arian)o(t\))f(do)q(es)h(not)f(c)o(hange)g(the)h(b)q(eha)o -(vior)37 2261 y(of)d(the)f(program)g(b)q(ecause)h(it)g(is)g(design)g(informat\ -ion)g(and)g(do)q(es)f(not)g(c)o(hange)h(the)g(program)e(source)i(co)q(de.) -1893 2245 y fs(5)108 2318 y fl(This)i(refactoring)f(is)g(constructed)h(using) -g(b)q(eha)o(vior)g(preserving)g(refactorings)e(and,)h(since)i(it)e(satis\014e\ -s)37 2374 y(the)h(preconditions)g(of)f(those)g(refactorings,)g(b)q(eha)o(vior) -g(is)h(preserv)o(ed.)37 2455 y 750 2 v 89 2482 a fu(5)107 2498 y fp(Ho)o(w)o -(ev)o(er,)h(b)o(y)h(precondition)i(2)d(and)h(the)f(results)i(of)e(the)g(prior) -h(step,)h(at)e(this)h(step)f(the)h(class)g(do)q(es)g(not)f(violate)i(the)37 -2543 y(predicate)c(attac)o(hed)f(as)f(the)g(class)h(in)o(v)n(arian)o(t.)952 -2760 y fl(78)g eop bop 37 42 a fd(7.6)70 b(Using)23 b(A)g(Class)f(In)n(v)l -(arian)n(t)i(T)-6 b(o)23 b(Simplify)d(A)j(Conditional)37 143 y fl(Giv)o(en)17 -b(a)e(predicate)h(kno)o(wn)g(to)f(b)q(e)h(a)f(correct)g(class)h(in)o(v)m(aria\ -n)o(t,)g(this)g(section)g(describ)q(es)i(ho)o(w)d(to)g(simplify)37 199 y(cond\ -itional)i(statemen)o(ts)d(in)i(the)g(functions)g(de\014ned)g(for)f(the)g(clas\ -s.)20 b(The)c(algorithm)f(is:)93 282 y(1.)22 b(for)15 b(eac)o(h)g(condition)h -(in)g(a)f(conditional)i(statemen)o(t,)d(reduce)i(to)e(true)h(or)g(false)g(if) -h(p)q(ossible)h(based)f(on)151 339 y(the)f(class)h(in)o(v)m(arian)o(t;)93 428 -y(2.)22 b(eliminate)17 b(dead)f(co)q(de)f(and)h(p)q(erform)f(other)g(simpli\ -\014cations.)108 511 y(The)f(\014rst)g(step)g(is)g(a)g(sp)q(ecial)i(case)e -(of)f(theorem)h(pro)o(ving)g(and,)g(in)h(general,)f(is)h(undecidable.)22 b -(Ho)o(w)o(ev)o(er,)37 568 y(since)17 b(class)e(in)o(v)m(arian)o(ts)h(are)f -(of)g(the)g(form:)133 650 y fg(<memberVariable>)22 b(==)h(<value>)37 741 y fl -(where)16 b(the)f(v)m(alue)i(is)e(an)g(in)o(teger)h(or)f(the)g(v)m(alue)h(of) -f(an)g(en)o(umerated)g(t)o(yp)q(e,)g fi(c)n(onstant)h(pr)n(op)n(agation)f fl -(and)37 798 y fi(c)n(opy)i(pr)n(op)n(agation)e fl([44])f(can)i(b)q(e)g(used)f -(to)g(reduce)h(some)f(conditions)h(to)f(true)g(or)g(false.)108 889 y(Constan) -o(t)f(propagation)g(and)h(cop)o(y)g(propagation)g(are)g(applied)h(in)g(compil\ -ers)g(to)f(detect)g(and)g(remo)o(v)o(e)37 945 y(extraneous)i(v)m(ariables,)i -(and)e(impro)o(v)o(e)g(execution)h(sp)q(eed)g(b)o(y)f(replacing)h(v)m(ariable) -h(references)f(with)f(their)37 1002 y(v)m(alues.)22 b(Constan)o(t)13 b(propag\ -ation)i(means)g(that,)f(for)h(example,)h(if)f(the)h(assignmen)o(t:)157 1085 y -fg(X=3)37 1168 y fl(is)f(follo)o(w)o(ed)f(b)o(y)g(a)f(statemen)o(t)g(that)g -(references)i(the)f(v)m(ariable)h fi(X)p fl(,)e(and)h(it)h(is)f(kno)o(wn)g -(that)f(the)h(v)m(alue)h(of)e fi(X)h fl(is)37 1224 y(not)h(reassigned)h(b)o -(y)e(in)o(termediate)i(statemen)o(ts,)d(then)j(in)f(the)g(latter)g(statemen)o -(t)f(the)h(reference)g(to)g fi(X)f fl(can)37 1281 y(b)q(e)i(replaced)h(b)o -(y)e(the)g(v)m(alue)i fi(3)p fl(.)j(Cop)o(y)14 b(propagation)h(means)g(that,) -f(for)h(example,)h(if)f(the)g(assignmen)o(t:)157 1363 y fg(Y=X)37 1446 y fl -(is)e(follo)o(w)o(ed)f(b)o(y)g(a)f(statemen)o(t)g(that)g(references)i fi(Y)p -fl(,)e(and)h(it)g(is)g(kno)o(wn)g(that)f(neither)i fi(X)e fl(nor)h fi(Y)f fl -(are)h(reassigned)37 1503 y(b)o(y)j(in)o(termediate)g(statemen)o(ts,)e(then)i -(in)h(the)e(latter)g(statemen)o(t)g(the)h(reference)g(to)f fi(Y)g fl(can)h -(b)q(e)g(replaced)h(b)o(y)37 1559 y(a)d(reference)h(to)e fi(X)p fl(.)g(There) -h(are)g(man)o(y)f(algorithms)h(for)f(simplifying)k(expressions)d(b)o(y)g(p)q -(erforming)g(constan)o(t)37 1616 y(propagation)i(and)h(cop)o(y)f(propagation) -f([44)o(].)108 1672 y(These)22 b(tec)o(hniques)i(can)e(b)q(e)g(applied)i(for) -d(simplifying)k(conditional)e(statemen)o(ts.)39 b(F)l(or)21 b(a)h(v)m(ariable) -37 1729 y(referenced)16 b(in)e(a)g(condition,)h(an)f(an)o(y)g(path,)g(forw)o -(ard)f(\015o)o(w)g(analysis)i(can)f(b)q(e)h(used)f(to)g(compute)g(the)g(set)g -(of)37 1785 y fi(r)n(e)n(aching)g(de\014nitions)p fl(,)d(that)h(is,)i(the)e -(set)h(of)f(de\014nitions)j(to)d(the)h(v)m(ariable)h(that)e(migh)o(t)h(reac)o -(h)f(the)h(reference.)37 1842 y(If)h(only)h(one)e(assignmen)o(t)h(to)f(a)g -(v)m(ariable)j(can)d(\\reac)o(h")g(a)h(reference)g(to)f(that)g(v)m(ariable,)i -(then)f(that)f(v)m(ariable)37 1898 y(reference)j(can)g(b)q(e)g(replaced)g(b)o -(y)f(the)g(assigned)h(v)m(alue.)108 1954 y(Consider)21 b(ho)o(w)g(the)f(condi\ -tions)i(in)g(the)f(ab)q(o)o(v)o(e)f ff(Flo)o(wNo)q(de)h fl(example)g(can)g -(b)q(e)h(automatically)f(sim-)37 2011 y(pli\014ed.)39 b(In)21 b(the)g(class)g -ff(CondJumpFlo)o(wNo)q(de)p fl(,)g(constan)o(t)f(propagation)g(based)h(on)g -(the)g(class)g(in)o(v)m(arian)o(t)37 2067 y(replaces)16 b(references)g(to)e -(the)h(v)m(ariable)h fi(\014nal)s 14 2 v 12 w(statement)f fl(with)g(the)g(v)m -(alue)h fi(c)n(onditional)s 14 2 v 13 w(jump)p fl(,)f(resulting)h(in)37 2124 y -(the)g(follo)o(wing)g(co)q(de:)157 2215 y fg(void)23 b(optimize\(\))g({)228 -2271 y(if)h(\(conditional_jump)e(==)h(conditional_jump\))276 2328 y(<code)g -(segment)g(S1>)228 2384 y(else)h(if)f(\(conditional_jump)f(==)h(unconditional\ -_jump\))276 2441 y(<code)g(segment)g(S2>)228 2497 y(else)h(if)f(\(conditional\ -_jump)f(==)h(return_statement\))276 2554 y(<code)g(segment)g(S3>)539 2610 y -(})952 2760 y fl(79)g eop bop 108 42 a fl(Eliminating)14 b(dead)f(co)q(de)g -(and)g(p)q(erforming)g(other)f(simpli\014cations)j(is)e(the)g(second)g(step)f -(in)h(the)g(general)37 98 y(algorithm.)19 b(In)13 b(the)f(ab)q(o)o(v)o(e)f -(example,)i(for)e(the)h(class)h ff(CondJumpFlo)o(wNo)q(de)e fl(the)h(\014rst) -f(condition)i(is)g(trivially)37 154 y(true)e(and)f(the)g(conditional)i(can)f -(b)q(e)f(reduced)i(to)d(co)q(de)i(segmen)o(t)f(S1.)18 b(Similarly)l(,)13 b -(the)e(conditional)h(statemen)o(t)37 211 y(can)23 b(b)q(e)g(reduced)g(to)e -(a)h(co)q(de)h(segmen)o(t)f(in)h(the)f(other)g(t)o(w)o(o)f(sub)q(classes.)42 b -(This)22 b(step)h(w)o(ould)f(b)q(e)h(more)37 267 y(complicated)17 b(if)f(for) -e(example)i(the)g(conditional)g(tests)f(had)g(side)i(e\013ects.)108 324 y(Mor\ -e)c(p)q(o)o(w)o(erful)g(simpli\014cations)i(can)f(b)q(e)f(p)q(erformed)h(b)o -(y)f(applying)h(constan)o(t)f(and)g(cop)o(y)g(propagation)37 380 y(using)24 b -(class)e(in)o(v)m(arian)o(ts)h(and)g(other)f(program)f(prop)q(erties)i(determ\ -inable)h(using)f(data)f(\015o)o(w)g(analysis.)37 437 y(These)d(tec)o(hniques) -g(could)f(b)q(e)h(applied)g(to)e(simplify)j(some)d(conditionals)i(that)e(test) -g(the)h(v)m(alue)h(returned)37 493 y(from)h(a)h(function)g(call,)i(if)e(the)g -(v)m(alues)h(returned)f(from)f(the)g(function)i(could)f(b)q(e)h(en)o(umerated\ -.)36 b(These)37 550 y(tec)o(hniques)17 b(can)e(also)g(b)q(e)h(applied)h(to)e -(simplify)i(expressions)f(other)f(than)g(conditional)i(statemen)o(ts.)37 693 y -fd(7.7)70 b(Refactoring:)30 b(Migrate)22 b(&)i(Simplify)c(Conditionals)37 794 -y fl(In)14 b(this)f(step,)g(the)g(conditional)h(statemen)o(ts)e(to)g(b)q(e)h -(simpli\014ed)i(are)e(separated)f(in)o(to)h(new)g(functions,)h(whic)o(h)37 851 -y(are)h(copied)i(in)o(to)e(the)g(sub)q(classes)i(and)e(simpli\014ed.)108 907 y -(This)23 b(refactoring)g(simpli\014es)i fi(a)d fl(conditional)j(statemen)o -(t.)41 b(It)23 b(separates)f(the)h(conditional)h(in)o(to)f(a)37 964 y(separat\ -e)15 b(function,)h(copies)g(it)f(in)o(to)g(the)h(sub)q(classes)g(and,)f(in)h -(eac)o(h)f(sub)q(class,)h(simpli\014es)i(the)d(conditional)37 1020 y(based)h -(on)f(the)g(class)h(in)o(v)m(arian)o(t.)k(The)c(argumen)o(t)e(to)h(this)g(ref\ -actoring)g(is:)106 1114 y fj(\017)22 b fl(the)15 b(conditional)i(statemen)o -(t)37 1220 y(After)e(c)o(hec)o(king)h(its)g(precondition)h(\(whic)o(h)e(is)h -(the)f(same)g(as)g(the)g(precondition)i(for)e(the)g(primitiv)o(e)37 1277 y -(refactoring)g(con)o(v)o(ert)s 14 2 v 13 w(co)q(de)s 14 2 v 14 w(segmen)o(t)s -14 2 v 13 w(to)s 14 2 v 13 w(function\),)g(this)h(refactoring:)93 1383 y(1.) -22 b(calls)c(the)e(con)o(v)o(ert)s 14 2 v 13 w(co)q(de)s 14 2 v 14 w(segmen)o -(t)s 14 2 v 13 w(to)s 14 2 v 12 w(function)i(refactoring)e(to)f(separate)h -(the)g(conditional)i(in)o(to)f(a)151 1439 y(separate)e(function,)g(assigning) -h(it)g(a)f(unique)h(name)93 1533 y(2.)22 b(constructs)17 b(the)g(sets)g(of)g -(all)h(mem)o(b)q(er)g(functions)g(and)f(v)m(ariables)i(referenced)f(b)o(y)f -(the)g(conditional.)151 1590 y(F)l(or)e(eac)o(h)g(mem)o(b)q(er)g(where)h(mem) -o(b)q(er.accessCon)o(trolMo)q(de)e(=)i(priv)m(ate,)f(calls)151 1646 y(c)o(han\ -ge)s 14 2 v 14 w(access)s 14 2 v 13 w(con)o(trol)s 14 2 v 13 w(mo)q(de)h(to)e -(mak)o(e)h(it)g(protected.)93 1740 y(3.)22 b(calls)15 b(the)g(create)s 14 2 v -13 w(mem)o(b)q(er)s 14 2 v 13 w(function)g(refactoring)f(to)g(cop)o(y)g(the)g -(new)g(function)h(to)f(eac)o(h)g(of)g(the)g(new)151 1796 y(sub)q(classes)93 -1890 y(4.)22 b(if)11 b(\014rstConditionImpliedB)q(yIn)o(v)m(ari)q(an)o(t\(con\ -ditional)j(statemen)o(t,)c(class)i(in)o(v)m(arian)o(t)f(of)g(sub)q(class\))g -(can)151 1947 y(b)q(e)16 b(determined:)170 2040 y(\(a\))22 b(simpli\014es)c -(the)d(conditional)i(statemen)o(t.)168 2114 y(\(b\))22 b(eliminates)12 b(all) -f(branc)o(hes)g(that)e(test)h(false)g(\(without)g(side-e\013ects\))h(against) -e(the)i(class)f(in)o(v)m(arian)o(t.)173 2187 y(\(c\))22 b(con)o(v)o(erts)12 b -(an)o(y)h(branc)o(h)g(that)g(tests)f(false)h(\(but)g(has)g(side-e\013ects\))h -(to)e(a)h(statemen)o(t)f(corresp)q(ond-)251 2243 y(ing)k(to)e(the)i(side-e\ -\013ect.)669 2227 y fs(6)37 2324 y 750 2 v 89 2351 a fu(6)107 2367 y fp(If)9 b -(all)h(conditions)j(test)c(false)h(\(without)g(side-e\013ects\),)i(the)d(en)o -(tire)i(conditional)i(statemen)o(t)d(can)g(b)q(e)f(eliminated.)19 b(Detecting) -37 2413 y(side)c(e\013ects)e(is)h(in)f(general)i(di\016cult.)952 2760 y fl -(80)g eop bop 37 42 a fe(7.7.1)56 b(Preconditions)37 127 y fl(The)16 b(precon\ -ditions)h(for)d(this)i(refactoring)f(are:)106 234 y fj(\017)22 b fl(con)o(v)o -(ertibleT)l(oF)l(unctionP\(conditionalStatemen)o(t\))151 290 y(\(the)15 b(con\ -ditional)i(statemen)o(t)d(is)i(con)o(v)o(ertible)g(to)f(a)f(legal)i(function\ -\))37 412 y fe(7.7.2)56 b(Beha)n(vior)18 b(Preserv)m(ation)37 498 y fl(F)l -(or)i(con)o(v)o(ert)s 14 2 v 12 w(co)q(de)s 14 2 v 14 w(segmen)o(t)s 14 2 v 13 -w(to)s 14 2 v 13 w(function:)30 b(precondition)21 b(1)e(\(the)g(conditional)j -(is)e(a)f(legal)i(function\))f(is)37 554 y(satis\014ed)c(b)o(y)f(precondition) -i(1)e(of)g(this)g(refactoring.)108 610 y(F)l(or)d(c)o(hange)s 14 2 v 13 w(acc\ -ess)s 14 2 v 14 w(con)o(trol)s 14 2 v 13 w(mo)q(de:)19 b(preconditions)14 b -(1)e(and)g(3)g(are)h(satis\014ed,)g(since)g(they)g(only)g(apply)g(if)37 667 y -(the)h(access)f(con)o(trol)f(mo)q(de)h(is)h(not)e(priv)m(ate;)j(precondition) -f(2)f(\(v)m(ariables)h(referenced)f(in)h(the)f(common)g(co)q(de)37 723 y(are) -j(not)g(priv)m(ate)h(v)m(ariables)h(that)d(are)h(rede\014ned)i(in)f(sub)q(cla\ -sses\))g(is)f(satis\014ed)h(b)q(ecause)g(b)o(y)g(construction,)37 780 y(b)q -(efore)f(this)g(step)f(the)g(v)m(ariable)i(or)d(function)i(is)g(not)f(lo)q -(cally)i(de\014ned)f(in)g(the)g(sub)q(classes.)108 836 y(F)l(or)21 b(create)s -14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(function:)33 b(preconditions)23 b(1-4) -d(\(regarding)h(name)g(clashes)h(and)g(equiv)m(alence)37 893 y(with)13 b(func\ -tions)g(inherited)h(from)e(the)g(sup)q(erclass\))h(are)f(satis\014ed)h(b)q -(ecause)g(in)h(the)e(prior)g(step)h(it)f(w)o(as)g(added)37 949 y(to)j(the)g -(sup)q(erclass)g(and)g(giv)o(en)h(a)e(unique)i(name,)f(while)h(in)g(this)f -(step)g(it)g(is)g(copied)h(do)o(wn;)e(precondition)j(5)37 1006 y(\(regarding) -12 b(all)i(v)m(ariable)f(and)g(function)g(references)f(in)h(the)g(conditional) -h(are)d(visible)k(from)c(the)i(sub)q(classes\))37 1062 y(is)j(satis\014ed)g -(b)o(y)f(the)g(results)h(of)f(a)g(prior)g(step.)108 1119 y(F)l(or)h(step)h -(4:)23 b(program)16 b(prop)q(ert)o(y)h(sev)o(en)g(\(seman)o(tically)h(equiv)m -(alen)o(t)g(references)g(and)f(op)q(erations\))g(is)37 1175 y(preserv)o(ed)22 -b(b)o(y)f(construction)h(-)f(side)h(e\013ects)f(of)g(conditional)i(tests)d -(are)h(retained;)k(only)d(dead)f(co)q(de)h(is)37 1231 y(remo)o(v)o(ed.)e(Othe\ -r)15 b(program)f(prop)q(erties)i(are)f(trivially)i(preserv)o(ed.)108 1288 y -(This)j(refactoring)g(is)g(constructed)g(using)h(three)e(b)q(eha)o(vior)i(pre\ -serving)f(refactorings,)g(for)g(whic)o(h)g(it)37 1344 y(satis\014es)13 b(the) -g(preconditions,)h(and)e(a)g(fourth)g(op)q(eration)h(whic)o(h)g(b)o(y)g(const\ -ruction)f(is)h(b)q(eha)o(vior)g(preserving.)37 1401 y(Therefore,)i(b)q(eha)o -(vior)h(is)g(preserv)o(ed.)37 1544 y fd(7.8)70 b(Using)28 b(A)g(Class)g(In)n -(v)l(arian)n(t)h(T)-6 b(o)29 b(Sp)r(ecialize)c(Expressions)j(That)194 1619 y -(Create)22 b(Instances)37 1720 y fl(After)12 b(the)g(new)g(sub)q(classes)h -(ha)o(v)o(e)f(b)q(een)h(de\014ned,)g(the)f(design)h(of)e(a)h(program)f(can)h -(sometimes)g(b)q(e)g(impro)o(v)o(ed)37 1777 y(b)o(y)18 b(sp)q(ecializin)q(g)i -(the)e(expressions)g(that)f(create)h(instances)g(of)g(the)g(sup)q(erclass;)h -(that)e(is,)i(replace)f(an)g(ex-)37 1833 y(pression)f(that)d(creates)i(an)f -(instance)h(of)f(the)h(sup)q(erclass)h(with)e(an)h(expression)g(that)f(create\ -s)g(an)h(instance)37 1890 y(of)f(a)g(sub)q(class.)108 1946 y(T)l(o)20 b(exten\ -d)h(the)f(ab)q(o)o(v)o(e)g(example)h(in)o(v)o(olving)h ff(Flo)o(wNo)q(des)p fl -(,)g(consider)f(a)f(class)h ff(Program)n(Builder)d fl(that)37 2003 y(builds)g -(new)d ff(Flo)o(wNo)q(des)p fl(.)20 b(In)c(one)g(of)e(its)i(functions,)f(the) -h(statemen)o(t)e(to)g(create)h(a)g ff(Flo)o(wNo)q(de)g fl(is:)157 2109 y fg -(newNode)23 b(=)g(new)h(FlowNode)f(\(<list)g(of)g(accumulated)g(instructions>\ -,)730 2165 y(unconditional_jump\))108 2272 y fl(The)11 b(constructor)f(for)g -(the)h(class)h ff(Flo)o(w)e(No)q(de)h fl(b)q(egins)i(with)e(an)f(assignmen)o -(t)h(of)g(the)g(second)g(argumen)o(t)f(to)37 2328 y(the)i(mem)o(b)q(er)g(v)m -(ariable)i fi(\014nal)s 14 2 v 12 w(statement.)19 b fl(Th)o(us,)12 b(for)f -(this)h(assignmen)o(t)g(statemen)o(t,)f(the)h(second)g(argumen)o(t)37 2384 y -(passed)j(to)g(the)f(constructor)g(function)i(corresp)q(onds)f(to)f(the)h(cla\ -ss)g(in)o(v)m(arian)o(t)g(of)g ff(UncondJumpFlo)o(wNo)q(de)p fl(.)37 2441 y -(Supp)q(ose)f(that)d(mem)o(b)q(er)i(v)m(ariable)h fi(\014nal)s 14 2 v 12 w -(statement)e fl(is)h(nev)o(er)f(reassigned.)20 b(In)13 b(the)f(ab)q(o)o(v)o -(e)g(assignmen)o(t,)g(the)37 2497 y(expression)k(creating)g(an)f(instance)g -(of)g(the)g(sup)q(erclass)h ff(Flo)o(wNo)q(de)f fl(can)g(b)q(e)h(replaced)g -(with)g(an)f(expression)37 2554 y(creating)h(an)f(instance)h(of)f(the)g(sub)q -(class)h ff(UncondJumpFlo)o(wNo)q(de)p fl(;)f(that)g(is:)952 2760 y(81)g eop -bop 157 42 a fg(newNode)23 b(=)g(new)h(UncondJumpFlowNode)d(\(<list)i(of)h -(accumulated)e(instructions>\))108 148 y fl(In)13 b(general,)g(this)f(op)q -(eration)h(cannot)e(b)q(e)i(done)g(safely)f(unless)h(it)g(can)f(b)q(e)h(deter\ -mined)g(that)f(no)g(instance)37 204 y(created)i(b)o(y)g(the)g(expression)h -(violates)f(the)g(class)g(in)o(v)m(arian)o(t)h(of)e(the)h(sub)q(class.)21 b -(Determining)15 b(this)f(in)o(v)o(olv)o(es)37 261 y(\014nding)24 b(where)f -(the)g(instances)g(created)f(b)o(y)h(this)g(expression)g(are)f(initially)k -(assigned,)e(recording)f(the)37 317 y(v)m(ariable)14 b(initially)g(assigned)f -(the)f(instances)g(and)g(constructing)h(a)e(de\014nition-use)j(c)o(hain)f(for) -e(that)g(v)m(ariable,)37 374 y(to)j(\014nd)h(all)g(places)g(where)g(the)f(v)m -(ariable)i(ma)o(y)d(b)q(e)i(used.)20 b(If)15 b(the)f(v)m(ariable)i(is)f(alias\ -ed)g(\(e.g.,)e(it)h(is)h(passed)g(b)o(y)37 430 y(reference)i(in)g(a)f(functio\ -n)h(call\),)g(a)f(de\014nition-use)j(c)o(hain)e(for)e(all)i(v)m(ariables)h -(to)e(whic)o(h)h(it)f(ma)o(y)g(b)q(e)g(aliased)37 487 y(m)o(ust)g(also)h(b)q -(e)g(constructed.)24 b(In)17 b(order)f(to)g(determine)h(that)f(the)h(instance) -g(can)g(b)q(e)g(sp)q(ecialized,)i(it)e(m)o(ust)37 543 y(b)q(e)g(pro)o(v)o(en) -f(that)f(none)h(of)g(the)g(op)q(erations)g(on)g(these)g(v)m(ariables)h(violat\ -e)f(the)g(class)h(in)o(v)m(arian)o(t)f(de\014ned)i(on)37 599 y(a)d(sub)q(clas\ -s.)37 743 y fd(7.9)70 b(Refactoring:)26 b(Sp)r(ecialize)11 b(Expressions)16 b -(That)g(Create)e(Instances)37 844 y fl(This)22 b(refactoring)e(sp)q(ecializes) -j(an)e(expression)g(that)f(create\(s\))g(instances)h(of)f(the)h(sup)q(erclass) -h(with)f(an)37 901 y(expression)c(that)d(creates)h(instance\(s\))g(of)g(one)g -(of)g(its)h(sub)q(classes,)g(as)e(describ)q(ed)j(in)f(section)g(7.8.)1748 884 -y fs(7)108 957 y fl(The)g(argumen)o(ts)e(to)g(this)i(refactoring)f(are:)106 -1051 y fj(\017)22 b fl(the)15 b(expression)h(that)f(creates)g(an)g(instance)h -(of)f(the)g(sup)q(erclass)h(\(C\))106 1145 y fj(\017)22 b fl(the)15 b(replaci\ -ng)i(expression)f(that)f(creates)f(an)i(instance)g(of)e(the)i(new)f(sub)q(cla\ -ss)37 1251 y(After)g(c)o(hec)o(king)h(its)g(preconditions,)g(this)g(refactori\ -ng:)93 1357 y(1.)22 b(replaces)16 b(the)f(expression)h(with)f(an)g(equiv)m -(alen)o(t)h(expression)g(that)e(creates)h(instance\(s\))g(of)f(the)h(sub-)151 -1414 y(class.)37 1535 y fe(7.9.1)56 b(Preconditions)37 1621 y fl(The)16 b(pre\ -conditions)h(for)d(this)i(refactoring)f(are:)93 1727 y(1.)22 b(satis\014esCla\ -ssIn)o(v)m(arian)o(tP)16 b(\(expression,)f(sub)q(class\))151 1784 y(\(instanc\ -es)g(created)f(b)o(y)g(the)h(expression)g(do)f(not)g(violate)h(the)f(sub)q -(class)h(in)o(v)m(arian)o(t,)g(as)f(discussed)i(in)151 1840 y(section)g(7.8\)\ -.)93 1934 y(2.)22 b fj(8)16 b fl(V)f fj(2)g fl(\(inheritedMem)o(b)q(erV)l(ari\ -ables\(C\))i fj([)f fl(C.lo)q(callyDe\014nedMem)o(b)q(erV)l(ariables\),)226 -1991 y fj(9)g fl(V2)f fj(2)g fl(\(inheritedMem)o(b)q(erV)l(ariables\(sub)q -(cl)q(ass\))i fj([)301 2047 y fl(sub)q(class.lo)q(callyDe\014ned)q(Mem)o(b)q -(erV)l(ariabl)q(es\))226 2104 y fj(^)f fl(matc)o(hingA)o(ttributesP\(V,)e(V2\ -\).)151 2160 y(\(for)g(eac)o(h)i(v)m(ariable)g(in)g(the)g(sup)q(erclass)g(the\ -re)f(is)h(a)f(matc)o(hing)g(v)m(ariable)i(in)f(the)f(sub)q(class\).)93 2254 y -(3.)22 b fj(8)16 b fl(F)e fj(2)i fl(\(inheritedMem)o(b)q(erF)l(unctions\(C\)) -h fj([)e fl(C.lo)q(callyDe\014nedMem)o(b)q(erF)l(unctions\),)226 2310 y fj -(9)h fl(F2)e fj(2)i fl(\(inheritedMem)o(b)q(erF)l(unctions\(sub)q(class\))i fj -([)301 2367 y fl(sub)q(class.lo)q(callyDe\014ned)q(Mem)o(b)q(erF)l(unctions\)) -37 2450 y 750 2 v 89 2477 a fu(7)107 2493 y fp(In)11 b(general,)h(determining) -i(whether)d(an)h(expression)h(can)e(b)q(e)h(sp)q(ecialized)i(is)e(undecidable\ -.)19 b(In)11 b(a)g(program,)h(there)g(ma)o(y)f(b)q(e)37 2539 y(some)i(express\ -ions)h(that)e(cannot)h(b)q(e)g(sp)q(ecialized)i(automatically)m(,)g(either)e -(b)q(ecause)g(determining)i(whether)d(the)g(precondition)37 2584 y(is)i(true) -f(is)h(undecidable,)i(or)d(b)q(ecause)h(the)f(instance)i(violates)g(the)e(in) -o(v)n(arian)o(ts)i(of)e(all)h(of)f(the)g(sub)q(classes.)952 2760 y fl(82)g eop -bop 226 42 a fj(^)16 b fl(matc)o(hingSignatureP\(F,F2\))226 98 y fj(^)g fl -(giv)o(en)f(the)h(sub)q(class)g(in)o(v)m(arian)o(t,)f(F)g(and)g(F2)g(are)g -(seman)o(tically)h(equiv)m(alen)o(t.)151 154 y(\(for)g(eac)o(h)h(function)h -(in)f(the)g(sup)q(erclass,)h(there)f(is)h(a)e(function)i(in)g(the)f(sub)q(cla\ -ss)h(with)f(a)f(matc)o(hing)151 211 y(signature)f(and)h(whic)o(h)g(is)g(seman) -o(tically)g(equiv)m(alen)o(t,)h(giv)o(en)e(the)g(sub)q(class)i(in)o(v)m(arian) -o(t\).)93 305 y(4.)22 b(if)16 b(the)f(expression)h(is)g(a)f(declaration)h(of) -e(a)h(\(non-p)q(oin)o(ter\))h(v)m(ariable)1333 288 y fs(8)1354 305 y fl(:)170 -399 y(\(a\))22 b(there)15 b(are)g(no)g(assignmen)o(ts)g fi(to)h fl(the)f(v)m -(ariable)168 472 y(\(b\))22 b(assignmen)o(ts)15 b fi(of)g fl(the)h(v)m(ariabl\ -e)g(remain)g(t)o(yp)q(e)f(safe.)1146 455 y fs(9)37 593 y fe(7.9.2)56 b(Beha)n -(vior)18 b(Preserv)m(ation)37 679 y fl(F)l(or)f(step)g(one,)h(program)e(prop) -q(ert)o(y)h(six)h(\(t)o(yp)q(e-safe)f(assignmen)o(ts\))g(is)h(preserv)o(ed)f -(b)o(y)g(precondition)i(4)e(\(if)37 736 y(the)j(expression)g(is)f(a)g(declara\ -tion)h(of)f(a)g(\(non-p)q(oin)o(ter\))g(v)m(ariable\);)j(otherwise,)e(program) -e(prop)q(ert)o(y)h(six)37 792 y(is)j(preserv)o(ed)g(b)q(ecause)g(the)f(v)m -(ariable)i(assigned)f(the)f(result)g(of)g(the)g(expression)i(m)o(ust)d(\(b)o -(y)h(de\014nition\))37 848 y(accept)c(an)f(instance)h(of)f(the)g(sup)q(erclas\ -s)h(and)f(hence)i(will)f(accept)g(an)f(instance)h(of)e(one)i(if)f(its)h(sub)q -(classes.)37 905 y(Also)c(for)e(step)h(one,)g(program)f(prop)q(ert)o(y)g(sev) -o(en)h(\(seman)o(tically)h(equiv)m(alen)o(t)h(references)e(and)g(op)q(eration\ -s\))g(is)37 961 y(preserv)o(ed)g(b)o(y)g(preconditions)h(1)e(-)h(3)f(of)g(thi\ -s)h(refactoring;)g(other)g(program)e(prop)q(erties)i(trivially)h(preserv)o -(ed.)37 1018 y(Th)o(us,)i(b)q(eha)o(vior)h(is)g(preserv)o(ed.)37 1161 y fd -(7.10)70 b(Discussion)37 1264 y fe(7.10.1)56 b(P)n(ossible)18 b(Extensions)g -(In)g(Sub)r(classing)37 1350 y fl(Sometimes,)c(additional)h(impro)o(v)o(emen) -o(ts)d(can)i(b)q(e)f(made)h(to)e(the)h(resulting)i(implemen)o(tation.)20 b -(If)14 b(there)f(are)37 1406 y(no)j(instances)h(of)e(the)h(sup)q(erclass)h -(remaining,)g(unreferenced)g(functions)g(can)f(then)g(b)q(e)h(deleted)g(from) -e(the)37 1463 y(\(no)o(w,)e(abstract\))f(sup)q(erclass.)20 b(If)14 b(there)f -(are)g(an)o(y)g(mem)o(b)q(er)h(v)m(ariables)g(de\014ned)h(in)f(the)g(sup)q -(erclass)g(that)f(are)37 1519 y(only)h(referenced)g(in)f(a)g(subset)g(of)f -(the)h(sub)q(classes,)i(then)e(they)g(can)g(b)q(e)g(migrated)g(do)o(wn)f(to)h -(the)g(sub)q(classes.)108 1576 y(While)24 b(the)f(refactorings)f(in)i(this)f -(c)o(hapter)f(sp)q(eci\014cally)k(consider)d(sp)q(ecializations)j(based)d(on) -f(the)37 1632 y(conditions)17 b(of)e(a)g(conditional)i(statemen)o(t,)d(class) -h(in)o(v)m(arian)o(ts)h(as)f(describ)q(ed)i(here)f(can)g(more)e(generally)j -(b)q(e)37 1689 y(applied)h(for)c(other)h(sp)q(ecializations.)108 1745 y(There) -22 b(are)g(cases)g(where)h(the)f(state)f(of)h(an)g(instance)h(ma)o(y)e(c)o -(hange)h(in)h(a)f(w)o(a)o(y)f(that)h(violates)g(the)37 1802 y(in)o(v)m(arian) -o(ts)g(de\014ned)g(on)e(the)h(sub)q(classes.)38 b(Consider)21 b(the)g(TS)g -(Compiler)g(example,)i(discussed)f(earlier.)37 1858 y(Supp)q(ose)16 b(that)f -(the)g(\014nal)g(statemen)o(t)f(in)i(a)e ff(Flo)o(wNo)q(de)h fl(could)h(dynam\ -ically)h(c)o(hange,)e(for)f(example)i(from)e(a)37 1915 y(conditional)h(jump)e -(to)g(an)g(unconditional)i(jump,)e(as)g(part)f(of)h(a)g(compiler)h(optimizati\ -on.)20 b(If)13 b(that)g(instance)37 1971 y(w)o(ere)19 b(\014rst)f(sp)q(eciali\ -zed)k(to)c(b)q(e)h(an)g(instance)g(of)f(the)h ff(CondJumpFlo)o(wNo)q(de)f fl -(class,)i(then)f(when)g(the)g(\014nal)37 2027 y(statemen)o(t)f(of)g(the)g(\ -\015o)o(w)g(no)q(de)h(is)f(c)o(hanged)h(that)f(instance)h(should)g(b)q(e)g -(c)o(hanged)f(to)g(or)g(replaced)h(b)o(y)g(an)37 2084 y(equiv)m(alen)o(t)e -(instance)f(of)f(the)g ff(UncondJumpFlo)o(wNo)q(de)h fl(class.)108 2140 y(The) -g(refactoring)f(in)i(section)f(7.9)f(disallo)o(ws)h(suc)o(h)g(an)g(instance)g -(to)f(b)q(e)i(sp)q(ecialized,)h(since)f(it)f(violates)37 2197 y(the)e(\014rst) -e(precondition.)21 b(There)13 b(are)f(other)h(alternativ)o(es.)19 b(One)14 b -(is)f(to)g(replace)g(an)g(instance)h(of)f(the)g(curren)o(t)37 2253 y(sub)q -(class)19 b(with)g(an)f(instance)g(of)g(a)f(new)h(sub)q(class,)i(when)e(the)g -(state)f(of)h(an)g(instance)g(c)o(hanges)g(in)h(a)e(w)o(a)o(y)37 2310 y(that) -f(violates)g(the)g(in)o(v)m(arian)o(t)h(of)f(its)g(class.)22 b(This)17 b(appr\ -oac)o(h)f(requires)g(\014nding)i(all)f(references)f(to)g(the)g(old)37 2366 y -(instance)j(and)f(c)o(hanging)g(them,)g(along)f(with)h(cop)o(ying)g(an)o(y)f -(state)g(information)h(from)f(the)g(old)i(instance)37 2423 y(needed)k(b)o(y)d -(the)h(new)g(instance.)37 b(This)22 b(approac)o(h)e(w)o(ork)o(ed)g(in)h(the)g -fi(T)m(yp)n(e)n(dSmal)r(ltalk)e fl(example)j(but,)g(in)37 2504 y 750 2 v 89 -2531 a fu(8)107 2546 y fp(See)13 b(discussion)j(of)c(the)i(con)o(v)o(ert)r 12 -2 v 12 w(instance)r 12 2 v 14 w(v)n(ariable)r 12 2 v 14 w(to)r 12 2 v 12 w -(p)q(oin)o(ter)g(refactoring.)89 2576 y fu(9)107 2592 y fp(See)f(precondition) -j(t)o(w)o(o)c(of)h(the)g(c)o(hange)r 12 2 v 13 w(t)o(yp)q(e)h(refactoring.) -952 2760 y fl(83)g eop bop 37 42 a fl(general,)18 b(could)g(not)f(b)q(e)h(app\ -lied)h(unless)f(all)g(parts)e(a)h(program)f(that)g(migh)o(t)h(p)q(oin)o(t)g -(to)g(the)g(old)h(instance)37 98 y(w)o(ere)d(kno)o(wn.)20 b(Another)15 b(alte\ -rnativ)o(e)g(is)h(to)e(refactor,)g(in)o(to)h(a)g(new)g(comp)q(onen)o(t)g(clas\ -s,)g(the)h(b)q(eha)o(vior)f(that)37 154 y(di\013eren)o(tiates)g(the)f(cases)g -(for)f(whic)o(h)i(sub)q(classes)h(should)f(b)q(e)f(created.)20 b(Then,)14 b -(sp)q(ecialize)j(the)d(comp)q(onen)o(t)37 211 y(class)19 b(and)g(substitute)f -(comp)q(onen)o(ts)h(when)f(the)h(condition)g(c)o(hanges.)29 b(In)19 b(this)g -(case,)f(the)h(original)g(class)37 267 y(is)e(not)f(replaced)i(when)f(the)f -(condition)i(c)o(hanges,)e(but)h(its)f(comp)q(onen)o(t)h(is)f(replaced)i(b)o -(y)e(a)g(comp)q(onen)o(t)h(of)37 324 y(another)h(sub)q(class.)30 b(Refactorin\ -gs)19 b(in)o(v)o(olving)g(comp)q(onen)o(ts)g(and)f(the)g(aggregate)f(ob)s(jec\ -ts)h(that)f(con)o(tain)37 380 y(them)f(are)f(de\014ned)h(in)g(the)f(next)h -(c)o(hapter.)37 502 y fe(7.10.2)56 b(Other)18 b(Uses)g(of)h(Class)g(In)n(v)m -(arian)n(ts)37 588 y fl(The)i(term)f fi(class)g(invariant)g fl(is)h(used)g -(in)g(sev)o(eral)g(other)f(w)o(a)o(ys)f(in)j(the)e(ob)s(ject-orien)o(ted)h -(literature.)36 b(In)37 644 y(refactoring,)13 b(the)g(term)g fi(class)g(invar\ -iant)f fl(is)i(used)g(in)f(a)g(manner)g(similar)h(to)f(Mey)o(er's)f([79)o(])g -(use)i(of)e(the)h(term.)108 701 y(Mey)o(er)18 b(describ)q(es)j(a)d(class)h -(in)o(v)m(arian)o(t)h(as)e(a)h(list)g(of)g(assertions)f(that)g(apply)i(to)e -(ev)o(ery)h(instance)g(of)g(a)37 757 y(class.)141 741 y fs(10)199 757 y fl -(His)d fi(invariant)g(rule)f fl(states)f(that,)g(for)h(a)g(class)g(in)o(v)m -(arian)o(t)h(to)f(b)q(e)h(correct:)106 851 y fj(\017)22 b fl(in)o(v)o(oking) -16 b(the)f fi(cr)n(e)n(ate)g fl(pro)q(cedure)h(for)f(the)g(class)g(yields)i -(a)e(state)g(satisfying)g(the)g(class)h(in)o(v)m(arian)o(t)106 945 y fj(\017) -22 b fl(ev)o(ery)14 b(exp)q(orted)g(routine)h(of)f(the)g(class,)g(when)g(in)o -(v)o(ok)o(ed)h(in)f(a)g(state)f(satisfying)i(the)f(class)g(in)o(v)m(arian)o -(t,)151 1001 y(will)j(yield)g(a)e(state)f(satisfying)i(the)f(class)g(in)o(v)m -(arian)o(t.)1071 985 y fs(11)37 1107 y fl(In)h(this)g(rule:)106 1214 y fj(\ -\017)22 b fl(ev)o(ery)15 b(class)h(is)f(considered)i(to)e(ha)o(v)o(e)f(a)h fi -(cr)n(e)n(ate)g fl(pro)q(cedure)106 1308 y fj(\017)22 b fl(the)15 b(state)g -(of)g(the)g(ob)s(ject)f(is)i(de\014ned)h(b)o(y)e(the)g(v)m(alues)i(of)d(its)i -(attribute)f(\014elds)106 1401 y fj(\017)22 b fl(the)15 b(class)h(in)o(v)m -(arian)o(t)g(ma)o(y)e(only)i(in)o(v)o(olv)o(e)g(the)f(state)f(of)h(an)g(ob)s -(ject.)37 1508 y(This)h(de\014nition)i(is)e(similar)g(to)f(the)g(ab)q(o)o(v)o -(e)g(de\014nition)j(used)e(in)g(refactoring,)f(but)g(there)h(is)g(an)f(imp)q -(ortan)o(t)37 1564 y(di\013erence.)26 b(Mey)o(er)16 b(uses)h(class)g(in)o(v)m -(arian)o(ts)g(to)f(ensure)h(correctness)g(at)f(the)h(in)o(terfaces)f(b)q(et)o -(w)o(een)h(classes.)37 1621 y(F)l(or)g(these)h(purp)q(oses,)g(the)g(class)f -(in)o(v)m(arian)o(t)h(need)h(only)f(hold)g(at)f(the)g(p)q(oin)o(ts)h(where)g -(an)f(instance)h(of)f(the)37 1677 y(class)h(is)g(called)g(b)o(y)f(another)g -(ob)s(ject;)g(the)h(class)f(in)o(v)m(arian)o(t)h(need)g(not)f(hold)h(at)e(oth\ -er)h(p)q(oin)o(ts)g(during)h(the)37 1733 y(execution)i(of)f(an)g(exp)q(orted) -g(routine,)h(nor)e(need)i(it)f(hold)h(when)f(the)g(class)g(calls)h(an)f(in)o -(ternal)g(\(priv)m(ate\))37 1790 y(routine.)i(By)14 b(con)o(trast,)e(refactor\ -ing)i(uses)g(a)g(class)h(in)o(v)m(arian)o(t)f(to)g(simplify)i(the)e(in)o(tern\ -als)h(of)e(the)i(class;)f(for)37 1846 y(these)i(purp)q(oses)g(the)f(in)o(v)m -(arian)o(t)h(m)o(ust)e(also)i(remain)f(true)g fi(as)h(viewe)n(d)g(fr)n(om)h -(inside)e(the)i(class)p fl(.)108 1903 y(Another)k(use)g(of)f(the)h(term)f fi -(class)g(invariant)g fl(is)i(made)e(b)o(y)h(Casais)f(in)i([31)o(].)36 b(Casai\ -s)20 b(de\014nes)i(class)37 1959 y(in)o(v)m(arian)o(ts)11 b(as)g(in)o(tegrit) -o(y)f(constrain)o(ts)g(that)g(m)o(ust)g(b)q(e)h(main)o(tained)g(across)f(c)o -(hanges)g(to)g(the)h(sc)o(hema)f(\(system)37 2016 y(structure\).)248 1999 y fs -(12)304 2016 y fl(These)i(constrain)o(ts)f(include,)k(for)c(example,)i(the)f -fi(ful)r(l)h(inheritanc)n(e)f(invariant)p fl(,)g(whic)o(h)g(states)37 2072 y -(that)j(a)g(class)h(inherits)h(all)f(attributes)g(from)e(its)i(ancestors)f -(\(except)g(those)g(that)g(it)h(explicitly)i(rede\014nes\),)37 2129 y(and)j -(the)e fi(typ)n(e)i(c)n(omp)n(atibility)f(invariant)p fl(,)g(whic)o(h)h(state\ -s)e(that)g(the)h(t)o(yp)q(e)g(of)f(a)h(v)m(ariable)h(rede\014ned)g(in)g(a)37 -2185 y(sub)q(class)d(m)o(ust)f(b)q(e)g(consisten)o(t)g(with)g(its)g(domain)h -(as)e(sp)q(eci\014ed)j(in)f(the)f(sup)q(erclass.)26 b(In)o(v)m(arian)o(ts)17 b -(suc)o(h)g(as)37 2242 y(these)g(are)e(imp)q(ortan)o(t)h(for)f(understanding)i -(the)f(seman)o(tics)g(of)g(the)g(language)g(b)q(eing)h(used,)g(but)f(they)g -(are)37 2298 y(distinct)h(from)d(the)i(constrain)o(ts)e(de\014ned)j(on)e(sp)q -(eci\014c)i(classes.)37 2379 y 750 2 v 74 2406 a fu(10)107 2422 y fp(He)12 b -(distingui)q(shes)k(these)d(from)g(preconditions)j(and)e(p)q(ostconditions)i -(de\014ned)f(on)e(routines.)74 2452 y fu(11)107 2468 y fp(His)f(in)o(v)n(aria\ -n)o(t)j(rule)e(also)g(requires)h(that,)e(when)h(these)f(pro)q(cedures)i(are)f -(applied,)h(the)e(argumen)o(ts)i(and)f(state)f(satisfy)h(the)37 2513 y(precon\ -dition)q(s)j(for)c(the)h(pro)q(cedures.)74 2543 y fu(12)107 2559 y fp(Casais) -f([31])g(compares)g(the)g(GemStone)711 2542 y fw(R)701 2543 y fn(\015)752 2559 -y fp([92],)f(Orion)i([9],)e fo(O)1034 2563 y fu(2)1063 2559 y fp(and)h(OTGen) -g(ob)r(ject-orien)o(ted)i(database)f(systems)f(with)37 2604 y(resp)q(ect)i -(to)f(class)h(in)o(v)n(arian)o(ts.)19 b(GemStone)14 b(is)g(a)f(registered)h -(trademark)g(of)f(Servio)h(Logic.)952 2760 y fl(84)g eop bop 108 42 a fl(In) -16 b(summary)l(,)f(in)h(refactoring)f(the)h(term)f fi(class)g(invariant)g fl -(is)h(used)g(in)g(a)f(manner)h(similar)h(to)d(Mey)o(er's)37 98 y([79])f(use)i -(of)f(the)g(term,)f(although)i(in)g(refactoring)f(the)g(in)o(v)m(arian)o(t)h -(applies)h(not)d(only)i(where)g(the)f(class)g(calls)37 154 y(other)h(classes,) -h(but)f(also)g(for)g(states)f(in)o(ternal)i(to)f(the)g(class.)952 2760 y(85)g -eop bop 37 353 a fc(Chapter)35 b(8)37 560 y fb(Refactoring)42 b(T)-10 b(o)40 b -(Capture)37 685 y(Aggregations)j(&)c(Comp)s(onen)m(ts)37 926 y fd(8.1)70 b -(Motiv)l(ation)37 1027 y fl(Inheritance)16 b(is)e(a)f(p)q(o)o(w)o(erful)h(tec) -o(hnique,)h(but)f(in)g(mo)q(deling)h(the)f(relationships)h(among)e(classes)i -(it)e(is)i(some-)37 1084 y(times)g(o)o(v)o(erused)e(and)h(incorrectly)h(used.) -20 b fi(A)n(ggr)n(e)n(gations)12 b fl(are)h(another)h(to)q(ol)f(for)g(mo)q -(deling)j(these)e(relation-)37 1140 y(ships.)108 1197 y(T)l(o)22 b(summarize) -h(from)f(c)o(hapter)g(3,)i(an)e(aggregation)f(is)i(a)g(sp)q(ecial)h(asso)q -(ciation)f(b)q(et)o(w)o(een)f(ob)s(jects,)37 1253 y(represen)o(ting)g(a)f(par\ -t-whole)g(relationship.)40 b(An)21 b(aggregate)f(ob)s(ject,)h(sometimes)g(cal\ -led)i(a)e(comp)q(osite)37 1309 y(ob)s(ject)c(or)f(a)g(con)o(tainer,)h(con)o -(tains)g(one)f(of)h(more)f(parts,)g(called)i(comp)q(onen)o(ts.)24 b(An)17 b -(aggregate)f(class)h(is)g(a)37 1366 y(class)d(con)o(taining)h(one)e(or)g(more) -g(comp)q(onen)o(t)h(mem)o(b)q(ers;)g(a)f(comp)q(onen)o(t)g(class)h(is)g(a)f -(class)h(whose)g(instances)37 1422 y(are)h(comp)q(onen)o(ts)h(of)e(another)h -(class.)108 1479 y(Comp)q(onen)o(ts)g(are)f(stored)g(as)h(mem)o(b)q(er)g(v)m -(ariables)h(in)f(the)g(aggregate)e(ob)s(ject;)h(ho)o(w)o(ev)o(er,)g(as)h(desc\ -rib)q(ed)37 1535 y(in)i(c)o(hapter)f(three,)g(not)g(all)h(mem)o(b)q(er)f(v)m -(ariables)h(of)f(an)g(aggregate)e(class)j(store)e(comp)q(onen)o(t)h(ob)s(ject\ -s.)22 b(F)l(or)37 1592 y(example,)16 b(mem)o(b)q(er)g(v)m(ariables)g(in)h(an) -e ff(Automobile)e fl(class)j(migh)o(t)f(represen)o(t)g(its)h(color,)f(age,)f -(or)h(n)o(um)o(b)q(er)h(of)37 1648 y(passengers;)h(these)g(mem)o(b)q(er)g(v)m -(ariables)h(represen)o(t)f(attributes)f(of)h(an)f(automobile)i(but)f(are)f -(not)g(comp)q(o-)37 1705 y(nen)o(ts)g(of)e(it,)i(in)g(the)f(sense)h(that)e -(an)h(engine)i(or)d(left)i(fron)o(t)e(tire)h(is)h(a)f(comp)q(onen)o(t)g(of)g -(an)g(automobile.)108 1761 y(An)f(aggregate)e(ob)s(ject)i(can)g(b)q(e)g(treat\ -ed)f(as)h(a)f(unit)i(for)e(man)o(y)g(op)q(erations.)20 b(During)14 b(design,) -h(recogniz-)37 1818 y(ing)h(that)f(an)g(asso)q(ciation)h(b)q(et)o(w)o(een)g -(ob)s(jects)f(is)g(an)h(aggregation)e(can)h(help)i(determine)g(ho)o(w)d(to)h -(partition)37 1874 y(b)q(eha)o(vior)21 b(and)g(resp)q(onsibilities)j(among)19 -b(the)i(classes.)35 b(Sometimes)21 b(it)g(is)g(not)e(ob)o(vious)i(that)f(the) -g(rela-)37 1930 y(tionship)i(b)q(et)o(w)o(een)e(ob)s(jects)g(is)h(an)f(aggreg\ -ation)f(un)o(til)i(the)f(co)q(de)h(is)g(reused;)i(as)c(a)h(program)f(is)i(reu\ -sed)37 1987 y(the)d(relationships)h(b)q(et)o(w)o(een)f(classes)f(b)q(ecome)h -(more)f(ob)o(vious.)27 b(In)18 b(these)g(cases,)f(correctly)h(partitioning)37 -2043 y(the)g(b)q(eha)o(vior)g(ma)o(y)e(require)i(mo)o(ving)f(mem)o(b)q(ers)h -(b)q(et)o(w)o(een)f(aggregate)f(classes)i(and)f(the)g(classes)h(of)f(their)37 -2100 y(comp)q(onen)o(ts.)25 b(These)17 b(c)o(hanges)g(ma)o(y)f(not)g(only)h -(impro)o(v)o(e)g(the)g(design)g(of)g(the)f(aggregate)g(class,)h(but)f(also)37 -2156 y(mak)o(e)f(the)g(comp)q(onen)o(t)h(classes)f(more)g(reusable.)108 2213 y -(An)i(example)f(of)g(where)h(suc)o(h)f(a)g(mo)o(v)o(e)f(migh)o(t)h(b)q(e)h -(made)f(is)h(when)g(the)f ff(Automobile)e fl(class)j(con)o(tains)f(a)37 2269 y -(comp)q(onen)o(t)e(mem)o(b)q(er)f(v)m(ariable)i fi(autoEngine)p fl(,)d(whic)o -(h)i(holds)g(an)f(instance)h(of)f(the)g(class)h ff(Engine)p fl(.)20 b(The)13 b -(class)37 2326 y ff(Engine)18 b fl(con)o(tains)e(the)g(mem)o(b)q(er)h(v)m(ari\ -able)h fi(milesPerGal)r(lon)d fl(whic)o(h,)i(for)e(design)j(reasons,)d(really) -j(b)q(elongs)37 2382 y(in)j(the)e(\(aggregate\))e(class)j ff(Automobile)p fl -(.)30 b(The)20 b(refactoring)e(describ)q(ed)k(in)e(section)g(8.7)e(de\014nes) -i(ho)o(w)f(to)37 2439 y(automate)c(suc)o(h)g(a)g(design)h(c)o(hange.)108 2495 -y(This)g(c)o(hapter)f(de\014nes)h(sev)o(eral)f(refactorings)g(in)o(v)o(olving) -i(aggregations:)106 2589 y fj(\017)22 b fl(mo)o(ving)15 b(mem)o(b)q(ers)h(fro\ -m)e(an)h(aggregate)f(class)h(to)g(the)g(class)h(of)f(one)g(of)g(its)g(comp)q -(onen)o(ts)952 2760 y(86)g eop bop 106 42 a fj(\017)22 b fl(mo)o(ving)12 b -(mem)o(b)q(ers)h(from)f(a)g(comp)q(onen)o(t)g(class)h(to)f(the)g(aggregate)f -(classes)i(that)f(con)o(tain)g(comp)q(onen)o(t)151 98 y(mem)o(b)q(ers)j(that) -g(are)g(instances)h(of)f(the)g(comp)q(onen)o(t)g(class)106 191 y fj(\017)22 b -fl(con)o(v)o(erting)15 b(a)g(relationship,)i(mo)q(deled)f(using)g(inheritance\ -,)h(in)o(to)e(an)g(aggregation.)108 283 y(Eac)o(h)k(of)g(these)h(refactorings) -f(requires)h(that)f(the)g(comp)q(onen)o(ts)h(of)f(a)g(class)h(b)q(e)g(determi\ -nable.)34 b(F)l(or)37 339 y(example,)24 b(mo)o(ving)d(a)g(mem)o(b)q(er)h(safe\ -ly)f(from)g(an)g(aggregate)f(to)h(a)g(comp)q(onen)o(t)g(class)h(\(or)f(vice-v) -o(ersa\),)37 395 y(requires)e(that)e(there)g(m)o(ust)g(b)q(e)h(a)g(one-for-on\ -e)f(mapping)h(b)q(et)o(w)o(een)g(the)g(mem)o(b)q(er)f(b)q(eing)i(remo)o(v)o -(ed)e(from)37 452 y(the)e(old)h(class)f(and)g(the)g(mem)o(b)q(er)g(b)q(eing)h -(added)f(to)f(its)h(new)g(class)g(\(or)f(set)h(of)f(classes\).)20 b fi(F)m -(or)15 b(the)h(purp)n(oses)37 508 y(of)e(r)n(efactoring,)g(an)g(imp)n(ortant) -g(char)n(acteristic)f(of)h(c)n(omp)n(onents)e(is)i(that)g(a)g(c)n(omp)n(onent) -f(obje)n(ct)g(c)n(an)g(only)g(b)n(e)37 565 y(assigne)n(d)f(to)h(one)f(aggr)n -(e)n(gate)g(obje)n(ct)h(at)g(a)f(time.)852 548 y fs(1)891 565 y fl(Put)f(anot\ -her)g(w)o(a)o(y)l(,)g(ob)s(jects)f(assigned)i(to)f(one)g(comp)q(onen)o(t)37 -621 y(mem)o(b)q(er)k(v)m(ariable)g(m)o(ust)f(not)g(sim)o(ultaneously)i(b)q -(e)e(assigned)h(to)f(another)g(comp)q(onen)o(t)g(mem)o(b)q(er)g(v)m(ariable.) -37 678 y(F)l(or)20 b(example,)i(in)f(an)f ff(Automobile)f fl(ob)s(ject)h(the) -g(same)g ff(Tire)g fl(ob)s(ject)f(cannot)h(b)q(e)h(assigned)g(as)f(b)q(oth)g -(the)37 734 y fi(leftF)m(r)n(ontTir)n(e)f fl(and)h fi(rightF)m(r)n(ontTir)n -(e)p fl(;)h(similarly)l(,)j(it)c(cannot)h(b)q(e)g(assigned)g(to)f(t)o(w)o(o)f -ff(Automobiles)g fl(at)g(the)37 791 y(same)c(time.)108 847 y(The)f(follo)o -(wing)h(section)f(de\014nes)h(some)f(algorithms)g(for)f(c)o(hec)o(king)i(that) -e(a)h(mem)o(b)q(er)g(v)m(ariable)h(quali\014es)37 904 y(as)e(a)g(comp)q(onen) -o(t)g(mem)o(b)q(er)g(v)m(ariable.)20 b(The)13 b(subsequen)o(t)h(sections)f -(de\014ne)h(the)f(refactorings.)19 b(The)13 b(c)o(hapter)37 960 y(closes)j -(with)g(a)f(discussion)i(of)d(related)i(issues.)37 1103 y fd(8.2)70 b(Chec)n -(king)22 b(If)h(A)g(V)-6 b(ariable)22 b(Quali\014es)f(As)i(A)g(Comp)r(onen)n -(t)37 1204 y fl(There)g(are)g(sev)o(eral)f(w)o(a)o(ys)g(to)g(determine)i(whet\ -her)e(a)h(v)m(ariable)h(quali\014es)g(as)e(a)h(comp)q(onen)o(t)f(mem)o(b)q -(er)37 1261 y(v)m(ariable;)h(that)18 b(is,)i(that)e(ev)o(ery)h(ob)s(ject)g -(assigned)h(to)e(it)h(is)h(not)f(also)g(assigned)g(to)g(another)f(comp)q(onen) -o(t)37 1317 y(v)m(ariable.)j(One)14 b(common)e(case)h(that)g(is)g(trivial)h -(to)f(c)o(hec)o(k)g(is)g(when)h(the)f(v)m(ariable)h(is)g(only)g(directly)g -(assigned)37 1374 y(the)f(result)h(of)e(an)h fi(obje)n(ct)h(cr)n(e)n(ation)f -(expr)n(ession)f fl(\(i.e.)19 b(b)o(y)13 b(a)g(call)h(to)e(the)h(C++)g fi(new) -g fl(function\))g(and)g(its)g(v)m(alue)37 1430 y(is)j(not)f(reassigned)h(to)e -(another)h(v)m(ariable.)108 1487 y(F)l(or)h(example,)h(the)f fi(Choic)n(es)f -fl(Virtual)i(Memory)f(system)g([104)o(])f(has)i(t)o(w)o(o)e(kinds)i(of)f(ob)s -(jects,)f ff(Memo)o(r)o(y-)37 1543 y(Objects)20 b fl(and)e ff(Memo)n(ryObject\ -Caches)p fl(.)26 b(A)18 b ff(Memo)n(ryObjectCache)f fl(is)g(a)g(comp)q(onen)o -(t)h(of)f(a)g ff(Memo)n(ryObject)p fl(.)37 1599 y(A)k ff(Memo)o(r)o(yObject)e -fl(do)q(es)i(not)f(alw)o(a)o(ys)g(ha)o(v)o(e)g(a)g ff(Memo)o(ryObjectCache)p -fl(,)h(but)f(once)h(it)g(gets)f(one)h(it)f(nev)o(er)37 1656 y(c)o(hanges.)g -(The)c(co)q(de)g(to)e(initialize)k(the)e(mem)o(b)q(er)f(v)m(ariable)i fi(c)n -(ache)e fl(lo)q(oks)g(something)h(lik)o(e)g(this:)157 1759 y fg(if)23 b(\(cac\ -he)g(==)h(0\))g({)276 1816 y(cache)f(=)h(new)f(MemoryObjectCache\(this\))e -(})108 1919 y fl(Pro)o(vided)f(that)e(the)h(v)m(alue)i(of)e(mem)o(b)q(er)g -(v)m(ariable)h fi(c)n(ache)f fl(is)h(not)f(assigned)h(to)e(another)h(v)m(aria\ -ble,)i(it)37 1975 y(quali\014es)c(as)e(a)g(comp)q(onen)o(t)g(for)g(the)g(purp) -q(oses)h(of)f(refactoring.)108 2032 y(The)20 b(algorithms)h(de\014ned)g(b)q -(elo)o(w)g(handle)g(the)g(more)e(general)i(case)f(where)h(the)f(v)m(ariable)h -(ma)o(y)f(not)37 2088 y(b)q(e)e(priv)m(ate)g(to)e(its)h(class,)g(or)f(it)h -(ma)o(y)f(b)q(e)i(assigned)f(an)g(ob)s(ject)f(created)h(in)h(another)e(\(serv) -o(er\))g(class.)25 b(The)37 2145 y(section)16 b(is)g(structured)f(in)h(four)f -(parts:)93 2236 y(1.)22 b(it)15 b(describ)q(es)h(a)e(conserv)m(ativ)o(e)h(dat\ -a)e(\015o)o(w)h(algorithm)g(that)g(assumes)g(that)g(the)g(program)f(con)o(tai\ -ns)i(a)151 2293 y(single)i(instance)f(of)e(the)i(aggregate)d(class;)93 2386 y -(2.)22 b(it)11 b(extends)g(the)g(initial)i(algorithm)e(to)f(b)q(etter)h(handl\ -e)h(cases)f(where)g(comp)q(onen)o(t)g(ob)s(jects)f(are)g(created)151 2442 y -(b)o(y)15 b(classes)h(other)f(than)g(the)g(aggregate)f(class;)37 2522 y 750 2 -v 89 2548 a fu(1)107 2564 y fp(This)e(de\014nition)i(is)e(consisten)o(t)h(wit\ -h)f(the)g(meaning)h(of)e fm(exclusive)e fp(comp)q(osite)k(references)f(in)g -(ob)r(ject-orien)o(ted)h(databases,)37 2610 y(as)h(de\014ned)g(b)o(y)f(Kim)h -([66].)952 2760 y fl(87)g eop bop 93 42 a fl(3.)22 b(it)d(further)f(extends)h -(the)g(algorithm)f(to)g(handle)i(the)e(case)h(where)g(a)f(program)f(con)o(tai\ -ns)i(m)o(ultiple)151 98 y(instances)d(of)f(the)g(aggregate)f(class;)93 192 y -(4.)22 b(\014nally)l(,)17 b(it)e(discusses)h(additional)h(extensions)f(that)f -(could)h(mak)o(e)e(the)i(algorithm)f(more)g(p)q(o)o(w)o(erful.)108 286 y(The) -k(assumption)g(in)g(parts)f(one)g(and)h(t)o(w)o(o)e(that)h(the)h(program)e -(con)o(tains)i(a)f(single)i(instance)f(of)f(the)37 342 y(aggregate)c(class)i -(is)g(v)o(ery)g(restrictiv)o(e,)f(but)h(these)g(parts)e(illustrate)j(imp)q -(ortan)o(t)e(p)q(oin)o(ts.)21 b(P)o(arts)15 b(three)g(and)37 399 y(four)g(des\ -crib)q(e)i(less)f(restrictiv)o(e)g(extensions,)f(that)g(build)i(up)q(on)f(the) -f(analysis)h(in)g(the)f(earlier)h(parts.)37 520 y fe(8.2.1)56 b(Assumptions) -18 b(and)h(T)-5 b(erminology)37 606 y fl(T)l(o)15 b(simplify)i(the)f(presen)o -(tation,)f(the)g(follo)o(wing)h(assumptions)f(are)g(made)g(ab)q(out)g(the)g -(program:)106 700 y fj(\017)22 b fl(all)d(ob)s(jects)d(are)i(created)f(dynami\ -cally)j(b)o(y)d(an)h fi(obje)n(ct)g(cr)n(e)n(ation)f(expr)n(ession)g fl(\(i.e\ -.)27 b(a)17 b(p)q(oin)o(t)h(in)g(the)151 756 y(program)c(where)h(the)g(C++)g -fi(new)f fl(function)i(is)f(called\),)h(rather)e(than)h(b)q(eing)h(statically) -g(assigned)f(to)151 813 y(a)g(v)m(ariable)i(at)d(compile)j(time.)106 907 y fj -(\017)22 b fl(eac)o(h)15 b(return)h(statemen)o(t)e(of)g(a)h(function)h(is)g -(of)f(the)g(form:)k fi(r)n(eturn)d fk(V)1337 914 y fr(x)1359 907 y fl(,)f(whe\ -re)g fk(V)1545 914 y fr(x)1582 907 y fl(is)g(a)g(v)m(ariable.)106 1000 y fj -(\017)22 b fl(the)15 b(set)f(of)g(aliasing)i(relationships)g(are)e(kno)o(wn;) -g(that)g(is)h(it)g(is)g(kno)o(wn)f(whic)o(h)h(v)m(ariables)h(are)e(aliased) -151 1057 y(to)k(other)f(v)m(ariables.)30 b(C++)19 b(reference)f(v)m(ariables) -i(\(where)e(a)f(v)m(ariable)j(is)f(passed)f(b)o(y)g(reference)h(in)151 1113 y -(a)g(function)g(call\))h(are)f(an)g(example)g(of)g(aliasing.)32 b(Aliasing)20 -b(relationships)h(are)d(more)h(di\016cult)h(to)151 1170 y(determine)c(when)g -(p)q(oin)o(ters)g(are)f(passed.)108 1264 y(All)20 b(v)m(ariables)h(\(global,) -f(mem)o(b)q(er,)g(argumen)o(t)e(and)h(lo)q(cal\))h(are)f(uniquely)i(iden)o -(ti\014ed.)34 b(Ho)o(w)o(ev)o(er,)19 b(all)37 1320 y(references)e(to)e(the)h -(same)f(mem)o(b)q(er)h(v)m(ariable,)h(ev)o(en)f(if)g(the)g(references)g(are)g -(to)f(di\013eren)o(t)h(instances)g(of)f(the)37 1376 y(same)g(class,)h(will)g -(map)f(to)g(the)g(same)g(iden)o(ti\014er.)108 1433 y(V)l(ariables)k(ha)o(v)o -(e)e(their)h(v)m(alues)h(set)e(b)o(y)g(assignmen)o(t)h(statemen)o(ts)e(and)i -(\(for)e(argumen)o(t)h(v)m(ariables\))i(b)o(y)37 1489 y(function)e(calls.)j -(A)c(v)m(ariable)g(\()p fk(V)599 1496 y fr(x)620 1489 y fl(\))f(ma)o(y)g(b)q -(e)h(assigned:)93 1583 y(1.)22 b(the)15 b(v)m(alue)i(of)e(another)f(v)m(ariab\ -le)j(\()p fk(V)781 1590 y fr(y)801 1583 y fl(\).)93 1677 y(2.)22 b(a)15 b(con\ -stan)o(t)f(\()p fk(C)423 1684 y fr(i)437 1677 y fl(\))93 1771 y(3.)22 b(the) -15 b(return)h(v)m(alue)g(of)f(a)g(function)h(\()p fk(F)801 1778 y fr(j)819 -1771 y fl(\(\)\))93 1865 y(4.)22 b(an)15 b(ob)s(ject)g(returned)g(b)o(y)h(an) -f(ob)s(ject)s 14 2 v 13 w(creation)s 14 2 v 13 w(expression)h(\()p fk(O)1249 -1872 y fr(z)1268 1865 y fl(\))108 1958 y(Asso)q(ciated)11 b(with)f(eac)o(h)h -(v)m(ariable)g fk(V)719 1965 y fr(x)751 1958 y fl(is)f(an)g(\(initially)j(emp\ -t)o(y\))c(set)h fk(D)1285 1965 y fr(V)1306 1969 y ft(x)1337 1958 y fl(of)g -(ob)s(ject)f(creation)i(expressions.)37 2015 y(When)19 b(analysis)h(is)f(comp\ -lete,)h fk(D)644 2022 y fr(V)665 2026 y ft(x)704 2015 y fl(will)g(con)o(tain) -f(the)f(set)h(of)f(all)h(ob)s(ject)f(creation)h(expressions)h(whose)37 2071 y -(return)c(v)m(alues)g(\(newly)g(created)f(ob)s(jects\))f(ma)o(y)h(b)q(e)h(ass\ -igned)f(to)g fk(V)1215 2078 y fr(x)1236 2071 y fl(.)108 2128 y fk(R)143 2135 y -fr(F)165 2140 y ft(j)198 2128 y fl(denotes)h(the)f(set)g(of)g(v)m(ariables)h -(that)f(app)q(ear)g(in)h(return)f(statemen)o(ts)f(of)h(function)h fk(F)1681 -2135 y fr(j)1700 2128 y fl(\(\).)108 2184 y fk(D)146 2191 y fr(R)173 2197 y ft -(F)192 2205 y(j)234 2184 y fl(denotes)22 b(the)g(set)g(of)g(ob)s(ject)f(creat\ -ion)h(expressions)h(whose)f(ob)s(jects)f(ma)o(y)g(b)q(e)i(returned)g(b)o(y)37 -2248 y(function)e fk(F)249 2255 y fr(j)268 2248 y fl(\(\);)g(that)e(is,)i fk -(D)543 2255 y fr(R)570 2261 y ft(F)589 2268 y(j)629 2248 y fl(=)g(\()703 2216 -y fa(S)737 2259 y fr(V)758 2263 y ft(y)776 2259 y fq(2)p fr(R)827 2265 y ft -(F)846 2273 y(j)874 2248 y fk(D)912 2255 y fr(V)933 2259 y ft(y)953 2248 y fl -(\).)33 b(F)l(or)19 b(example,)j(if)e(function)h fk(F)1558 2255 y fr(j)1576 -2248 y fl(\(\))e(con)o(tained)i(t)o(w)o(o)37 2313 y(return)16 b(statemen)o -(ts:)i fi(r)n(eturn)f fk(V)589 2320 y fr(x)625 2313 y fl(and)f fi(r)n(eturn)g -fk(V)879 2320 y fr(y)899 2313 y fl(,)f(then)g fk(D)1068 2320 y fr(R)1095 2326 -y ft(F)1114 2334 y(j)1147 2313 y fl(=)e fk(D)1233 2320 y fr(V)1254 2324 y ft -(x)1285 2313 y fj([)d fk(D)1363 2320 y fr(V)1384 2324 y ft(y)1404 2313 y fl -(.)952 2760 y(88)g eop bop 37 42 a fe(8.2.2)56 b(Basic)18 b(Algorithm:)23 b -(Single)17 b(Instance)i(of)f(Aggregate)h(Class)37 127 y fl(Asso)q(ciated)h -(with)f(eac)o(h)g(assignmen)o(t)g(\(assignmen)o(t)f(statemen)o(t)g(and)h(func\ -tion)h(call\))g(is)f(a)g(set)g(of)f(ob)s(ject)37 184 y(creation)g(expressions) -h(that)d(are)i(added)g(to)f fk(D)865 191 y fr(V)886 195 y ft(x)906 184 y fl -(,)h(where)g fk(V)1098 191 y fr(x)1137 184 y fl(is)g(the)f(v)m(ariable)i(on)f -(the)g(left)f(hand)h(side)h(of)37 240 y(the)d(assignmen)o(t.)k(The)15 b fi -(gen)g fl(sets)f(for)h(eac)o(h)g(assignmen)o(t)g(statemen)o(t)f(S)i(are)f(as) -g(follo)o(ws:)1569 224 y fs(2)21 b(3)108 302 y 844 2 v 107 359 a 2 57 v 133 -342 a fl(Assignmen)o(t)15 b(\(S\))463 359 y 2 57 v 489 342 a(gen[S])g(\(added) -g(to)g fk(D)868 349 y fr(V)889 353 y ft(x)909 342 y fl(\))951 359 y 2 57 v 108 -361 a 844 2 v 108 371 a 844 2 v 107 427 a 2 57 v 133 410 a fk(V)160 417 y fr -(x)197 410 y fl(=)g fk(V)274 417 y fr(y)463 427 y 2 57 v 489 410 a fk(D)527 -417 y fr(V)548 421 y ft(y)951 427 y 2 57 v 107 483 a 2 57 v 133 467 a fk(V) -160 474 y fr(x)197 467 y fl(=)g fk(C)280 474 y fr(i)463 483 y 2 57 v 489 467 a -fj(;)951 483 y 2 57 v 107 548 a 2 65 v 133 523 a fk(V)160 530 y fr(x)197 523 y -fl(=)g fk(F)276 530 y fr(j)295 523 y fl(\(\))463 548 y 2 65 v 489 523 a fk -(D)527 530 y fr(R)554 536 y ft(F)573 544 y(j)951 548 y 2 65 v 107 605 a 2 57 v -133 588 a fk(V)160 595 y fr(x)197 588 y fl(=)g fk(O)282 595 y fr(z)463 605 y 2 -57 v 489 588 a fj(f)p fk(O)547 595 y fr(z)566 588 y fj(g)951 605 y 2 57 v 108 -607 a 844 2 v 108 645 a fl(After)f fk(D)264 652 y fr(V)285 656 y ft(x)320 645 -y fl(has)g(b)q(een)h(computed)g(\(using)f(data)g(\015o)o(w)f(tec)o(hniques\)) -j(for)d(all)i(v)m(ariables)h(in)f(the)f(program,)37 701 y(the)19 b(sets)g(of) -f(ob)s(ject)h(creation)g(expressions)g(for)f(aliased)i(v)m(ariables)g(m)o(ust) -f(b)q(e)g(merged;)h(that)f(is,)g(if)h fk(V)1842 708 y fr(x)1882 701 y fl(is) -37 758 y(aliased)d(as)e fk(V)270 765 y fr(y)290 758 y fl(,)g(then:)20 b fk -(D)477 765 y fr(V)498 769 y ft(x)534 758 y fl(=)15 b fk(D)622 765 y fr(V)643 -769 y ft(y)678 758 y fl(=)h(\()p fk(D)785 765 y fr(V)806 769 y ft(x)836 758 y -fj([)11 b fk(D)915 765 y fr(V)936 769 y ft(y)956 758 y fk(:)p fl(\))108 814 y -(Assuming)18 b(that)f(the)h(program)e(con)o(tains)i(only)g(a)g(single)g(insta\ -nce)h(of)e(the)h(aggregate)e(class,)i(at)f(this)37 871 y(p)q(oin)o(t)h(it)f -(can)f(b)q(e)i(determined)g(whether)f(a)f(v)m(ariable)i fk(V)1006 878 y fr -(c)1039 871 y fl(can)f(b)q(e)h(designated)f(as)f(a)h(comp)q(onen)o(t)f(v)m -(ariable.)37 927 y(It)j(can)f(b)q(e)g(designated)h(as)f(suc)o(h)g(if)h(all)g -(v)m(alues)g(assigned)g(to)e(it)h(are)g(not)g(assigned)g(to)g(other)f(comp)q -(onen)o(t)37 983 y(v)m(ariables.)30 b(This)18 b(is)h(certainly)g(true)e(if)i -(all)f(expressions)h(that)e(create)h(ob)s(jects)f(reac)o(hing)h fk(V)1652 990 -y fr(c)1687 983 y fl(do)g(not)f(also)37 1040 y(create)e(ob)s(jects)g(reac)o -(hing)h(a)f(v)m(ariable)h(already)g(designated)g(as)e(a)h(comp)q(onen)o(t)h -(v)m(ariable,)g(that)e(is:)108 1096 y(Comp)q(onen)o(tIfSingleAggregateInstanc\ -eP\(v)m(ariable)k fk(V)1100 1103 y fr(c)1116 1096 y fl(\))d fj(\021)187 1153 y -(8)h fk(V)255 1160 y fr(y)290 1153 y fj(2)g fl(comp)q(onen)o(tV)l(ariables\(P\ -rogram\),)262 1209 y fk(V)289 1216 y fr(y)325 1209 y fj(6)p fl(=)f fk(V)402 -1216 y fr(c)434 1209 y fj(\))337 1266 y fk(D)375 1273 y fr(V)396 1277 y ft -(y)432 1266 y fj(\\)g fk(D)515 1273 y fr(V)536 1277 y ft(c)569 1266 y fl(=)g -fj(;)p fl(.)37 1387 y fe(8.2.3)56 b(An)19 b(Impro)n(v)n(emen)n(t)d(to)i(the)g -(Basic)h(Algorithm)37 1473 y fl(One)i(w)o(a)o(y)d(in)i(whic)o(h)h(the)e(ab)q -(o)o(v)o(e)g(approac)o(h)g(is)h(conserv)m(ativ)o(e)g(is)g(that)f(it)h(do)q -(es)g(not)f(distinguish)i(among)37 1530 y(ob)s(jects)14 b(created)f(b)o(y)h -(the)g(same)f(ob)s(ject)g(creation)h(expression.)20 b(Supp)q(ose)15 b(there)f -(is)g(a)f(function)i fk(F)1723 1537 y fr(j)1741 1530 y fl(\(\))e(\(a)g(tire) -37 1586 y(distributor\))g(that)f(returns)h(a)f(new)h(tire)g(with)g(eac)o(h)g -(call)h(to)e(it.)19 b(One)13 b(of)g(the)f(mem)o(b)q(er)h(functions)h(of)e(the) -h ff(Au-)37 1643 y(tomobile)h fl(class)j(con)o(tains)f(the)g(co)q(de)h(segmen) -o(t:)22 b fi(leftF)m(r)n(ontTir)n(e)15 b(=)i fk(F)1236 1650 y fr(j)1254 1643 y -fi(\(\);)g(rightF)m(r)n(ontTir)n(e)f(=)h fk(F)1705 1650 y fr(j)1723 1643 y fi -(\(\);)p fl(.)22 b(With)37 1699 y(the)e(ab)q(o)o(v)o(e)g(algorithm,)g fk(D) -517 1706 y fr(R)544 1712 y ft(F)563 1720 y(j)603 1699 y fl(w)o(ould)g(b)q(e)g -(added)h(to)e(b)q(oth)h fk(D)1155 1706 y fr(lef)t(tF)5 b(r)q(ontT)g(ir)q(e) -1403 1699 y fl(and)20 b fk(D)1534 1706 y fr(r)q(ig)q(htF)5 b(r)q(ontT)g(ir)q -(e)1782 1699 y fl(;)21 b(since)37 1760 y fk(D)75 1767 y fr(lef)t(tF)5 b(r)q -(ontT)g(ir)q(e)317 1760 y fl(and)13 b fk(D)441 1767 y fr(r)q(ig)q(htF)5 b(r)q -(ontT)g(ir)q(e)701 1760 y fl(w)o(ould)13 b(con)o(tain)g(common)f(ob)s(ject)g -(creation)h(expressions,)h(the)f(ab)q(o)o(v)o(e)37 1817 y(analysis)20 b(w)o -(ould)g(conclude)h(that)d(they)h(cannot)g(b)q(oth)g(b)q(e)h(designated)g(as)f -(a)f(comp)q(onen)o(t)h(mem)o(b)q(er)h(v)m(ari-)37 1873 y(able.)k(Ho)o(w)o(ev) -o(er,)15 b(since)i(the)f(v)m(ariables)i(are)e(assigned)g(di\013eren)o(t)h(tir\ -es,)f(they)g(ma)o(y)f(qualify)j(as)d(comp)q(onen)o(t)37 1930 y(v)m(ariables.) -108 1986 y(T)l(o)g(handle)h(this,)g(the)f(data)g(\015o)o(w)f(equations)i(are) -f(c)o(hanged)g(to:)37 2115 y 750 2 v 89 2142 a fu(2)107 2157 y fp(The)e fm -(Kil)r(le)n(d)e fp(sets)j(are)f(n)o(ull)89 2187 y fu(3)107 2203 y fp(In)i(C++\ -,)h(the)g(v)n(ariable)i fm(this)c fp(referenced)j(in)f(a)g(mem)o(b)q(er)g(fun\ -ction)h(p)q(oin)o(ts)h(to)d(the)h(ob)r(ject)g(for)g(whic)o(h)h(the)e(function) -j(is)37 2249 y(called)c([41].)i(F)m(or)11 b(an)h(assignmen)o(t)i(of)d(the)h -(form)f fo(V)766 2253 y ft(x)797 2249 y fp(=)h fo(V)861 2253 y ft(y)880 2249 y -fp(,)f(where)h fo(V)1034 2253 y ft(y)1064 2249 y fp(is)g(the)g(v)n(ariable)i -fm(this)p fp(,)c(add)i(to)g fo(D)1542 2253 y ft(V)1560 2257 y fv(x)1591 2249 y -fp(the)g(set)g(of)f(all)i(ob)r(ject)37 2294 y(creation)k(expressions)g(that)f -(create)f(instances)i(of)d(classes)j(that)e(de\014ne)h(or)f(inherit)i(the)e -(mem)o(b)q(er)h(function)g(con)o(taining)i(the)37 2340 y(assignmen)o(t.)952 -2760 y fl(89)g eop bop 108 2 a 844 2 v 107 58 a 2 57 v 133 41 a fl(Assignmen) -o(t)15 b(\(S\))463 58 y 2 57 v 489 41 a(gen[S])g(\(added)g(to)g fk(D)868 48 y -fr(V)889 52 y ft(x)909 41 y fl(\))951 58 y 2 57 v 108 60 a 844 2 v 108 70 a -844 2 v 107 126 a 2 57 v 133 109 a fk(V)160 116 y fr(x)197 109 y fl(=)g fk -(V)274 116 y fr(y)463 126 y 2 57 v 489 109 a fk(D)527 116 y fr(V)548 120 y ft -(y)951 126 y 2 57 v 107 183 a 2 57 v 133 166 a fk(V)160 173 y fr(x)197 166 y -fl(=)g fk(C)280 173 y fr(i)463 183 y 2 57 v 489 166 a fj(;)951 183 y 2 57 v -107 253 a 2 71 v 133 222 a fk(V)160 229 y fr(x)197 222 y fl(=)g fk(F)276 229 y -fr(j)295 222 y fl(\(\))463 253 y 2 71 v 489 222 a fk(D)528 206 y fq(0)527 235 -y fr(R)554 241 y ft(F)573 249 y(j)951 253 y 2 71 v 107 310 a 2 57 v 133 293 a -fk(V)160 300 y fr(x)197 293 y fl(=)g fk(O)282 300 y fr(z)463 310 y 2 57 v 489 -293 a fj(f)p fk(O)547 300 y fr(z)566 293 y fj(g)951 310 y 2 57 v 108 311 a 844 -2 v 108 351 a fl(This)g(is)h(the)f(same)f(as)h(the)f(ab)q(o)o(v)o(e)h(set,)f -(except)h(that)f(for)h(a)f(function)i(call)g(the)e(set)h fk(D)1588 334 y fq -(0)1587 363 y fr(R)1614 369 y ft(F)1633 377 y(j)1668 351 y fl(\(rather)f(than) -37 420 y fk(D)75 427 y fr(R)102 433 y ft(F)121 441 y(j)141 420 y fl(\))h(is)h -(added)g(to)e fk(D)447 427 y fr(V)468 431 y ft(x)489 420 y fl(.)108 484 y fk -(D)147 468 y fq(0)146 497 y fr(R)173 503 y ft(F)192 511 y(j)227 484 y fl(is)i -(de\014ned)g(as)f(follo)o(ws:)106 595 y fj(\017)22 b fl(if)15 b(\015o)o(w)f -(analysis)i(sho)o(w)o(ed)e(that)g fk(F)740 602 y fr(j)759 595 y fl(\(\))g(cre\ -ates)g(and)h(returns)f(a)h(new)g(ob)s(ject)f(eac)o(h)g(time)h(it)g(is)h(calle\ -d,)1892 579 y fs(4)151 652 y fl(and)22 b(that)g fk(F)381 659 y fr(j)399 652 y -fl(\(\))g(do)q(es)g(not)g(store)f(the)i(ob)s(ject)e(b)q(efore)i(returning)f -(it,)i(then)e fk(D)1568 635 y fq(0)1567 664 y fr(R)1594 670 y ft(F)1613 678 y -(j)1655 652 y fj(\021)h fl(the)f(set)g(of)151 721 y(ob)s(ject)17 b(creation)g -(expression\(s\))g(con)o(tained)h(in)g fk(D)1042 728 y fr(R)1069 734 y ft(F) -1088 741 y(j)1108 721 y fl(,)f(eac)o(h)h(app)q(ended)h(with)e(the)g(iden)o -(ti\014er)i(that)151 785 y(distinguishes)f(one)d(call)h(to)f fk(F)671 792 y fr -(j)689 785 y fl(\(\))g(from)f(another.)106 878 y fj(\017)22 b fl(otherwise,) -15 b fk(D)405 862 y fq(0)404 891 y fr(R)431 897 y ft(F)450 905 y(j)485 878 y -fj(\021)h fk(D)574 885 y fr(R)601 891 y ft(F)620 899 y(j)640 878 y fl(.)37 985 -y(This)g(w)o(ould)f(\(in)g(the)f(ab)q(o)o(v)o(e)g(example\))h(cause)g(the)g -(expressions)g(added)g(to)f fk(D)1404 992 y fr(lef)t(tF)5 b(r)q(ontT)g(ir)q -(e)1647 985 y fl(to)14 b(b)q(e)h(distinct)37 1042 y(from)g(those)g(added)h -(to)e fk(D)491 1049 y fr(r)q(ig)q(htF)5 b(r)q(ontT)g(ir)q(e)739 1042 y fl(.) -37 1163 y fe(8.2.4)56 b(A)22 b(F)-5 b(urther)22 b(Impro)n(v)n(emen)n(t:)28 b -(Handling)22 b(Multiple)f(Instances)g(of)i(the)e(Aggre-)209 1221 y(gate)d(Ob) -s(ject)37 1307 y fl(Recall)f(that)d(in)i(the)f(ab)q(o)o(v)o(e)f(analysis,)h fk -(V)741 1314 y fr(c)773 1307 y fl(\(eg,)f fi(leftF)m(r)n(ontTir)n(e)p fl(\))e -(in)k(one)f(ob)s(ject)f(is)h(not)g(distinguished)i(from)37 1364 y fk(V)64 1371 -y fr(c)98 1364 y fl(in)g(another)f(ob)s(ject)f(of)h(the)g(same)g(class.)24 b -(This)17 b(is)f(not)g(a)g(problem)h(if)g(it)f(is)h(kno)o(wn)f(that)g(there)g -(is)h(only)37 1420 y(one)f(instance)g(of)f(the)g(aggregate)f(class;)h(that)f -(is,)i(there)f(is)h(only)f(ob)s(ject)g(in)h(the)f(program)f(con)o(taining)i fk -(V)1869 1427 y fr(c)1886 1420 y fl(.)108 1477 y(Ho)o(w)o(ev)o(er,)d(more)h -(often)g(there)h(ma)o(y)f(b)q(e)h(more)f(than)g(one)g(instance)i(of)e(the)g -(aggregate)f(class.)20 b(Consider)37 1533 y(the)c(follo)o(wing)g(example:)157 -1683 y fg(car1)23 b(=)h(new)f(Automobile\(\);)157 1740 y(car2)g(=)h(new)f(Aut\ -omobile\(\);)157 1796 y(temp)g(=)h(new)f(tire\(\);)157 1853 y(car1.leftFrontT\ -ire)e(=)j(temp;)157 1909 y(car2.leftFrontTire)d(=)j(temp;)108 2059 y fl(In)11 -b(this)h(case,)f(the)g(same)f(tire)h(is)g(assigned)h(as)e(the)h(left)g(fron)o -(t)f(tire)h(of)f(t)o(w)o(o)g(di\013eren)o(t)h(cars,)f(indicating)j(that)37 -2116 y fi(leftF)m(r)n(ontTir)n(e)h fl(of)h(class)h ff(Automobile)d fl(cannot) -j(b)q(e)g(designated)g(as)g(an)f(\(exclusiv)o(e\))i(comp)q(onen)o(t.)k(Ho)o -(w)o(ev)o(er,)37 2172 y(the)e(ab)q(o)o(v)o(e)f(algorithms)h(do)f(not)g(detect) -h(this)g(violation,)g(since)h(they)f(do)f(not)g(distinguish)j(b)q(et)o(w)o -(een)d(the)37 2229 y fi(leftF)m(r)n(ontTir)n(e)i fl(of)g fi(c)n(ar1)i fl(from) -f(the)g fi(leftF)m(r)n(ontTir)n(e)e fl(or)i fi(c)n(ar2)p fl(;)j(\015o)o(w)d -(analysis)h(for)f(eac)o(h)g(of)g(the)h(\014nal)g(t)o(w)o(o)37 2285 y(assignme\ -n)o(ts)16 b(listed)g(ab)q(o)o(v)o(e)f(will)i(add)e fk(D)752 2292 y fr(temp) -847 2285 y fl(to)g fk(D)941 2292 y fr(lef)t(tF)5 b(r)q(ontT)g(ir)q(e)1169 2285 -y fl(.)108 2342 y(T)l(o)15 b(generalize)h(the)f(ab)q(o)o(v)o(e)f(algorithms,) -g(a)h(v)m(ariable)h fk(V)1062 2349 y fr(c)1093 2342 y fl(can)f(b)q(e)h(design\ -ated)f(as)f(a)h(comp)q(onen)o(t)g(only)g(if)37 2398 y(b)q(oth)h(of)f(the)g -(follo)o(wing)h(conditions)g(are)f(true:)37 2479 y 750 2 v 89 2506 a fu(4)107 -2522 y fp(Supp)q(ose)g(that)f fo(D)374 2526 y ft(R)397 2532 y fv(F)415 2538 y -(j)448 2522 y fp(only)h(con)o(tains)g(ob)r(ject)f(creation)h(expressions)h -(lo)q(cal)f(to)f fo(F)1314 2526 y ft(j)1330 2522 y fp(\(\).)19 b(Then,)13 b -(eac)o(h)i(function)g(in)o(v)o(o)q(cation)37 2579 y(returns)f(a)f(unique)i -(ob)r(ject.)952 2760 y fl(90)g eop bop 93 42 a fl(1.)22 b(the)17 b(v)m(alues) -g(assigned)g(to)f fk(V)632 49 y fr(c)665 42 y fl(are)g(distinct)h(from)f(the) -g(v)m(alues)i(assigned)f(to)e(other)h(comp)q(onen)o(t)h(v)m(ari-)151 98 y(abl\ -es;)f(that)e(is,)h(Comp)q(onen)o(tIfSingleAggregateInstanceP\()p fk(V)1254 105 -y fr(c)1272 98 y fl(\),)g(de\014ned)h(ab)q(o)o(v)o(e;)93 190 y(2.)22 b(the)f -(v)m(alues)h(assigned)f(to)f fk(V)649 197 y fr(c)687 190 y fl(in)i(one)f(inst\ -ance)g(of)f(its)h(aggregate)f(class)h(m)o(ust)f(also)h(b)q(e)g(di\013eren)o -(t)151 247 y(from)15 b(v)m(alues)i(assigned)f(to)f fk(V)658 254 y fr(c)691 247 -y fl(in)h(another)g(instance)g(of)f(that)g(class)h(\(i.e.)22 b(the)16 b fi -(leftF)m(r)n(ontTir)n(e)d fl(of)i(one)151 303 y ff(Automobile)e fl(m)o(ust)i -(b)q(e)h(distinct)g(from)f(the)g fi(leftF)m(r)n(ontTir)n(e)e fl(of)i(another) -f ff(Automobile)p fl(\).)37 394 y(The)19 b(second)g(condition)h(is)f(not)f -(decidable)j(in)e(general)g(but)f(can)h(b)q(e)g(determined)h(to)e(b)q(e)h(tru\ -e)f(for)g(some)37 450 y(common)d(cases,)g(where)h(all)g(assignmen)o(ts)f(to)f -fk(V)875 457 y fr(c)907 450 y fl(are)h(of)g(the)g(follo)o(wing)h(forms:)93 540 -y(1.)22 b fk(V)178 547 y fr(x)215 540 y fl(=)15 b fk(O)300 547 y fr(z)320 540 -y fl(;)g(that)f(is,)h fk(V)531 547 y fr(c)563 540 y fl(is)h(alw)o(a)o(ys)f -(assigned)g(a)g(newly)h(created)g(comp)q(onen)o(t)f(ob)s(ject)93 633 y(2.)22 b -fk(V)178 640 y fr(x)218 633 y fl(=)d fk(F)301 640 y fr(j)319 633 y fl(\(\),)g -(where)f fk(F)550 640 y fr(j)569 633 y fl(\(\))g(is)h(kno)o(wn)f(to)g(return) -g(a)g(di\013eren)o(t)h(comp)q(onen)o(t)g(ob)s(ject)f(eac)o(h)g(time)h(it)g -(is)151 689 y(in)o(v)o(ok)o(ed)93 781 y(3.)j(all)17 b(assignmen)o(ts)e(to)g fk -(V)550 788 y fr(c)582 781 y fl(are)g(generated)h(b)o(y)f(an)h(ob)s(ject)f(cre\ -ation)h(expression)g(in)g(the)g(curren)o(t)f(in)o(v)o(o-)151 838 y(cation)g -(of)g(the)h(function)g(con)o(taining)f(the)h(assignmen)o(t.)k(As)15 b(noted)g -(in)h(the)f(prior)h(section,)f(reac)o(hing)151 894 y(de\014nitions)i(analysis) -f(can)f(determine)i(this)e(in)h(some)f(cases.)37 1015 y fe(8.2.5)56 b(Limitat\ -ions)16 b(of)i(This)h(Approac)n(h)37 1101 y fl(One)c(limitation)f(of)f(the)h -(ab)q(o)o(v)o(e)e(approac)o(h)h(is)h(that)f(it)g(do)q(esn't)h(distinguish)h -(among)d(m)o(ultiple)k(assignmen)o(ts)37 1158 y(of)e(or)f(to)g(the)h(same)f -(v)m(ariable.)21 b(That)13 b(is,)h(for)f(an)g(assignmen)o(t)h(of)f(the)h(form\ -:)k fk(V)1382 1165 y fr(x)1417 1158 y fl(=)c fk(V)1493 1165 y fr(y)1513 1158 y -fl(,)g(this)g(approac)o(h)f(adds)37 1214 y(all)j(of)e fk(D)189 1221 y fr(V) -210 1225 y ft(y)244 1214 y fl(to)f fk(D)336 1221 y fr(V)357 1225 y ft(x)378 -1214 y fl(,)h(ev)o(en)h(though)f(only)h(a)f(subset)g(of)g(the)g(expressions)h -(in)g fk(D)1389 1221 y fr(V)1410 1225 y ft(y)1445 1214 y fl(migh)o(t)f(actual\ -ly)h(generate)37 1271 y(ob)s(jects)g(\(assigned)h(to)e fk(V)473 1278 y fr(y) -493 1271 y fl(\))h(that)g(reac)o(h)g(the)g(assignmen)o(t)g(of)g fk(V)1136 1278 -y fr(y)1171 1271 y fl(to)g fk(V)1254 1278 y fr(x)1275 1271 y fl(.)108 1327 y -(A)22 b(less)h(conserv)m(ativ)o(e)g(approac)o(h)f(w)o(ould)g(b)q(e)h(to)f(dis\ -tinguish)i(among)d(m)o(ultiple)j(assignmen)o(ts)e(to)g(a)37 1384 y(v)m(ariabl\ -e.)35 b(Assign)20 b(a)g(unique)h(iden)o(ti\014er)g fk(A)813 1391 y fr(n)856 -1384 y fl(to)e(eac)o(h)h(assignmen)o(t,)g(and)g(asso)q(ciate)f(with)h(eac)o -(h)g(assign-)37 1440 y(men)o(t)25 b fk(A)196 1447 y fr(n)243 1440 y fl(the)g -(set)f fk(D)449 1447 y fr(V)470 1451 y ft(y)488 1447 y fr(;A)524 1451 y ft -(n)548 1440 y fl(,)i(where)e fk(V)754 1447 y fr(y)799 1440 y fl(is)h(the)f -(left-hand-side)j(v)m(ariable)f(of)e(the)g(assignmen)o(t.)47 b(De-)37 1496 y -(\014ne)23 b(the)f(gen)g(sets)f(for)h(eac)o(h)f(assignmen)o(t)h(to)f(include) -j(only)f(the)f(reac)o(hing)g(de\014nitions)i(for)d(the)h(righ)o(t)37 1553 y -(hand)f(side)g(expression.)35 b(F)l(or)19 b(example,)j(for)d(the)h(assignmen) -o(t)g fk(V)1209 1560 y fr(x)1250 1553 y fl(=)g fk(V)1332 1560 y fr(y)1353 1553 -y fl(,)g(the)g(gen)g(set)g(is)h fk(D)1723 1536 y fq(0)1722 1566 y fr(V)1743 -1570 y ft(y)1763 1553 y fl(,)f(where)37 1614 y fk(D)76 1597 y fq(0)75 1627 y -fr(V)96 1631 y ft(y)129 1614 y fl(=)13 b(\()195 1582 y fa(S)229 1625 y fr(A) -255 1629 y ft(n)277 1625 y fq(2)p fr(Reaching)q(D)q(ef)t(initionsO)q(f)t(V) -710 1629 y ft(y)739 1614 y fk(D)777 1621 y fr(V)798 1625 y ft(y)816 1621 y fr -(;A)852 1625 y ft(n)875 1614 y fl(\).)108 1670 y(When)20 b(the)f(analysis)h -(is)g(completed,)h fk(D)825 1677 y fr(V)846 1681 y ft(y)885 1670 y fl(is)f -(computed)g(as)f(the)g(union)h(of)f(the)h(sets)f(for)f(all)j(places)37 1727 y -(where)16 b(the)f(v)m(ariable)i(ma)o(y)d(b)q(e)i(assigned;)g(that)e(is,)h fk -(D)965 1734 y fr(V)986 1738 y ft(y)1019 1727 y fl(=)e(\()1085 1695 y fa(S) -1119 1738 y fr(A)1145 1742 y ft(n)1167 1738 y fq(2)p fr(Assig)q(nmentsT)5 b -(oV)1461 1742 y ft(y)1490 1727 y fk(D)1528 1734 y fr(V)1549 1738 y ft(y)1567 -1734 y fr(;A)1603 1738 y ft(n)1627 1727 y fl(\).)108 1783 y(Another)16 b(limi\ -tation)g(is)g(that)f(the)h(ab)q(o)o(v)o(e)f(algorithm)g(do)q(es)h(not)f(handl\ -e)i(represen)o(tations)e(other)h(than)37 1840 y(comp)q(onen)o(t)e(mem)o(b)q -(er)g(v)m(ariables)g(for)f(denoting)h(comp)q(onen)o(t/aggregate)e(relationshi\ -ps.)21 b(F)l(or)12 b(example,)j(in)37 1896 y(one)c(prop)q(osed)g(new)g(design) -g(for)f(the)h fi(Choic)n(es)e fl(Virtual)i(Memory)f(system,)h(instead)g(of)f -(storing)g(a)g(comp)q(onen)o(t)37 1953 y ff(Memo)o(ryObjectCache)i fl(as)h -(a)g(mem)o(b)q(er)g(v)m(ariable)h(of)f ff(Memo)o(r)o(yObject)p fl(,)f(a)h(has\ -h)g(table)g(has)g(b)q(een)i(prop)q(osed)e(for)37 2009 y(storing)18 b(all)h -(comp)q(onen)o(t/aggregate)d(relationships)j(in)g(one)f(place.)29 b(The)18 b -(ab)q(o)o(v)o(e)f(algorithms)h(w)o(ould)g(not)37 2065 y(handle)f(this.)108 -2122 y(As)f(with)h(all)g(data)f(\015o)o(w)g(algorithms,)g(the)g(algorithms)g -(prop)q(osed)h(here)g(are)f(conserv)m(ativ)o(e.)23 b(Whether)37 2178 y(they) -17 b(are)f(p)q(o)o(w)o(erful)g(enough)h(to)e(b)q(e)i(useful)h(can)e(only)h -(b)q(e)g(learned)g(b)o(y)f(exp)q(erience.)25 b(There)17 b(probably)g(are)37 -2235 y(more)d(p)q(o)o(w)o(erful)h(data\015o)o(w)e(algorithms)h(that)g(could)h -(b)q(e)g(in)o(v)o(en)o(ted)g(for)e(this)i(problem,)g(but)f(that)g(is)h(not)e -(the)37 2291 y(fo)q(cus)j(of)f(this)g(thesis.)37 2434 y fd(8.3)70 b(Adding)29 -b(A)g(Mem)n(b)r(er)g(V)-6 b(ariable)28 b(T)-6 b(o)30 b(The)f(Set)f(Of)h(Comp) -r(onen)n(t)194 2509 y(V)-6 b(ariables)37 2610 y fl(This)16 b(refactoring)f -(adds)g(a)g(mem)o(b)q(er)h(v)m(ariable)g(to)f(the)g(set)g(of)g(comp)q(onen)o -(t)g(v)m(ariables)i(for)d(its)i(class.)952 2760 y(91)g eop bop 37 42 a fl(The) -16 b(argumen)o(t)e(to)h(this)h(refactoring)e(is:)106 135 y fj(\017)22 b fl -(the)15 b(mem)o(b)q(er)h(v)m(ariable)g(\(V\))f(to)g(b)q(e)g(added)h(to)f(the) -g(comp)q(onen)o(t)g(list.)37 241 y(After)g(c)o(hec)o(king)h(its)g(preconditio\ -n,)g(this)g(refactoring:)93 347 y(1.)22 b(adds)15 b(V)h(to)e(con)o(tainingCla\ -ss\(V\).SetOfComp)q(onen)o(ts.)37 469 y fe(8.3.1)56 b(Preconditions)37 555 y -fl(The)16 b(precondition)h(of)d(this)i(refactoring)f(is:)93 648 y(1.)22 b(qua\ -li\014esAsComp)q(onen)o(tP\(mem)o(b)q(er)s 14 2 v 15 w(v)m(ariable\).)37 770 y -fe(8.3.2)56 b(Beha)n(vior)18 b(Preserv)m(ation)37 856 y fl(This)g(refactoring) -e(is)i(b)q(eha)o(vior)f(preserving)g(b)q(ecause)h(it)f(merely)h(annotates)e -(design)h(information)g(to)f(the)37 912 y(program.)37 1055 y fd(8.4)70 b(Remo) -n(ving)22 b(A)g(Mem)n(b)r(er)g(V)-6 b(ariable)22 b(F)-6 b(rom)23 b(The)f(Set) -g(Of)h(Comp)r(o-)194 1130 y(nen)n(t)g(V)-6 b(ariables)37 1231 y fl(This)17 b -(refactoring)f(remo)o(v)o(es)g(a)g(mem)o(b)q(er)g(v)m(ariable)i(from)d(the)i -(list)g(of)e(comp)q(onen)o(t)i(v)m(ariables)g(for)f(its)g(class.)37 1288 y -(the)g(argumen)o(t)e(to)h(this)g(refactoring)g(is:)106 1381 y fj(\017)22 b fl -(the)15 b(mem)o(b)q(er)h(v)m(ariable)g(\(V\))f(to)g(b)q(e)g(remo)o(v)o(ed)g -(from)g(the)g(comp)q(onen)o(t)g(list.)37 1487 y(This)h(refactoring:)93 1593 y -(1.)22 b(remo)o(v)o(es)14 b(V)i(from)e(con)o(tainingClass\(V\).SetOfComp)q -(onen)o(ts.)37 1715 y fe(8.4.1)56 b(Preconditions)37 1801 y fl(None.)37 1923 y -fe(8.4.2)g(Beha)n(vior)18 b(Preserv)m(ation)37 2008 y fl(This)g(refactoring)f -(is)h(b)q(eha)o(vior)g(preserving)g(b)q(ecause)g(it)g(merely)g(deletes)g(desi\ -gn)g(information)g(from)e(the)37 2065 y(program.)37 2208 y fd(8.5)70 b(Mo)n -(ving)30 b(Mem)n(b)r(ers)e(in)n(to)g(a)i(Comp)r(onen)n(t)e(\(P)n(oin)n(ter)g -(to)h(Aggre-)194 2283 y(gate)23 b(Stored)g(in)f(Comp)r(onen)n(t\))37 2384 y fl -(This)15 b(section)g(and)g(section)g(8.6)e(de\014ne)i(refactorings)f(for)g -(mo)o(ving)g(a)g(set)g(of)g(mem)o(b)q(ers)g(from)g(an)g(aggregate)37 2441 y -(class)h(to)f(the)h(class)g(of)f(one)h(of)f(its)h(comp)q(onen)o(ts.)20 b(One) -15 b(issue)h(in)f(mo)o(ving)g(suc)o(h)g(mem)o(b)q(ers)f(is)i(whether)e(they) -37 2497 y(can)g(still)g(reference)g(mem)o(b)q(ers)f(remaining)h(in)g(the)f -(aggregate)f(class.)19 b(The)13 b(t)o(w)o(o)f(refactorings)h(di\013er)g(in)h -(ho)o(w)37 2554 y(they)f(handle)h(references)f fi(by)g fl(a)f(mem)o(b)q(er)h -(b)q(eing)h(mo)o(v)o(ed)e fi(to)h fl(a)g(mem)o(b)q(er)f(that)g(will)j(remain) -e(in)g(the)g(aggregate)37 2610 y(class.)23 b(This)16 b(section)h(describ)q -(es)g(a)f(refactoring)g(where)g(a)f(p)q(oin)o(ter)i(to)e(the)h(aggregate)e -(ob)s(ject)i(is)g(stored)g(in)952 2760 y(92)g eop bop 37 42 a fl(the)18 b(com\ -p)q(onen)o(t,)g(so)f(that)g(references)h(bac)o(k)g(to)f(mem)o(b)q(ers)h(of)f -(the)g(aggregate)g(ob)s(ject)g(can)g(b)q(e)i(made)e(via)37 98 y(this)g(p)q -(oin)o(ter.)25 b(The)17 b(next)f(section)h(describ)q(es)h(a)f(refactoring)f -(where)g(the)h(aggregate)e(ob)s(ject)h(is)h(passed)g(as)37 154 y(an)f(argumen) -o(t)e(in)i(calls)g(to)f(all)h(functions)g(that)e(reference)i(mem)o(b)q(ers)g -(remaining)g(in)g(the)f(aggregate)f(class.)108 211 y(During)23 b(refactoring,) -g(the)f(new)g(mem)o(b)q(ers)g(of)g(the)g(comp)q(onen)o(t)g(class)h(are)f(adde\ -d)g(b)q(efore)h(the)f(old)37 267 y(mem)o(b)q(ers)16 b(are)g(deleted)h(from)e -(the)h(aggregate)e(class.)23 b(Sometimes,)15 b(a)h(comp)q(onen)o(t)g(class)g -(will)i(b)q(e)e(a)g(sup)q(er-)37 324 y(class)h(\(or)f(sub)q(class\))h(of)f -(an)g(aggregate)f(class.)24 b(F)l(or)15 b(example,)i(in)h(a)e(user)g(in)o(ter\ -face)h(framew)o(ork)e(the)h(class)37 380 y ff(Windo)o(w)i fl(migh)o(t)f(inclu\ -de)j(comp)q(onen)o(ts)d(of)g(class)h ff(Sub-Windo)o(w)p fl(;)h(these)f(t)o -(w)o(o)e(classes)h(w)o(ould)h(probably)g(b)q(e)37 437 y(part)g(of)g(the)g(sam\ -e)g(inheritance)i(hierarc)o(h)o(y)l(.)29 b(In)19 b(this)g(cases,)f(naming)h -(con\015icts)g(could)g(o)q(ccur)g(when)f(the)37 493 y(mem)o(b)q(ers)i(are)g -(added)g(to)f(the)h(comp)q(onen)o(t)g(class.)34 b(When)20 b(p)q(oten)o(tial)h -(naming)f(con\015icts)h(are)e(detected,)37 550 y(the)e(mem)o(b)q(ers)f(b)q -(eing)h(added)g(to)e(the)h(comp)q(onen)o(t)g(class)g(are)g(giv)o(en)h(an)e -(\(automatically)i(generated\))e(new)37 606 y(name.)27 b(After)17 b(the)g(ref\ -actoring)g(is)h(\014nished,)h(the)f(user)f(could)h(rename)g(the)f(mo)o(v)o -(ed)g(mem)o(b)q(ers)g(using)h(the)37 663 y fi(change)s 14 2 v 14 w(variable)s -14 2 v 14 w(name)d fl(or)f fi(change)s 14 2 v 14 w(memb)n(er)s 14 2 v 13 w -(function)s 14 2 v 14 w(name)h fl(refactoring.)37 769 y(The)h(argumen)o(ts)e -(to)h(this)g(refactoring)g(are:)106 875 y fj(\017)22 b fl(the)15 b(aggregate) -f(class)i(\(C\))106 969 y fj(\017)22 b fl(the)15 b(set)g(of)g(mem)o(b)q(er)h -(v)m(ariables)g(b)q(eing)h(mo)o(v)o(ed)d(\(setOfMo)o(vingV)l(ars\))106 1063 y -fj(\017)22 b fl(the)15 b(set)g(of)g(mem)o(b)q(er)h(functions)f(b)q(eing)i(mo) -o(v)o(ed)e(\(setOfMo)o(vingF)l(uncs\))106 1156 y fj(\017)22 b fl(the)15 b(com\ -p)q(onen)o(t)h(mem)o(b)q(er)f(v)m(ariable)i(\(V\))108 1263 y(In)d(this)h(desc\ -ription,)g(the)f(class)g(of)f(the)h(comp)q(onen)o(t)g(mem)o(b)q(er)g(v)m(aria\ -ble)h(\(ie)f(V.t)o(yp)q(e\))g(is)g(referred)g(to)f(as)37 1319 y(comp)q(onen)o -(tClass.)37 1425 y(After)i(c)o(hec)o(king)h(its)g(preconditions,)g(this)g(ref\ -actoring:)93 1532 y(1.)22 b(mak)o(es)17 b fi(A)n(ggr)n(e)n(gateObje)n(ct)f fl -(a)h(mem)o(b)q(er)h(v)m(ariable)h(of)e(comp)q(onen)o(tClass,)h(with)g(a)f(t)o -(yp)q(e)g(that)g(accepts)151 1588 y(an)e(instance)h(of)f(class)h(C:)170 1682 y -(\(a\))22 b(if)g(the)g(mem)o(b)q(er)g(v)m(ariable)h fi(A)n(ggr)n(e)n(gateObje) -n(ct)c fl(is)k(already)e(a)h(mem)o(b)q(er)f(of)h(comp)q(onen)o(tClass,)251 -1738 y(then:)288 1812 y(i.)h(if)12 b(the)g(curren)o(t)f(t)o(yp)q(e)g(of)g fi -(A)n(ggr)n(e)n(gateObje)n(ct)f fl(is)i(not)f(C)g(\(or)g(a)g(sup)q(erclass)h -(of)f(C\),)g(c)o(hange)s 14 2 v 13 w(t)o(yp)q(e)336 1868 y(is)16 b(called)g -(to)e(c)o(hange)h(the)g(t)o(yp)q(e)g(of)g fi(A)n(ggr)n(e)n(gateObje)n(ct)e fl -(to)h(b)q(e)h(a)g(sup)q(erclass)h(common)e(to)h(C)336 1924 y(and)h(the)f(curr\ -en)o(t)g(t)o(yp)q(e)g(of)g fi(A)n(ggr)n(e)n(gateObje)n(ct)p fl(.)168 1998 y -(\(b\))22 b(else,)16 b(if)g fi(A)n(ggr)n(e)n(gateObje)n(ct)d fl(is)j(already) -f(a)g(mem)o(b)q(er)g(of)g(one)g(or)g(more)g(sub)q(classes)h(of)f(C:)288 2071 y -(i.)23 b(for)12 b(eac)o(h)g(sub)q(class)h(where)f(the)g(lo)q(cally)i(de\014ne\ -d)f fi(A)n(ggr)n(e)n(gateObje)n(ct)d fl(has)i(a)g(t)o(yp)q(e)g(that)f(is)i -(not)336 2127 y(C)e(\(or)g(a)g(sup)q(erclass)h(of)f(C\),)f(c)o(hange)s 14 2 v -14 w(t)o(yp)q(e)h(is)h(called)h(to)e(c)o(hange)g(the)g(t)o(yp)q(e)h(of)f fi -(A)n(ggr)n(e)n(gateOb-)336 2183 y(je)n(ct)k fl(to)f(b)q(e)i(a)f(sup)q(erclass) -h(common)f(to)g(C)g(and)g(the)g(curren)o(t)g(t)o(yp)q(e)h(of)f fi(A)n(ggr)n -(e)n(gateObje)n(ct)p fl(.)276 2248 y(ii.)23 b(mo)o(v)o(e)s 14 2 v 13 w(mem)o -(b)q(er)s 14 2 v 13 w(v)m(ariable)s 14 2 v 15 w(to)s 14 2 v 13 w(sup)q(erclas\ -s)18 b(is)f(called)i(to)d(mo)o(v)o(e)g fi(A)n(ggr)n(e)n(gateObje)n(ct)f fl -(to)i(com-)336 2305 y(p)q(onen)o(tClass.)173 2378 y(\(c\))22 b(else,)15 b(cre\ -ate)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable)g(is)f(called)i(to)c -(add)i(the)g(v)m(ariable)h fi(A)n(ggr)n(e)n(gateObje)n(ct)d fl(\(t)o(yp)q(e:) -18 b(the)251 2434 y(aggregate)c(class\))h(as)g(a)g(protected)g(mem)o(b)q(er)g -(of)g(comp)q(onen)o(tClass.)93 2528 y(2.)22 b(if)c(access)f(to)f(V)i(is)f(not) -g(already)g(abstracted,)g(calls)h(abstract)s 14 2 v 12 w(access)s 14 2 v 14 w -(to)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable)h(to)d(ab-)151 2584 y -(stract)e(access)i(in)g(C)f(to)f(V.)952 2760 y(93)g eop bop 93 42 a fl(3.)22 b -(in)16 b(the)f(up)q(date)h(function)g(\(created)f(in)h(the)f(previous)h(step\ -\),)f(adds)g(the)h(assignmen)o(t:)270 131 y fg(AggregateObject)22 b(=)i(<`thi\ -s',)f(the)g(aggregate)g(object>)151 221 y fl(\(steps)17 b(t)o(w)o(o)e(and)j -(three)f(are)f(needed)j(so)d(that)g(all)i(ob)s(jects)f(assigned)g(to)g(V)g -(will)h(con)o(tain)f(a)g(p)q(oin)o(ter)151 278 y(to)e(the)g(aggregate\))93 364 -y(4.)22 b(for)15 b(eac)o(h)h(v)m(ariable)h(in)g(setOfMo)o(vingV)l(ars,)e(call\ -s)i(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable)g(to)e(add)h -(an)g(equiv)m(alen)o(t)151 420 y(\(p)q(ossibly)h(renamed\))e(v)m(ariable)h -(as)f(a)g(public)i(mem)o(b)q(er)f(of)e(comp)q(onen)o(tClass.)93 507 y(5.)22 b -(for)12 b(eac)o(h)g(function)g(in)h(setOfMo)o(vingF)l(uncs,)g(calls)g(create) -s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(function)g(to)e(add)h(the)g(signatur\ -e)151 563 y(of)g(the)g(\(p)q(ossibly)h(renamed\))f(function)h(as)e(a)h(public) -i(mem)o(b)q(er)e(of)f(comp)q(onen)o(tClass.)19 b(Then,)13 b(for)e(eac)o(h)151 -620 y(function)16 b(in)f(setOfMo)o(vingF)l(uncs,)g(calls)h(add)s 14 2 v 14 w -(function)s 14 2 v 14 w(b)q(o)q(dy)g(to)e(add)h(the)g(function)g(b)q(o)q(dy)h -(of)e(eac)o(h)151 676 y(function)h(b)q(eing)h(mo)o(v)o(ed.)j(References)c(to) -f(mem)o(b)q(ers)h(that)e(will)j(remain)f(in)g(the)f(aggregate)f(class)i(are) -151 732 y(pre\014xed)h(with)g fi(A)n(ggr)n(e)n(gateObje)n(ct)p fl(.)93 819 y -(6.)22 b(replaces)12 b(eac)o(h)g(reference)g fi(to)g fl(a)f(mem)o(b)q(er)g -(b)q(eing)i(mo)o(v)o(ed,)e(with)h(a)f(reference)h(to)f(its)h(replacing)g(mem) -o(b)q(er)151 875 y(in)k(comp)q(onen)o(tClass.)93 961 y(7.)22 b(calls)16 b(del\ -ete)s 14 2 v 14 w(mem)o(b)q(er)s 14 2 v 14 w(functions)f(and)g(delete)s 14 2 v -15 w(unreferenced)s 14 2 v 14 w(v)m(ariable)h(to)e(remo)o(v)o(e)g(the)h(no)o -(w)f(unref-)151 1018 y(erenced)i(mem)o(b)q(ers)g(from)e(V.)37 1136 y fe(8.5.1) -56 b(Preconditions)37 1222 y fl(The)16 b(preconditions)h(for)d(this)i(refacto\ -ring)f(are:)93 1302 y(1.)22 b(quali\014esAsComp)q(onen)o(tP\(V\))151 1358 y -(\(V)15 b(quali\014es)i(as)e(a)g(comp)q(onen)o(t)g(mem)o(b)q(er)g(v)m(ariable) -i(of)e(C.\))1181 1342 y fs(5)93 1445 y fl(2.)22 b fj(8)16 b fl(F)e fj(2)i fl -(setOfMo)o(vingF)l(uncs,)226 1501 y fj(8)g fl(referencedMem)o(b)q(er)g fj(2)f -fl(\(v)m(ariablesReferencedBy\(F\))i fj([)301 1557 y fl(functionsCalledBy\(F\ -\)\),)451 1614 y(if)f(referencedMem)o(b)q(er)g fj(2)f fl(mem)o(b)q(ersOf\(com\ -p)q(onen)o(tClass\))h fj(^)526 1670 y fl(referencedMem)o(b)q(er)g fj(62)g fl -(\(setOfV)l(ars)e fj([)i fl(setOfF)l(uncs\),)601 1727 y(referencedMem)o(b)q -(er.accessCon)o(trolMo)q(de)g(=)f(public.)151 1783 y(\(if)k(an)o(y)e(function\ -s)i(in)g(setOfF)l(uncs)g(reference)g(mem)o(b)q(ers)g(remaining)g(in)g(comp)q -(onen)o(tClass,)g(those)151 1840 y(referenced)d(mem)o(b)q(ers)g(are)e(public\ -\).)93 1926 y(3.)22 b(the)15 b(v)m(alue)h(of)e(V)g(is)h(assigned)g(b)q(efore) -g(an)o(y)f(mem)o(b)q(er)h fj(2)g fl(\(setOfMo)o(vingV)l(ars)f fj([)h fl(setOf\ -Mo)o(vingF)l(uncs\))151 1982 y(is)20 b(referenced;)h(V)e(is)g(not)g(reassigne\ -d.)31 b(This)19 b(is)h(needed)g(to)e(ensure)i(that)e(all)i(references)f(to)f -(eac)o(h)151 2039 y(mo)o(ving)13 b(mem)o(b)q(er)h(will)h(p)q(oin)o(t)e(to)g -(the)g(same)g(lo)q(cation)h(at)f(all)h(times.)20 b(Program)11 b(\015o)o(w)i -(analysis)h(w)o(ould)151 2095 y(b)q(e)i(needed)h(to)d(determine)i(this.)93 -2182 y(4.)22 b fj(8)16 b fl(class)f fj(2)h fl(\(comp)q(onen)o(tClass)f fj([)g -fl(sub)q(classesOf\(comp)q(onen)o(tClass\)\),)226 2238 y(mem)o(b)q(erV)l(aria\ -bleNamed\(class,)i fi(A)n(ggr)n(e)n(gateObje)n(ct)p fl(\))c fj(\))301 2295 y -fl(commonSup)q(erclass\(mem)o(b)q(erV)l(ariableNamed\(class,)k fi(A)n(ggr)n -(e)n(gateObje)n(ct)p fl(\),)c(C\).)151 2351 y(\(if)i fi(A)n(ggr)n(e)n(gateObj\ -e)n(ct)e fl(is)j(a)f(mem)o(b)q(er)g(of)f(comp)q(onen)o(tClass)h(or)g(one)g -(its)g(sub)q(classes,)h(the)f(t)o(yp)q(e)g(of)g fi(A)n(g-)151 2407 y(gr)n(e)n -(gateObje)n(ct)10 b fl(shares)h(a)g(common)g(sup)q(erclass)h(with)g(C)f(\(the) -g(aggregate)f(class)h(in)h(this)g(refactoring\)\).)37 2476 y 750 2 v 89 2503 a -fu(5)107 2519 y fp(The)18 b(requiremen)o(t)h(here)g(is)g(that)f(the)g(ob)r -(ject)h(assigned)h(to)e(V)g(in)h(one)g(instance)g(of)f(C)g(is)h(not)f(aliased) -i(as)f(the)f(v)n(alue)37 2564 y(assigned)g(to)e(V)f(in)i(another)f(instance)i -(of)d(C.)g(This)h(condition)j(is)d(implied)i(if)e(V)f(quali\014es)k(as)c(a)h -(comp)q(onen)o(t)h(v)n(ariable.)27 b(F)m(or)37 2610 y(further)14 b(discussion\ -s,)h(see)e(section)i(8.8.)952 2760 y fl(94)g eop bop 37 42 a fe(8.5.2)56 b -(Beha)n(vior)18 b(Preserv)m(ation:)23 b(Steps)18 b(1-5)37 127 y fl(F)l(or)j -(step)g(1-\(a\):)31 b(for)21 b(c)o(hange)s 14 2 v 13 w(t)o(yp)q(e:)32 b(preco\ -ndition)23 b(1)d(\(assignmen)o(ts)h(to)g(the)g(v)m(ariable)h(w)o(ould)g(remai\ -n)37 184 y(t)o(yp)q(e)16 b(safe\))f(is)h(satis\014ed)g(b)q(ecause)h(the)e(new) -h(t)o(yp)q(e)g(w)o(ould)g(b)q(e)g(a)f(sup)q(ert)o(yp)q(e)i(b)q(oth)e(of)h(C)f -(and)h(of)f(its)h(curren)o(t)37 240 y(t)o(yp)q(e;)g(precondition)h(2)f(\(rega\ -rding)f(assignmen)o(ts)g(of)h(the)f(v)m(ariable\))i(is)f(satis\014ed)g(b)q -(ecause)h(b)o(y)e(con)o(v)o(en)o(tion)37 297 y(the)21 b(v)m(ariable)h(is)f -(only)g(used)g(as)f(a)g(reference)h(p)q(oin)o(ter,)h(and)e(is)h(not)f(reassig\ -ned.)36 b(F)l(or)20 b(step)h(1-\(b\):)29 b(the)37 353 y(preconditions)22 b -(of)e(c)o(hange)s 14 2 v 14 w(t)o(yp)q(e)g(are)g(satis\014ed)h(for)e(the)i -(same)f(reasons)f(as)h(giv)o(en)h(for)f(step)g(1-\(a\).)34 b(F)l(or)37 410 y -(mo)o(v)o(e)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable)s 14 2 v 15 w -(to)s 14 2 v 12 w(sup)q(erclass:)h(precondition)23 b(1)f(\(regarding)g(matc)o -(hing)g(attributes\))f(is)i(sat-)37 466 y(is\014ed)g(b)o(y)e(the)h(prior)f -(step)g(\(when)h(c)o(hange)s 14 2 v 13 w(t)o(yp)q(e)g(is)f(applied\);)26 b -(precondition)d(2)e(\(that)f(the)h(v)m(ariable)i(is)37 523 y(not)f(already)g -(de\014ned)h(in)f(the)g(sup)q(erclass\))h(b)o(y)e(the)h(conditions)h(of)e(ste\ -p)h(1-\(b\).)39 b(F)l(or)21 b(step)h(1-\(c\):)32 b(for)37 579 y(create)s 14 2 -v 14 w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable:)21 b(precondition)16 b(1)e(\(t\ -he)f(new)i(v)m(ariable)g(do)q(esn't)f(collide)j(with)d(another)g(v)m(ariable) -37 635 y(referenced)g(within)h(its)e(in)o(tended)h(scop)q(e\))f(is)h(triviall\ -y)g(satis\014ed)g(b)q(ecause)g(this)f(step)g(is)g(in)o(v)o(ok)o(ed)g(only)h -(when)37 692 y(the)i(v)m(ariable)i(is)e(not)g(de\014ned)h(in)g(a)e(sup)q(ercl\ -ass)i(or)e(sub)q(class.)23 b(Also,)16 b(b)o(y)g(con)o(v)o(en)o(tion,)g fi(A)n -(ggr)n(e)n(gateObje)n(ct)e fl(is)37 748 y(a)j(reserv)o(ed)g(name)g(only)h(use\ -d)f(as)g(a)f(mem)o(b)q(er)h(v)m(ariable)i(to)d(p)q(oin)o(t)h(to)g(a)f(comp)q -(onen)o(t)h(ob)s(ject's)f(aggregate;)37 805 y(therefore)f(there)h(will)h(not) -d(b)q(e)i(an)o(y)f(lo)q(cal)h(or)f(global)h(v)m(ariables)g(that)f(collide)i -(with)f(it.)108 861 y(F)l(or)e(abstract)s 14 2 v 13 w(access)s 14 2 v 13 w -(to)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable)j(\(step)d(2\):)19 b -(precondition)d(1)f(\(access)f(to)h(the)f(v)m(ariable)j(has)37 918 y(not)d -(already)h(b)q(een)g(abstracted\))f(is)h(satis\014ed)g(b)q(ecause)g(step)f -(2-\(a\))f(is)i(only)g(in)o(v)o(ok)o(ed)g(when)f(this)h(condition)37 974 y -(is)h(true.)108 1031 y(F)l(or)i(the)h(assignmen)o(t)g(added)g(to)g(the)g(up)q -(date)g(function)h(in)f(step)g(3,)g(program)f(prop)q(ert)o(y)g(sev)o(en)i(\(s\ -e-)37 1087 y(man)o(tically)f(equiv)m(alen)o(t)f(references)g(and)f(op)q(erati\ -ons\))g(is)g(preserv)o(ed)h(b)q(ecause)g(the)f(statemen)o(t)f(assigns)h(a)37 -1144 y(v)m(alue)g(to)e(a)g(newly)h(created)g(and)g(unreferenced)g(v)m(ariable\ -.)22 b(By)16 b(preconditions)h(7)e(and)h(8,)f(and)g(steps)h(1-\(a\))37 1200 y -(and)f(1-\(b\),)e(the)h(v)m(ariable)i fi(A)n(ggr)n(e)n(gateObje)n(ct)c fl(wil\ -l)k(b)q(e)f(de\014ned)g(in)g(the)f(comp)q(onen)o(t)h(class)f(and)g(its)h(t)o -(yp)q(e)f(will)37 1256 y(accept)i(an)f(instance)h(of)f(the)g(aggregate)f(clas\ -s.)20 b(Other)15 b(program)g(prop)q(erties)g(are)g(trivially)i(preserv)o(ed.) -108 1313 y(F)l(or)e(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariab\ -le)i(\(step)e(4\):)21 b(precondition)c(1)e(\(the)h(new)g(v)m(ariable)h(do)q -(esn't)e(collide)j(with)37 1369 y(another)f(v)m(ariable)h(referenced)g(within) -g(its)f(in)o(tended)h(scop)q(e\))f(is)g(satis\014ed)g(b)q(ecause)h(it)f(is)g -(giv)o(en)g(a)g(unique)37 1426 y(name)f(in)g(cases)f(where)g(a)g(name)g(con\ -\015ict)i(w)o(ould)e(o)q(ccur.)108 1482 y(F)l(or)h(create)s 14 2 v 13 w(mem)o -(b)q(er)s 14 2 v 14 w(function)i(\(step)e(5\):)23 b(preconditions)18 b(1)f -(through)f(4)g(\(regarding)h(collisions)i(with)37 1539 y(mem)o(b)q(ers)c(de\ -\014ned)h(in)f(sup)q(erclasses)h(or)e(sub)q(classes\))h(is)g(satis\014ed)h -(b)q(ecause)f(it)g(is)g(giv)o(en)g(a)f(unique)i(name)f(in)37 1595 y(cases)j -(where)g(a)f(name)h(con\015ict)g(w)o(ould)h(o)q(ccur;)f(precondition)i(5)d -(is)h(trivially)h(satis\014ed)g(b)q(ecause)f(there)g(is)37 1652 y(no)e(functi\ -on)g(b)q(o)q(dy)l(.)108 1708 y(F)l(or)c(add)s 14 2 v 13 w(function)s 14 2 v 14 -w(b)q(o)q(dy)h(\(step)f(5\):)18 b(precondition)c(1)e(\(all)g(v)m(ariables)i -(and)e(functions)h(referenced)g(in)g(the)37 1765 y(function)j(b)q(o)q(dy)g -(are)f(visible)i(from)d(the)h(sup)q(erclass\))h(is)g(satis\014ed)f(b)o(y)g -(precondition)i(2)d(of)h(this)g(refactoring;)37 1821 y(precondition)21 b(2)d -(\(the)g(mem)o(b)q(er)h(function)g(is)h(not)e(called\))i(is)f(satis\014ed)g -(b)q(ecause)g(the)g(function)h(is)f(newly)37 1877 y(added)d(to)f(the)g(comp)q -(onen)o(t)h(and)f(is)h(not)e(y)o(et)h(referenced.)37 1999 y fe(8.5.3)56 b(Beh\ -a)n(vior)18 b(Preserv)m(ation:)23 b(Step)18 b(6)h(\(Replacing)e(References\)) -37 2085 y fl(The)h(k)o(ey)f(step)h(in)g(the)f(refactoring)g(is)h(step)g(6,)f -(where)g(references)h(to)f(mem)o(b)q(ers)h(in)g(the)f(aggregate)f(class)37 -2141 y(are)g(replaced)h(b)o(y)f(references)h(to)e(mem)o(b)q(ers)h(in)h(the)f -(comp)q(onen)o(t.)22 b(There)16 b(are)g(sev)o(eral)g(things)g(that)g(migh)o -(t)37 2198 y(happ)q(en)h(that)d(could)j(prev)o(en)o(t)e(this)g(from)g(b)q(ein\ -g)h(done)g(safely:)108 2254 y(Eac)o(h)e(new)f(mem)o(b)q(er)h(migh)o(t)g(not)f -(b)q(e)h(visible)i(in)f(all)f(places)h(where)f(the)f(old)i(mem)o(b)q(er)e(\(i\ -t)h(replaces\))g(w)o(as)37 2311 y(visible.)23 b(Ho)o(w)o(ev)o(er,)13 b(in)j -(steps)g(four)e(and)i(\014v)o(e)f(the)g(new)h(mem)o(b)q(ers)f(are)g(public.) -108 2367 y(One)f(or)f(more)h(of)f(the)g(functions)i(b)q(eing)f(mo)o(v)o(ed)g -(migh)o(t)f(mak)o(e)g(references)h(to)f(v)m(ariables)i(and)f(functions)37 2424 -y(that)g(are)g(visible)j(from)c(the)i(aggregate)d(class)j(but)g(not)e(from)h -(the)g(comp)q(onen)o(t)h(class.)20 b(By)14 b(precondition)i(2,)952 2760 y(95) -g eop bop 37 42 a fl(suc)o(h)17 b(references)f(will)h(b)q(e)g(visible,)g(pro) -o(vided)g(that)e(a)g(p)q(oin)o(ter)h(to)f(the)h(aggregate)e(ob)s(ject)h(is)i -(stored)e(in)h(the)37 98 y(comp)q(onen)o(t;)f(b)o(y)h(step)f(3)g(of)f(this)i -(refactoring,)e(suc)o(h)i(a)f(p)q(oin)o(ter)h(is)f(assigned.)1381 81 y fs(6) -108 154 y fl(The)e(t)o(yp)q(e)g(of)f(the)h(new)g(mem)o(b)q(er)g(migh)o(t)g -(b)q(e)g(di\013eren)o(t)g(from)f(the)h(t)o(yp)q(e)g(of)f(the)h(old)g(mem)o -(b)q(er,)g(and)g(hence)37 211 y(not)j(supp)q(ort)g(the)h(same)e(op)q(erations\ -.)23 b(This)17 b(will)h(not)d(happ)q(en)i(\(b)o(y)f(construction\))g(since)i -(in)e(steps)g(4)g(and)37 267 y(5)f(the)h(new)f(mem)o(b)q(ers)g(ha)o(v)o(e)g -(the)g(same)g(t)o(yp)q(es)h(as)e(the)i(mem)o(b)q(ers)f(they)g(are)g(replacing\ -.)108 324 y(Mem)o(b)q(er)g(v)m(ariables)h(in)g(the)f(comp)q(onen)o(t)h(are)e -(referenced)i(through)f(a)g(lev)o(el)h(of)f(indirection)i(\(the)e(com-)37 380 -y(p)q(onen)o(t)h(v)m(ariable\);)g(this)g(could)g(lead)g(to)e(problems:)93 474 -y(1.)22 b(if)d(an)g(instance)h(of)e(the)h(comp)q(onen)o(t)g(class)g(if)g(not) -g(assigned)g(to)f(the)h(comp)q(onen)o(t)g(v)m(ariable)h(b)q(efore)151 531 y -(a)e(reference)g(is)g(made)g(through)g(that)f(v)m(ariable,)i(the)f(reference) -h(will)g(b)q(e)g(in)o(v)m(alid.)30 b(Precondition)19 b(3)151 587 y(ensures)d -(this)f(will)i(not)e(happ)q(en.)93 681 y(2.)22 b(if)13 b(the)f(v)m(alue)h(of) -f(the)g(comp)q(onen)o(t)h(v)m(ariable)g(c)o(hanges)f(\(i.e.)19 b(a)12 b(new)h -(ob)s(ject)e(is)i(assigned)g(to)e(it\))h(b)q(et)o(w)o(een)151 737 y(reference\ -s)21 b(made)f(via)g(the)h(comp)q(onen)o(t)f(v)m(ariable,)i(the)e(references)h -(will)h(not)e(b)q(e)g(consisten)o(t)h(\(i.e.)151 794 y(adjacen)o(t)g(reads)h -(ma)o(y)f(not)g(return)h(the)g(same)f(v)m(alue,)k(and)c(a)h(read)f(ma)o(y)g -(not)h(return)f(the)h(most)151 850 y(recen)o(tly)16 b(written)f(v)m(alue\).) -21 b(Precondition)16 b(3)f(ensures)h(this)g(will)h(not)d(happ)q(en.)93 944 y -(3.)22 b(if)c(t)o(w)o(o)e(di\013eren)o(t)i(aggregate)d(ob)s(jects)i(use)h(the) -f(same)g(indirection)j(\(i.e.)26 b(p)q(oin)o(t)18 b(through)f(the)h(same)151 -1000 y(comp)q(onen)o(t)d(ob)s(ject\),)e(then)i(up)q(dates)g(made)g(b)o(y)f -(one)h(aggregate)e(ob)s(ject)h(will)i(not)e(b)q(e)h(distinct)h(from)151 1057 y -(up)q(dates)j(made)f(b)o(y)g(the)g(other)g(aggregate)f(ob)s(ject.)28 b(Precon\ -dition)19 b(1)f(ensures)h(that)e(this)i(will)h(not)151 1113 y(happ)q(en.)108 -1207 y(A)o(t)14 b(this)h(p)q(oin)o(t,)g(it)f(has)h(b)q(een)g(argued)f(that)g -(v)m(ariables)i(and)f(functions)g(will)h(b)q(e)f(visible)i(to)c(their)i(calle\ -rs)37 1264 y(b)q(efore)i(and)g(after)f(the)g(mo)o(v)o(e,)g(that)g(the)h(t)o -(yp)q(es)f(of)g(mem)o(b)q(ers)h(will)h(b)q(e)f(the)g(same,)f(and)h(that,)f -(despite)h(the)37 1320 y(lev)o(el)h(of)d(indirection,)j(references)f(to)e(the) -h(old)h(mem)o(b)q(er\(s\))e(in)i(the)f(aggregate)e(class)i(will)i(consisten)o -(tly)f(b)q(e)37 1377 y(replaced)c(b)o(y)f(references)g(to)f(the)g(new)h(mem)o -(b)q(ers)g(in)g(the)g(comp)q(onen)o(t.)18 b(Belo)o(w)12 b(is)g(a)f(more)g(for\ -mal)h(argumen)o(t.)37 1433 y(It)17 b(considers)g(the)f(case)g(of)g(mo)o(ving) -g(a)f(single)j(v)m(ariable)f(from)f(an)g(aggregate)e(class)j(to)e(the)h(class) -h(of)f(one)g(of)37 1489 y(its)g(comp)q(onen)o(ts.)k(It)15 b(can)g(trivially)i -(b)q(e)f(extended)g(to)f(handle)h(m)o(ultiple)h(mem)o(b)q(ers.)108 1546 y(Con\ -sider)d(a)f(program)f(execution)i(trace)f(as)g(a)g(series)g(of)g(reads)g(and) -h(writes)f(to)f(memory)l(.)19 b(F)l(or)13 b(b)q(eha)o(vior)37 1602 y(to)j(b)q -(e)h(preserv)o(ed,)f(the)g(execution)i(traces)d(b)q(efore)i(and)f(after)f(the) -i(refactoring)e(m)o(ust)h(b)q(e)h(equiv)m(alen)o(t.)24 b(F)l(or)37 1659 y(the) -16 b(traces)e(to)h(b)q(e)h(equiv)m(alen)o(t,)g(equiv)m(alen)o(t)h(op)q(eratio\ -ns)f(m)o(ust)e(b)q(e)i(p)q(erformed)g(on)f(equiv)m(alen)o(t)i(v)m(alues.)108 -1715 y(Regarding)h(equiv)m(alen)o(t)g(op)q(erations,)f(there)g(is)g(a)g(funct\ -ion)g(that)f(maps)h fi(e)n(ach)g(step)g fl(in)h(the)e(\014rst)h(trace)37 1772 -y(\(b)q(efore)e(the)h(refactoring\))e(to)g(an)h fi(e)n(quivalent)g(set)h(of)g -(steps)f fl(in)h(the)f(second)g(trace.)20 b(Usually)l(,)c(a)e(step)i(in)f(the) -37 1828 y(\014rst)h(trace)g(maps)g(to)g(a)f(single)j(step)e(in)h(the)g(second) -f(trace,)g(but)g(not)g(alw)o(a)o(ys.)22 b(The)17 b(refactoring)e(will)j(add) -37 1885 y(in)i(an)e(extra)g(lev)o(el)i(of)e(indirection)j(\(the)d(comp)q(onen) -o(t\))h(for)f(some)g(references,)h(requiring)h(an)f(extra)f(read)37 1941 y -(op)q(eration.)108 1998 y(Regarding)f(the)f(v)m(alues)h(read)e(or)h(written,) -f(they)h(are)g(either)g(n)o(um)o(b)q(ers)h(or)e(addresses)h(of)f(ob)s(jects.) -22 b(Al-)37 2054 y(though)c(equiv)m(alen)o(t)i(v)m(alues)f(in)g(equiv)m(alen) -o(t)h(traces)d(will)j(b)q(e)f(iden)o(tical)g(if)g(they)f(are)g(n)o(um)o(b)q -(ers,)g(addresses)37 2110 y(ma)o(y)c(not)g(b)q(e)g(iden)o(tical)j(since)e(the) -f(refactoring)g(c)o(hanges)g(the)g(sizes)h(of)f(ob)s(jects.)19 b(Instead,)14 b -(there)g(is)h(a)f(func-)37 2167 y(tion)f(that)e(maps)g(v)m(ariables)j(and)e -(functions)g(in)h(one)f(trace)f(to)h(their)g(equiv)m(alen)o(t)i(v)m(ariables) -f(and)f(functions)h(in)37 2223 y(the)i(other)g(trace.)k(One)d(w)o(a)o(y)d(to) -h(create)h(this)g(function)h(is)f(to)f(sa)o(y)g(that)g(the)h(n'th)g(new)g(add\ -ress)f(referenced)37 2280 y(as)k(a)g(v)m(alue)i(\(i.e.)29 b(not)17 b(just)h -(as)g(a)g(mem)o(b)q(er)g(v)m(ariable\))i(of)e(one)g(trace)g(will)i(b)q(e)e -(mapp)q(ed)h(to)f(the)g(n'th)g(new)37 2336 y(address)e(referenced)g(as)f(a)g -(v)m(alue)h(of)f(the)g(other.)108 2393 y ff(Lemm)m(a:)i fl(If)e(traces)g(are) -g(equiv)m(alen)o(t)i(then)e(equiv)m(alen)o(t)i(lo)q(cations)f(con)o(tain)f -(equiv)m(alen)o(t)i(v)m(alues.)37 2474 y 750 2 v 89 2501 a fu(6)107 2517 y fp -(F)m(or)f(the)g(refactoring)h(in)g(the)g(next)f(section,)i(suc)o(h)f(referenc\ -es)g(will)h(b)q(e)e(visible)j(b)q(ecause)e(a)f(p)q(oin)o(ter)i(to)e(the)g(agg\ -regate)37 2562 y(ob)r(ject)e(is)f(passed)h(in)g(calls)h(to)e(functions)h(that) -f(reference)h(mem)o(b)q(ers)f(not)g(otherwise)h(visible)i(to)d(the)g(comp)q -(onen)o(t.)952 2760 y fl(96)g eop bop 108 42 a ff(De\014nition:)33 b fl(The) -21 b(i'th)g(mem)o(b)q(er)g(v)m(ariable)h(of)f(equiv)m(alen)o(t)h(ob)s(jects)e -(are)h(equiv)m(alen)o(t)i(except)e(for)f(the)37 98 y(v)m(ariable)j(b)q(eing)f -(mo)o(v)o(ed)f(from)f(an)h(aggregate)f(to)g(a)h(comp)q(onen)o(t.)37 b(In)22 b -(this)g(case,)g(the)f(v)m(ariable)h(in)g(the)37 154 y(aggregate)14 b(in)i(the) -f(\014rst)g(trace)g(is)h(equiv)m(alen)o(t)h(to)d(the)i(v)m(ariable)g(in)g(the) -f(comp)q(onen)o(t)h(in)g(the)f(second.)108 211 y ff(Theo)o(rem:)k fl(T)l(race\ -s)d(b)q(efore)h(and)g(after)e(the)i(refactoring)f(of)g(mo)o(ving)g(a)g(v)m -(ariable)i(from)d(a)i(con)o(tainer)f(to)37 267 y(a)f(comp)q(onen)o(t)h(are)f -(equiv)m(alen)o(t.)108 324 y ff(Pro)q(of:)20 b fl(By)c(induction.)22 b(Base) -16 b(case)g(is)g(the)f(empt)o(y)h(trace.)k(Induction)d(step)f(is)g(to)f(consi\ -der)h(a)g(trace)f(of)37 380 y(n)i(steps.)23 b(By)16 b(the)g(lemma,)h(after)e -(the)h(instruction)i(corresp)q(onding)f(to)e(the)i(n'th)f(instruction)h(of)f -(the)g(\014rst)37 437 y(trace,)e(equiv)m(alen)o(t)i(lo)q(cations)f(con)o(tain) -f(equiv)m(alen)o(t)i(v)m(alues.)21 b(Due)14 b(to)f(the)i(lev)o(el)g(of)f(indi\ -rection)i(in)o(tro)q(duced)37 493 y(b)o(y)d(mo)o(ving)g(a)g(v)m(ariable)h(to) -e(the)h(comp)q(onen)o(t,)g(a)g(single)h(instruction)g(in)f(the)g(old)h(trace) -e(ma)o(y)g(map)h(to)f(sev)o(eral)37 550 y(instructions)18 b(in)g(the)f(new)g -(trace,)f(so)h(the)g(trace)f(of)h(n)g(steps)f(in)i(the)f(old)g(trace)g(corres\ -p)q(onds)g(to)f(m)h(\()p fj(\025)g fl(n\))37 606 y(steps)f(in)g(the)f(new)g -(trace.)20 b(The)15 b(n'th)g(step)g(migh)o(t)g(b)q(e)h(a)f(read,)g(write,)g -(or)g(a)f(function)j(call.)108 663 y(If)h(the)f(step)g(do)q(es)h(not)f(refere\ -nce)h(the)f(v)m(ariable)i(b)q(eing)g(mo)o(v)o(ed,)e(then)g(in)i(the)e(new)h -(trace)e(it)i(maps)f(to)37 719 y(the)d(same)f(instruction)i(applied)g(to)e -(an)g(equiv)m(alen)o(t)i(lo)q(cation)f(in)h(the)e(old)h(trace.)19 b(If)14 b -(it)f(is)h(a)f(read)h(op)q(eration,)37 775 y(then)j(b)o(y)g(the)f(induction)i -(assumption)f(the)f(lo)q(cation)h(in)h(the)e(old)h(trace)f(will)i(con)o(tain) -f(the)f(same)g(v)m(alue)i(as)37 832 y(the)i(equiv)m(alen)o(t)i(lo)q(cation)e -(in)h(the)f(new)g(trace,)g(therefore)f(the)h(reads)g(are)f(equiv)m(alen)o(t.) -36 b(If)20 b(it)g(is)g(a)f(write)37 888 y(op)q(eration,)c(since)g(the)f(lo)q -(cation)h(in)g(the)f(old)h(trace)f(is)h(equiv)m(alen)o(t)g(to)f(the)g(lo)q -(cation)h(in)g(the)f(new)h(trace,)e(and)37 945 y(the)i(v)m(alues)h(written)e -(are)g(the)g(same,)g(the)h(writes)f(are)g(equiv)m(alen)o(t.)22 b(If)14 b(it)h -(is)g(a)f(function)h(call,)g(an)g(equiv)m(alen)o(t)37 1001 y(function)j(is)g -(called)h(in)f(eac)o(h)f(case,)g(and)h(the)f(v)m(alues)h(passed)g(in)g(the)f -(call)h(will)h(b)q(e)f(equiv)m(alen)o(t;)h(therefore,)37 1058 y(the)d(functio\ -n)g(calls)g(are)f(equiv)m(alen)o(t.)22 b(Therefore,)14 b(the)i(traces)e(are)h -(equiv)m(alen)o(t)i(after)d(the)i(n+1'st)e(step.)108 1114 y(If)21 b(the)f(ste\ -p)g(do)q(es)g(reference)h(the)g(v)m(ariable)g(b)q(eing)h(mo)o(v)o(ed,)e(in)h -(the)f(new)h(trace)f(there)g(is)h(a)e(lev)o(el)j(of)37 1171 y(indirection)e -(that)d(will)i(result)f(in)g(a)f(set)g(of)g(steps)g(in)h(the)g(new)f(trace)g -(corresp)q(onding)i(to)d(the)i(single)g(step)37 1227 y(in)f(the)e(old)h(trace\ -.)k(Ho)o(w)o(ev)o(er,)14 b(after)g(the)i(indirection)h(the)f(address)f(read)g -(from,)f(written)i(to,)e(or)h(branc)o(hed)37 1284 y(to)i(in)g(the)g(new)g(tra\ -ce)f(will)i(b)q(e)f(equiv)m(alen)o(t)i(to)d(the)h(address)f(in)i(the)e(old)i -(trace,)e(and)h(the)f(op)q(erations)h(and)37 1340 y(v)m(alues)g(are)e(equiv)m -(alen)o(t,)h(therefore)f(the)g(traces)g(are)g(equiv)m(alen)o(t)i(after)d(the) -i(n+1'st)e(step.)37 1462 y fe(8.5.4)56 b(Beha)n(vior)18 b(Preserv)m(ation:)23 -b(Step)18 b(7)37 1548 y fl(F)l(or)11 b(delete)s 14 2 v 15 w(mem)o(b)q(er)s 14 -2 v 13 w(functions)i(\(step)e(7\):)17 b(precondition)c(1)e(\(the)g(function)h -(to)f(b)q(e)h(deleted)h(is)f(unreferenced)37 1604 y(or)j(redundan)o(t\))g(is) -h(satis\014ed)g(b)q(ecause,)g(as)e(a)h(result)h(of)f(the)g(prior)g(step,)g -(the)h(function)g(is)f(redundan)o(t.)108 1660 y(F)l(or)g(delete)s 14 2 v 15 w -(unreferenced)s 14 2 v 15 w(v)m(ariable)i(\(step)e(7\):)21 b(precondition)c -(1)f(\(the)f(v)m(ariable)i(b)q(eing)g(deleted)h(is)e(un-)37 1717 y(referenced\ -\))g(is)g(satis\014ed)g(b)q(ecause,)g(as)e(a)h(result)h(of)f(the)g(prior)g -(step,)g(the)g(v)m(ariable)i(is)f(unreferenced.)37 1839 y fe(8.5.5)56 b(Beha) -n(vior)18 b(Preserv)m(ation:)23 b(Summary)37 1924 y fl(Eac)o(h)17 b(of)e(the) -i(steps)f(\(1-7\))f(of)h(this)h(refactoring)f(are)g(b)q(eha)o(vior)h(preservi\ -ng,)g(therefore)f(the)g(refactoring)g(is)37 1981 y(b)o(y)g(construction)f(b)q -(eha)o(vior)h(preserving.)37 2124 y fd(8.6)70 b(Mo)n(ving)31 b(Mem)n(b)r(ers) -e(in)n(to)g(a)h(Comp)r(onen)n(t)g(\(Aggregate)g(P)n(assed)194 2199 y(as)24 b -(F)-6 b(unction)22 b(Argumen)n(t\))37 2300 y fl(This)c(and)f(the)f(prior)h -(section)g(de\014ne)h(refactorings)e(for)g(mo)o(ving)h(a)f(set)h(of)f(mem)o -(b)q(ers)h(from)e(an)i(aggregate)37 2357 y(class)22 b(to)e(the)h(class)h(of)e -(one)i(of)e(its)h(comp)q(onen)o(ts.)38 b(This)21 b(section)h(describ)q(es)h -(a)d(refactoring)h(where)g(the)37 2413 y(aggregate)f(ob)s(ject)h(is)h(passed) -f(as)g(an)g(argumen)o(t)g(in)h(calls)g(to)f(all)h(functions)g(that)e(referenc\ -e)i(mem)o(b)q(ers)37 2470 y(remaining)17 b(in)f(the)f(aggregate)f(class.)37 -2576 y(The)i(argumen)o(ts)e(to)h(this)g(refactoring)g(are:)952 2760 y(97)g eop -bop 106 42 a fj(\017)22 b fl(the)15 b(aggregate)f(class)i(\(C\))106 135 y fj -(\017)22 b fl(the)15 b(set)g(of)g(mem)o(b)q(er)h(v)m(ariables)g(b)q(eing)h -(mo)o(v)o(ed)d(\(setOfMo)o(vingV)l(ars\))106 229 y fj(\017)22 b fl(the)15 b -(set)g(of)g(mem)o(b)q(er)h(functions)f(b)q(eing)i(mo)o(v)o(ed)e(\(setOfMo)o -(vingF)l(uncs\))106 323 y fj(\017)22 b fl(the)15 b(comp)q(onen)o(t)h(mem)o -(b)q(er)f(v)m(ariable)i(\(V\))108 429 y(F)l(or)12 b(eac)o(h)g(mem)o(b)q(er)h -(in)g(\(setOfMo)o(vingV)l(ars)f fj([)g fl(setOfMo)o(vingF)l(uncs\),)h(a)f(new) -h(name)f(ma)o(y)g(b)q(e)h(sp)q(eci\014ed.)37 486 y(This)18 b(is)g(needed)g -(to)f(a)o(v)o(oid)f(naming)i(con\015icts)g(that)e(could)i(arise)g(when)f(the) -g(aggregate)f(and)h(comp)q(onen)o(t)37 542 y(classes)f(share)f(an)g(inheritan\ -ce)i(relationship.)108 599 y(In)d(this)h(description,)g(the)f(class)g(of)f -(the)h(comp)q(onen)o(t)g(mem)o(b)q(er)g(v)m(ariable)h(\(ie)f(V.t)o(yp)q(e\))g -(is)g(referred)g(to)f(as)37 655 y(comp)q(onen)o(tClass.)37 761 y(After)i(c)o -(hec)o(king)h(the)g(preconditions,)g(this)g(refactoring:)93 868 y(1.)22 b(for) -15 b(eac)o(h)h(v)m(ariable)h(in)g(setOfMo)o(vingV)l(ars,)e(calls)i(create)s 14 -2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable)g(to)e(add)h(an)g(equiv)m(ale\ -n)o(t)151 924 y(\(p)q(ossibly)h(renamed\))e(v)m(ariable)h(as)f(a)g(public)i -(mem)o(b)q(er)f(of)e(comp)q(onen)o(tClass.)93 1018 y(2.)22 b(Let)e fi(F)m(unc\ -tionsR)n(eferringBackT)m(oA)n(ggr)m(e)n(gate)d fl(b)q(e)j(the)g(subset)g(of)g -(functions)g(con)o(tained)h(in)f(setOf-)151 1074 y(Mo)o(vingF)l(uncs)f(that)e -(refer)h(to)g(v)m(ariables)h(and)g(functions)g(visible)h(from)e(C)g(but)g(not) -g(from)f(comp)q(o-)151 1131 y(nen)o(tClass.)151 1206 y(F)l(or)e(eac)o(h)h(fun\ -ction)g(in)h(setOfMo)o(vingF)l(uncs,)e(this)h(refactoring)f(calls)i(create)s -14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(function)f(to)151 1262 y(add)k(the)f -(signature)g(of)g(an)g(equiv)m(alen)o(t)i(\(p)q(ossibly)g(renamed\))e(functio\ -n)h(as)f(a)g(public)i(mem)o(b)q(er)f(of)151 1319 y(comp)q(onen)o(tClass.)39 b -(\(F)l(or)20 b(functions)j(in)f fi(F)m(unctionsR)n(eferringBackT)m(oA)n(gg)o -(r)n(e)n(gate)p fl(,)e(an)h(additional)151 1375 y(argumen)o(t)15 b(is)g(inclu\ -ded,)j(that)c(p)q(oin)o(ts)i(to)e(the)i(aggregate)d(ob)s(ject.\))151 1450 y -(Then,)22 b(this)f(refactoring)g(calls)h(add)s 14 2 v 13 w(function)s 14 2 v -14 w(b)q(o)q(dy)g(to)e(add)h(the)g(function)g(b)q(o)q(dy)h(of)e(the)h(newly) -151 1507 y(created)14 b(mem)o(b)q(er)f(functions.)20 b(F)l(or)13 b(eac)o(h)h -(function)g(in)g fi(F)m(unctionsR)n(eferringBackT)m(oA)n(ggr)m(e)n(gate)p fl -(,)c(ref-)151 1563 y(erences)17 b(only)f(visible)j(through)c(the)h(aggregate) -f(ob)s(ject)g(are)h(pre\014xed)h(with)f(the)g(name)h(of)e(the)h(new)151 1620 y -(argumen)o(t)f(v)m(ariable)h(that)f(p)q(oin)o(ts)g(to)g(the)g(aggregate.)93 -1714 y(3.)22 b(replaces)d(eac)o(h)f(reference)g(to)g(a)f(mem)o(b)q(er)h(in)h -(\(setOfMo)o(vingV)l(ars)e fj([)h fl(setOfMo)o(vingF)l(uncs\))g(with)g(a)151 -1770 y(reference)d(to)f(the)h(corresp)q(onding)g(mem)o(b)q(er)g(in)g(comp)q -(onen)o(tClass.)20 b(Some)15 b(function)g(calls)g(will)i(pass)151 1826 y(a)e -(p)q(oin)o(ter)h(to)e(the)i(aggregate)d(ob)s(ject)i(as)g(an)g(additional)h -(argumen)o(t.)93 1920 y(4.)22 b(calls)i(delete)s 14 2 v 14 w(mem)o(b)q(er)s 14 -2 v 14 w(functions)f(and)g(delete)s 14 2 v 15 w(unreferenced)s 14 2 v 14 w -(v)m(ariable)h(to)e(remo)o(v)o(e)g(the)h(unrefer-)151 1977 y(enced)16 b(mem)o -(b)q(ers)g(from)e(C.)37 2098 y fe(8.6.1)56 b(Preconditions)37 2184 y fl(The) -16 b(preconditions)h(for)d(these)i(refactorings)e(are)h(the)g(same)g(as)g(pre\ -conditions)i(1-3)e(of)f(the)i(prior)37 2241 y(refactoring.)37 2362 y fe(8.6.2) -56 b(Beha)n(vior)18 b(Preserv)m(ation)37 2448 y fl(F)l(or)j(create)s 14 2 v 14 -w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable)i(\(step)e(1\):)32 b(precondition)24 -b(1)d(\(the)g(new)h(v)m(ariable)h(do)q(esn't)e(collide)j(with)37 2505 y(anoth\ -er)e(v)m(ariable)g(referenced)h(within)f(its)g(in)o(tended)h(scop)q(e\))f(is) -g(satis\014ed)g(b)o(y)f(precondition)i(3)e(of)g(this)37 2561 y(refactoring.) -952 2760 y(98)g eop bop 108 42 a fl(F)l(or)16 b(create)s 14 2 v 13 w(mem)o -(b)q(er)s 14 2 v 14 w(function)i(\(step)e(2\):)23 b(preconditions)18 b(1)f -(through)f(4)g(\(regarding)h(collisions)i(with)37 98 y(mem)o(b)q(ers)14 b(de\ -\014ned)i(in)e(sup)q(erclasses)h(or)f(sub)q(classes\))g(is)h(satis\014ed)f -(b)o(y)g(precondition)h(3)f(of)f(this)h(refactoring;)37 154 y(precondition)h -(5)f(\(all)g(referenced)g(v)m(ariables)h(and)e(functions)i(are)e(reac)o(hable\ -\))h(is)g(satis\014ed)g(b)o(y)f(precondition)37 211 y(4)i(of)g(this)h(refacto\ -ring.)108 267 y(F)l(or)c(add)s 14 2 v 13 w(function)s 14 2 v 14 w(b)q(o)q(dy) -h(\(step)f(2\):)18 b(precondition)c(1)e(\(all)g(v)m(ariables)i(and)e(function\ -s)h(referenced)g(in)g(the)37 324 y(function)j(b)q(o)q(dy)g(are)f(visible)i -(from)d(the)h(sup)q(erclass\))h(is)g(satis\014ed)f(b)o(y)g(precondition)i(4)d -(of)h(this)g(refactoring;)37 380 y(precondition)i(2)d(\(the)g(mem)o(b)q(er)h -(function)g(is)g(unreferenced)h(lo)q(cally)g(in)g(the)e(sup)q(erclass)i(or)e -(the)g(sup)q(erclass)37 437 y(is)i(abstract\))e(is)i(satis\014ed)f(b)o(y)h -(precondition)g(3)f(of)g(this)h(refactoring.)108 493 y(The)d(k)o(ey)g(step)g -(in)h(the)f(refactoring)f(is)i(step)f(3,)g(where)g(references)g(to)g(mem)o -(b)q(ers)g(in)h(the)f(aggregate)e(class)37 550 y(are)j(replaced)h(b)o(y)f(ref\ -erences)g(to)f(mem)o(b)q(ers)h(in)h(the)e(comp)q(onen)o(t.)20 b(Beha)o(vior) -14 b(is)g(preserv)o(ed)g(in)h(section)f(8.5.3)37 606 y(for)h(step)g(5)g(of)g -(the)g(prior)h(refactoring.)108 663 y(F)l(or)d(delete)s 14 2 v 15 w(mem)o(b)q -(er)s 14 2 v 13 w(functions)i(\(step)e(4\):)18 b(precondition)d(1)f(\(the)f -(function)i(to)e(b)q(e)h(deleted)h(is)f(unrefer-)37 719 y(enced)h(or)d(redund\ -an)o(t\))h(is)h(satis\014ed)g(b)q(ecause,)g(as)e(a)h(result)h(of)e(the)h(prio\ -r)h(step,)f(the)g(function)h(is)f(redundan)o(t.)108 775 y(F)l(or)i(delete)s 14 -2 v 15 w(unreferenced)s 14 2 v 15 w(v)m(ariable)i(\(step)e(4\):)21 b(precondi\ -tion)c(1)f(\(the)f(v)m(ariable)i(b)q(eing)g(deleted)h(is)e(un-)37 832 y(refer\ -enced\))g(is)g(satis\014ed)g(b)q(ecause,)g(as)e(a)h(result)h(of)f(the)g(prior) -g(step,)g(the)g(v)m(ariable)i(is)f(unreferenced.)108 888 y(Eac)o(h)e(of)f(the) -h(steps)g(of)f(this)i(refactoring)e(are)h(preserving,)g(therefore)g(the)g(ref\ -actoring)f(is)i(b)o(y)e(construc-)37 945 y(tion)j(b)q(eha)o(vior)g(preserving\ -.)37 1088 y fd(8.7)70 b(Mo)n(ving)24 b(Mem)n(b)r(ers)e(in)n(to)g(Aggregate\(s\ -\))37 1226 y fl(This)16 b(refactoring)f(adds)h(mem)o(b)q(ers)f(to)g(an)g(aggr\ -egate)f(class,)i(to)e(replace)j(mem)o(b)q(ers)e(in)h(one)g(of)f(its)g(comp)q -(o-)37 1283 y(nen)o(ts.)37 1423 y(The)h(argumen)o(ts)e(to)h(this)g(refactorin\ -g)g(are:)106 1563 y fj(\017)22 b fl(the)15 b(aggregate)f(class)i(\(C\))106 -1656 y fj(\017)22 b fl(the)15 b(comp)q(onen)o(t)h(mem)o(b)q(er)f(v)m(ariable) -i(\(V\))106 1749 y fj(\017)22 b fl(the)16 b(set)f(of)f(mem)o(b)q(er)i(v)m(ari\ -ables)g(in)h(comp)q(onen)o(tClass)e(\(V.t)o(yp)q(e\))f(b)q(eing)j(replaced)f -(in)h(the)e(aggregate)151 1805 y(class)h(\(setOfV)l(ars\))106 1898 y fj(\017) -22 b fl(the)f(set)g(of)g(mem)o(b)q(er)g(functions)h(in)g(comp)q(onen)o(tClass) -f(b)q(eing)i(replaced)f(in)g(the)f(aggregate)f(class)151 1955 y(\(setOfF)l -(uncs\))37 2095 y(After)15 b(c)o(hec)o(king)h(its)g(preconditions,)g(this)g -(refactoring:)93 2235 y(1.)22 b(for)11 b(eac)o(h)h(v)m(ariable)h(in)f(setOfV) -l(ars,)g(calls)h(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable) -g(to)e(add)g(an)h(equiv)m(alen)o(t)h(\(p)q(ossibly)151 2291 y(renamed\))i(v)m -(ariable)i(as)e(a)g(public)i(mem)o(b)q(er)e(of)g(comp)q(onen)o(tClass.)93 2384 -y(2.)22 b(for)e(eac)o(h)i(function)f(in)h(setOfF)l(uncs,)h(calls)f(create)s 14 -2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(function)g(to)f(add)g(the)g(signature)g -(of)151 2441 y(the)16 b(\(p)q(ossibly)i(renamed\))e(function)g(as)g(a)g(publi\ -c)i(mem)o(b)q(er)e(of)g(comp)q(onen)o(tClass.)23 b(Then,)16 b(for)f(eac)o(h) -151 2497 y(function)k(in)g(setOfMo)o(vingMem)o(b)q(ers,)g(calls)g(add)s 14 2 v -14 w(function)s 14 2 v 14 w(b)q(o)q(dy)g(to)f(add)g(the)h(function)g(b)q(o)q -(dy)g(of)151 2554 y(eac)o(h)e(function)h(b)q(eing)h(mo)o(v)o(ed.)25 b(Referen\ -ces)19 b(to)d(mem)o(b)q(ers)h(that)g(remain)g(in)h(comp)q(onen)o(tClass)g(are) -151 2610 y(pre\014xed)e(with)g(V.)952 2760 y(99)g eop bop 93 42 a fl(3.)22 b -(for)14 b(instances)h(of)f(C,)f(replaces)j(eac)o(h)e(reference)h fi(to)g fl -(a)f(mem)o(b)q(er)g(in)h(\(setOfV)l(ars)f fj([)h fl(setOfF)l(uncs\))f(with) -151 98 y(a)h(reference)h(to)e(its)i(replacing)g(mem)o(b)q(er)g(in)g(C.)93 192 -y(4.)22 b(for)15 b(eac)o(h)g(mem)o(b)q(er)g(of)g(\(setOfV)l(ars)g fj([)g fl -(setOfF)l(uncs\))h(that)e(is)i(no)o(w)f(unreferenced,)1576 175 y fs(7)1612 192 -y fl(calls)151 248 y(delete)s 14 2 v 15 w(mem)o(b)q(er)s 14 2 v 13 w(function\ -s)h(or)f(delete)s 14 2 v 14 w(unreferenced)s 14 2 v 15 w(v)m(ariable)i(to)d -(remo)o(v)o(e)h(it.)37 407 y fe(8.7.1)56 b(Preconditions)37 531 y fl(The)16 b -(preconditions)h(for)d(this)i(refactoring)f(are:)93 675 y(1.)22 b(quali\014es\ -AsComp)q(onen)o(tP\(V\))151 731 y(\(V)15 b(quali\014es)i(as)e(a)g(comp)q(onen) -o(t)g(mem)o(b)q(er)g(v)m(ariable)i(of)e(C.\))1181 714 y fs(8)93 825 y fl(2.) -22 b fj(8)16 b fl(F)e fj(2)i fl(setOfF)l(uncs,)226 881 y fj(8)g fl(referenced\ -Mem)o(b)q(er)g fj(2)f fl(\(v)m(ariablesReferencedBy\(F\))i fj([)301 938 y fl -(functionsCalledBy\(F\)\),)376 994 y(if)f(referencedMem)o(b)q(er)g fj(2)f fl -(mem)o(b)q(ersOf\(comp)q(onen)o(tClass\))h fj(^)451 1051 y fl(referencedMem)o -(b)q(er)g fj(62)g fl(\(setOfV)l(ars)e fj([)i fl(setOfF)l(uncs\),)526 1107 y -(referencedMem)o(b)q(er.accessCon)o(trolMo)q(de)g(=)f(public.)151 1164 y(\(if) -c(an)o(y)g(of)g(the)g(functions)h(b)q(eing)h(added)f(to)e(C)h(reference)h(mem) -o(b)q(ers)f(remaining)i(in)f(comp)q(onen)o(tClass,)151 1220 y(those)j(referen\ -ced)h(mem)o(b)q(ers)g(are)e(public\).)93 1314 y(3.)22 b(for)14 b(all)i(instan\ -ces)f(of)f(comp)q(onen)o(tClass)h(assigned)g(to)f(an)h(instance)g(of)g(C,)f -(all)h(references)h(to)e(\(setOf-)151 1370 y(V)l(ars)f fj([)h fl(setOfF)l(unc\ -s\))f(are)g(made)h(via)f(V.)g(Program)f(\015o)o(w)h(analysis)h(w)o(ould)g(b)q -(e)g(needed)h(to)d(determine)151 1427 y(this.)37 1586 y fe(8.7.2)56 b(Beha)n -(vior)18 b(Preserv)m(ation)37 1709 y fl(F)l(or)j(create)s 14 2 v 14 w(mem)o -(b)q(er)s 14 2 v 13 w(v)m(ariable)i(\(step)e(1\):)32 b(precondition)24 b(1)d -(\(the)g(new)h(v)m(ariable)h(do)q(esn't)e(collide)j(with)37 1766 y(another)17 -b(v)m(ariable)h(referenced)g(within)g(its)f(in)o(tended)h(scop)q(e\))f(is)g -(satis\014ed)g(b)q(ecause)h(it)f(is)g(giv)o(en)g(a)g(unique)37 1822 y(name)f -(in)g(cases)f(where)g(a)g(name)g(con\015ict)i(w)o(ould)e(o)q(ccur.)108 1916 y -(F)l(or)h(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(function)i(\(step)e -(2\):)23 b(preconditions)18 b(1)f(through)f(4)g(\(regarding)h(collisions)i -(with)37 1973 y(mem)o(b)q(ers)c(de\014ned)h(in)f(sup)q(erclasses)h(or)e(sub)q -(classes\))h(is)g(satis\014ed)h(b)q(ecause)f(it)g(is)g(giv)o(en)g(a)f(unique) -i(name)f(in)37 2029 y(cases)j(where)g(a)f(name)h(con\015ict)g(w)o(ould)h(o)q -(ccur;)f(precondition)i(5)d(is)h(trivially)h(satis\014ed)g(b)q(ecause)f(there) -g(is)37 2085 y(no)e(function)g(b)q(o)q(dy)l(.)108 2179 y(F)l(or)c(add)s 14 2 v -13 w(function)s 14 2 v 14 w(b)q(o)q(dy)h(\(step)f(2\):)18 b(precondition)c -(1)e(\(all)g(v)m(ariables)i(and)e(functions)h(referenced)g(in)g(the)37 2236 y -(function)j(b)q(o)q(dy)g(are)f(visible)i(from)d(the)h(sup)q(erclass\))h(is)g -(satis\014ed)f(b)o(y)g(precondition)i(2)d(of)h(this)g(refactoring;)37 2319 y -750 2 v 89 2346 a fu(7)107 2362 y fp(Instances)e(of)g(comp)q(onen)o(tClass)i -(migh)o(t)e(b)q(e)g(assigned)i(to)e(v)n(ariables)i(other)e(than)g(V.)f(The)h -(mem)o(b)q(ers)g(can)g(not)g(b)q(e)g(deleted)37 2408 y(unless)i(they)e(are)h -(not)f(referenced)g(for)g(all)h(instances)h(of)e(comp)q(onen)o(tClass.)89 2438 -y fu(8)107 2454 y fp(The)18 b(requiremen)o(t)h(here)g(is)g(that)f(the)g(ob)r -(ject)h(assigned)h(to)e(V)g(in)h(one)g(instance)g(of)f(C)g(is)h(not)f(aliased) -i(as)f(the)f(v)n(alue)37 2499 y(assigned)g(to)e(V)f(in)i(another)f(instance)i -(of)d(C.)g(This)h(condition)j(is)d(implied)i(if)e(V)f(quali\014es)k(as)c(a)h -(comp)q(onen)o(t)h(v)n(ariable.)27 b(F)m(or)37 2545 y(further)14 b(discussion\ -s,)h(see)e(section)i(8.8.)941 2760 y fl(100)g eop bop 37 42 a fl(precondition) -21 b(2)d(\(the)g(mem)o(b)q(er)h(function)g(is)h(not)e(called\))i(is)f(satis\ -\014ed)g(b)q(ecause)g(the)g(function)h(is)f(newly)37 98 y(added)d(to)f(the)g -(comp)q(onen)o(t)h(and)f(is)h(not)e(y)o(et)h(referenced.)108 192 y(The)h(k)o -(ey)g(step)f(in)i(the)f(refactoring)f(is)h(step)g(3,)f(where)h(references)g -(to)f(mem)o(b)q(ers)h(in)h(a)e(comp)q(onen)o(t)h(are)37 248 y(replaced)h(b)o -(y)f(references)h(to)e(mem)o(b)q(ers)h(in)g(the)g(aggregate)e(class.)22 b(The\ -re)16 b(are)f(sev)o(eral)h(things)h(that)e(migh)o(t)37 305 y(happ)q(en)i(that) -d(could)j(prev)o(en)o(t)e(this)g(from)g(b)q(eing)h(done)g(safely:)108 399 y -(Eac)o(h)e(new)f(mem)o(b)q(er)h(migh)o(t)g(not)f(b)q(e)h(visible)i(in)f(all)f -(places)h(where)f(the)f(old)i(mem)o(b)q(er)e(\(it)h(replaces\))g(w)o(as)37 455 -y(visible.)29 b(Ho)o(w)o(ev)o(er,)16 b(b)o(y)h(precondition)i(3)e(all)h(refer\ -ences)g(to)f(the)g(old)h(mem)o(b)q(ers)f(are)g(made)g(via)h(V,)f(whic)o(h)37 -512 y(implies)f(that)e(all)g(references)h(m)o(ust)e(either)i(b)q(e)f(from)f -(within)i(the)f(aggregate)e(ob)s(ject)i(or)f(via)h(the)g(aggregate)37 568 y -(ob)s(ject.)19 b(By)14 b(steps)g(one)g(and)h(t)o(w)o(o,)d(the)i(new)g(mem)o -(b)q(ers)g(are)g(public)i(mem)o(b)q(ers)e(of)g(the)g(aggregate)e(class)i(and) -37 625 y(hence)j(are)e(visible)i(in)f(all)g(places)g(where)g(the)f(old)h(mem) -o(b)q(ers)f(w)o(ere)g(referenced.)108 719 y(One)f(or)f(more)h(of)f(the)g(func\ -tions)i(b)q(eing)f(mo)o(v)o(ed)g(migh)o(t)f(mak)o(e)g(references)h(to)f(v)m -(ariables)i(and)f(functions)37 775 y(that)22 b(are)g(visible)i(from)e(the)g -(comp)q(onen)o(t)g(class)h(but)f(not)g(from)f(the)h(aggregate)f(class.)41 b -(Ho)o(w)o(ev)o(er,)23 b(b)o(y)37 831 y(precondition)17 b(2)e(suc)o(h)h(refere\ -nces)f(will)i(b)q(e)f(visible.)108 925 y(The)d(t)o(yp)q(e)g(of)f(the)h(new)g -(mem)o(b)q(er)g(migh)o(t)g(b)q(e)g(di\013eren)o(t)g(from)f(the)h(t)o(yp)q(e)g -(of)f(the)h(old)g(mem)o(b)q(er,)g(and)g(hence)37 982 y(not)j(supp)q(ort)g(the) -h(same)e(op)q(erations.)23 b(This)17 b(will)h(not)d(happ)q(en)i(\(b)o(y)f(con\ -struction\))g(since)i(in)e(steps)g(1)g(and)37 1038 y(2)f(the)h(new)f(mem)o -(b)q(ers)g(ha)o(v)o(e)g(the)g(same)g(t)o(yp)q(es)h(as)e(the)i(mem)o(b)q(ers)f -(they)g(are)g(replacing.)108 1132 y(If)h(t)o(w)o(o)e(di\013eren)o(t)h(aggrega\ -te)f(ob)s(jects)h(\(b)q(oth)g(of)g(class)h(C\))e(assigned)i(the)g(same)f(comp) -q(onen)o(t)g(ob)s(ject)g(to)37 1189 y(their)g(mem)o(b)q(er)e(v)m(ariable)i -(V,)e(then)h(with)g(this)g(refactoring)f(some)h(mem)o(b)q(ers)f(that)g(previo\ -usly)i(w)o(ere)e(shared)37 1245 y(b)q(et)o(w)o(een)h(the)f(t)o(w)o(o)f(aggreg\ -ate)f(ob)s(jects)i(w)o(ould)g(no)g(longer)h(b)q(e)f(shared.)20 b(Ho)o(w)o(ev) -o(er,)12 b(b)o(y)h(precondition)i(1)d(eac)o(h)37 1302 y(comp)q(onen)o(t)k(ob) -s(ject)e(is)i(exclusiv)o(e)h(to)e(one)g(aggregate)f(ob)s(ject,)g(so)h(this)g -(will)i(not)e(happ)q(en.)108 1396 y(A)o(t)f(this)h(p)q(oin)o(t,)g(it)f(has)h -(b)q(een)g(argued)f(that)g(v)m(ariables)i(and)f(functions)g(will)h(b)q(e)f -(visible)i(to)c(their)i(callers)37 1452 y(b)q(efore)20 b(and)f(after)f(the)h -(mo)o(v)o(e,)g(that)f(the)h(t)o(yp)q(es)g(of)f(mem)o(b)q(ers)i(will)g(b)q(e)g -(the)f(same,)g(and)g(that)f(there)h(is)h(a)37 1509 y(one-for-one)c(mapping)g -(of)e(the)i(old)f(mem)o(b)q(ers)h(to)e(the)i(new)f(mem)o(b)q(ers)g(that)g(are) -g(replacing)h(them.)108 1602 y(As)11 b(argued)g(in)h(section)f(8.5.3,)f(the)h -(program)f(traces)g(b)q(efore)i(and)f(after)f(the)h(refactoring)f(are)h(equiv) -m(alen)o(t.)37 1659 y(References)18 b fi(by)e fl(the)h(mem)o(b)q(ers)f(added) -h(to)f(the)g(aggregate,)f fi(to)h fl(mem)o(b)q(ers)h(of)f(comp)q(onen)o(tClas\ -s)g(not)g(b)q(eing)37 1715 y(mo)o(v)o(ed,)g(will)i(include)g(an)e(extra)f(lev) -o(el)j(of)d(indirection)j(\(ie)f(V\).)e(Con)o(v)o(ersely)l(,)h(references)h fi -(to)f fl(the)g(mem)o(b)q(ers)37 1772 y(added)g(to)e(the)h(aggregate)e(\(other) -h(than)g(those)h(made)f fi(by)h fl(the)g(mem)o(b)q(ers)f(b)q(eing)i(mo)o(v)o -(ed\))e(will)j(ha)o(v)o(e)d(a)g(lev)o(el)37 1828 y(of)f(indirection)j(remo)o -(v)o(ed.)j(These)14 b(replacing)g(references)g(will)h(b)q(e)f(equiv)m(alen)o -(t)h(to)e(the)h(replaced)g(references,)37 1885 y(and)20 b(other)f(steps)g(wil\ -l)i(b)q(e)f(the)f(same,)h(so)f(the)g(program)f(traces)h(are)g(equiv)m(alen)o -(t)i(b)q(efore)e(and)h(after)e(the)37 1941 y(refactoring.)108 2035 y(In)d(ste\ -p)g(4,)f(the)h(precondition)i(for)d(delete)s 14 2 v 14 w(mem)o(b)q(er)s 14 2 v -14 w(functions)h(and)g(delete)s 14 2 v 15 w(unreferenced)s 14 2 v 15 w(v)m -(ariable)h(is)37 2092 y(satis\014ed)e(b)q(ecause)f(these)g(refactorings)f(are) -g(only)h(applied)h(if)f(the)g(v)m(ariable)h(\(or)d(function\))i(is)g(unrefere\ -nced.)108 2186 y(Eac)o(h)h(of)g(the)h(steps)f(\(1-4\))g(of)g(this)h(refactori\ -ng)f(are)g(b)q(eha)o(vior)h(preserving,)g(therefore)f(the)h(refactoring)37 -2242 y(is)h(b)o(y)f(construction)h(b)q(eha)o(vior)g(preserving.)941 2760 y -(101)g eop bop 37 45 a fd(8.8)70 b(Discussion:)29 b(Comp)r(onen)n(ts)23 b(and) -h(Refactoring)e(\(Revisite)o(d\))37 184 y fl(The)c(refactorings)e(in)i(sectio\ -ns)g(8.5)e(through)h(8.7)f(ha)o(v)o(e)g(as)h(a)g(precondition)h(that)f(the)g -(mem)o(b)q(er)g(v)m(ariable)37 240 y(in)o(to)12 b(\(or)f(out)h(of)t(\))e(whic) -o(h)j(mem)o(b)q(ers)f(are)g(mo)o(v)o(ed)f(m)o(ust)g(b)q(e)i(an)f fi(exclusive) -g(c)n(omp)n(onent)p fl(,)f(as)h(de\014ned)h(in)g(section)37 297 y(8.2.)24 b -(As)17 b(noted)g(in)h(a)e(fo)q(otnote)g(for)g(eac)o(h)h(of)g(these)g(refactor\ -ings,)f(a)h(less)g(stringen)o(t)g(precondition)h(w)o(ould)37 353 y(b)q(e)j -(su\016cien)o(t:)29 b(that)19 b(the)h(instance)g(assigned)h(to)e(the)g(mem)o -(b)q(er)h(v)m(ariable)h(in)g(one)f(aggregate)e(ob)s(ject)h(b)q(e)37 410 y(dis\ -tinct)g(from)e(the)g(instance)i(assigned)f(to)f(the)g(same)g(mem)o(b)q(er)h -(v)m(ariable)h(of)e(another)g(aggregate)f(ob)s(ject)37 466 y(of)g(the)f(same) -h(t)o(yp)q(e.)21 b(This)16 b(condition)h(is)f(implied)i(if)e(the)f(mem)o(b)q -(er)h(v)m(ariable)h(is)f(an)f(exclusiv)o(e)j(comp)q(onen)o(t,)37 523 y(but)e -(is)g(nonetheless)g(a)f(less)h(stringen)o(t)f(precondition.)108 616 y(This)22 -b(raises)g(a)f(question:)33 b(is)22 b(the)f(precondition)i(regarding)e(exclus\ -iv)o(e)j(comp)q(onen)o(ts)d(p)q(erhaps)h(to)q(o)37 673 y(restrictiv)o(e)16 b -(for)f(refactorings)f(in)o(v)o(olving)j(aggregates)c(and)j(comp)q(onen)o(ts?) -108 767 y(Not)10 b(in)h(general.)19 b(More)10 b(p)q(o)o(w)o(erful)g(refactori\ -ngs)g(could)i(b)q(e)f(written)f(in)o(v)o(olving)i(aggregates)d(and)h(comp)q -(o-)37 823 y(nen)o(ts)15 b(w)o(ould)f(require)h(other)e(conditions)j(implied) -g(b)o(y)e(exclusiv)o(e)i(comp)q(onen)o(ts.)j(Here)c(are)e(t)o(w)o(o)g(example\ -s:)93 955 y(1.)22 b(F)l(or)14 b(cases)g(where)g(an)h(aggregate)d(ob)s(ject)i -(con)o(tained)h(sev)o(eral)f(comp)q(onen)o(ts)g(that)g(w)o(ere)g(instances)h -(of)151 1011 y(the)h(same)f(comp)q(onen)o(t)h(class,)g(a)g(refactoring)f(coul\ -d)i(b)q(e)f(de\014ned)h(that)e(replaced)i(sev)o(eral)f(mem)o(b)q(ers)151 1068 -y(in)g(the)f(aggregate)f(class)i(with)f(a)g(single)i(mem)o(b)q(er)e(added)h -(to)e(the)i(comp)q(onen)o(t)f(class.)151 1143 y(F)l(or)21 b(example,)i(supp)q -(ose)g(the)e ff(Automobile)f fl(class)i(con)o(tains)f(the)h(comp)q(onen)o(t)f -(mem)o(b)q(er)h(v)m(ariables)151 1199 y fi(leftF)m(r)n(ontTir)n(e)p fl(,)15 b -fi(rightF)m(r)n(ontTir)n(e)p fl(,)g fi(leftR)n(e)n(arTir)n(e)h fl(and)h fi -(rightR)n(e)n(arTir)n(e)p fl(,)g(all)h(of)e(whic)o(h)i(w)o(ere)f(assigned)151 -1256 y(instances)k(of)g(the)f ff(Tire)g fl(class.)37 b(The)20 b ff(Automobile) -f fl(class)i(also)g(con)o(tains)f(four)g(mem)o(b)q(er)h(v)m(ariables)151 1312 -y(that)c(record,)i(resp)q(ectiv)o(ely)l(,)h(the)e(w)o(arran)o(t)o(y)e(expirat\ -ion)i(for)g(eac)o(h)g(of)f(the)h(tires.)29 b(The)18 b(refactoring)151 1369 y -(w)o(ould)g(add)g(a)f(single)i(mem)o(b)q(er)f(v)m(ariable)h fi(warr)n(antyExp\ -ir)n(ation)f fl(to)f(the)h ff(Tire)f fl(class,)h(replacing)h(the)151 1425 y -(four)13 b(mem)o(b)q(er)h(v)m(ariables)h(in)f(the)f ff(Automobile)f fl(class) -i(that)e(record)i(tire)f(w)o(arran)o(t)o(y)f(expirations.)20 b(This)151 1481 y -(requires,)13 b(ho)o(w)o(ev)o(er,)e(not)g(only)h(that)f(the)g(instance)h(assi\ -gned)g(to)f(eac)o(h)h(comp)q(onen)o(t)f(mem)o(b)q(er)h(v)m(ariable)151 1538 y -(\(sa)o(y)l(,)g fi(leftF)m(r)n(ontTir)n(e)p fl(\))d(in)k(one)f(car)g(b)q(e)g -(distinct)i(from)d(instance)i(assigned)f(to)g(the)g(same)g(mem)o(b)q(er)g(v)m -(ari-)151 1594 y(able)k(\()p fi(leftF)m(r)n(ontTir)n(e)p fl(\))d(in)j(another) -f(car,)g(but)g(also)h(that)e(it)i(b)q(e)g(distinct)h(from)e(the)g(ob)s(jects) -g(assigned)151 1651 y(to)g(other)g(comp)q(onen)o(t)g(mem)o(b)q(er)g(v)m(ariab\ -les)i(represen)o(ting)f(tires.)93 1745 y(2.)22 b(In)c(cases)f(where)g(instanc\ -es)h(of)f(the)g(same)g(class)g(are)g(comp)q(onen)o(ts)g(of)g(sev)o(eral)g(di\ -\013eren)o(t)g(classes,)h(a)151 1801 y(refactoring)g(could)i(b)q(e)f(de\014ne\ -d)h(that)d(mo)o(v)o(es)h(a)g(v)m(ariable)i(out)e(of)g(the)h(comp)q(onen)o(t)f -(class)h(in)o(to)f(the)151 1858 y(class)e(of)e(eac)o(h)i(of)f(its)g(aggregate) -f(classes.)151 1933 y(F)l(or)k(example,)j(while)f(the)f ff(Automobile)e fl -(class)i(ma)o(y)f(hold)i(an)e(instance)i(of)f(the)f ff(Engine)i fl(class)f -(as)g(a)151 1989 y(comp)q(onen)o(t,)k(the)f ff(T)l(ruck)g fl(class)f(ma)o(y)g -(also)h(hold)g(another)f(instance)h(of)f(the)h ff(Engine)g fl(class)g(as)f -(its)151 2046 y(comp)q(onen)o(t.)h(Mo)o(ving)15 b fi(milesPerGal)r(lon)f fl -(out)i(of)f(the)h ff(Engine)g fl(class)g(means)g(adding)h(it)f(to)f(b)q(oth)g -(the)151 2102 y ff(Automobile)e fl(and)j ff(T)l(ruck)g fl(classes.)151 2177 y -(F)l(or)d(this)i(refactoring)e(to)g(b)q(e)h(b)q(eha)o(vior)h(preserving,)f -(eac)o(h)g(instance)h(of)e(the)h(comp)q(onen)o(t)g(class)g(m)o(ust)151 2234 y -(b)q(e)i(assigned)g(to)e(a)h(distinct)i(aggregate)c(ob)s(ject.)20 b(This)15 b -(is)h(implied)i(if)d(the)h(comp)q(onen)o(t)f(is)h(exclusiv)o(e.)108 2365 y -(In)j(summary)l(,)e(the)h(precondition)i(regarding)e(exclusiv)o(e)i(comp)q -(onen)o(ts,)e(while)h(more)f(stringen)o(t)g(than)37 2421 y(is)e(necessary)g -(for)f(the)h(refactorings)e(in)j(sections)f(8.5)e(through)h(8.7,)g(is)h(nonet\ -heless)g(useful)h(for)e(these)g(and)37 2478 y(other)c(more)g(p)q(o)o(w)o(erfu\ -l)h(refactorings)f(that)g(could)h(b)q(e)g(dev)o(elop)q(ed)h(regarding)e(aggre\ -gates)f(and)i(comp)q(onen)o(ts.)941 2760 y(102)g eop bop 37 42 a fd(8.9)70 b -(Con)n(v)n(erting)31 b(an)h(Asso)r(ciation,)g(Mo)r(deled)f(Using)g(Inheritanc\ -e,)194 116 y(in)n(to)22 b(an)i(Aggregation)37 257 y fe(8.9.1)56 b(Motiv)m(ati\ -on)37 380 y fl(Consider)14 b(the)f(inheritance)h(hierarc)o(h)o(y)f(sho)o(wn)g -(in)g(Figure)g(8.1.)18 b(The)13 b(class)h ff(GraphicalObject)h fl(de\014ned)f -(func-)37 437 y(tions)i(for)e(displa)o(ying)j(itself)f(and)g(determining)g -(whether)f(a)g(particular)h(p)q(oin)o(t)g(\(lo)q(cation\))f(w)o(as)f(inside)j -(the)37 493 y(ob)s(ject.)30 b(Sev)o(eral)20 b(sub)q(classes)g(w)o(ere)e(de\ -\014ned,)j(the)e(most)f(recen)o(t)g(b)q(eing)i ff(ArchitecturalObject)q fl -(.)33 b ff(Architec-)37 550 y(turalObject)17 b fl(needed)e(the)f(functions)h -(pro)o(vided)g(b)o(y)f ff(GraphicalObject)i fl(and)e(w)o(as)g(initially)j(mad\ -e)d(a)f(sub)q(class)37 606 y(of)i(it.)306 656 y - 21115945 7959593 11577589 43810652 32693534 51770245 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Courier-Bold -%%Pages: 1 -%%BoundingBox: 176 666 497 787 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 1 -6 ] concat -%I -158 461 158 461 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 312.217 980.952 ] concat -%I -[ -(GraphicalObject:) -( displaySelf\(\);) -( containsPointP\(...\);) -( *) -( *) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 312.217 980.952 ] concat -%I -[ -(GraphicalObject:) -( displaySelf\(\);) -( containsPointP\(...\);) -( *) -( *) -() -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 18.4337 2.1687 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 203.024 855.494 ] concat -%I -[ -(Circle) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 292.265 855.819 ] concat -%I -[ -(Square) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 385.843 857.229 ] concat -%I -[ -(Text) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 468.578 856.47 ] concat -%I -[ -(ArchitecturalObject) -() -] Text -End - -End %I eop - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 1.08434 306.867 ] concat -%I -293 563 221 514 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 1.08434 306.867 ] concat -%I -327 563 307 516 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 1.08434 306.867 ] concat -%I -361 563 385 518 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 1.08434 306.867 ] concat -%I -394 563 496 515 Line -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 444 1288 a fh(Figure)i(8.1)p fl(:)j(Class)15 b ff(GraphicalObj\ -ect)j fl(and)d(its)g(Sub)q(classes)108 1403 y(The)23 b(designer)g(then)g(real\ -ized)h(that)e(an)g ff(ArchitecturalObject)k fl(ma)o(y)21 b(c)o(hange)i(its)f -(shap)q(e,)j(based)e(on)37 1459 y(p)q(ersp)q(ectiv)o(e)12 b(or)e(a)g(new)h -(arc)o(hitectural)g(insigh)o(t.)19 b(An)10 b ff(ArchitecturalObject)k fl(repr\ -esen)o(ts)c(b)q(oth)h(an)f(abstraction)37 1516 y(and)16 b(its)f(implemen)o -(tation;)h(its)g(shap)q(e)g(is)f(b)q(etter)g(represen)o(ted)h(as)f(a)g(comp)q -(onen)o(t.)108 1610 y(Th)o(us,)g(a)g(more)f(desirable)j(represen)o(tation)e -(w)o(ould)h(b)q(e)g(as)f(sho)o(wn)g(in)h(Figure)f(8.2.)237 1669 y - 23286743 8025375 8880537 43942215 32167280 51967590 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Courier-Bold -%%Pages: 1 -%%BoundingBox: 135 668 489 790 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 1 -6 ] concat -%I -158 461 158 461 Line -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 40.1205 2.16864 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 388.121 982.036 ] concat -%I -[ -(GraphicalObject:) -( displaySelf\(\);) -( containsPointP\(...\);) -( *) -( *) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 359.169 857.663 ] concat -%I -[ -(Circle) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 448.41 857.988 ] concat -%I -[ -(Square) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 541.988 859.398 ] concat -%I -[ -(Text) -() -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 138.795 306.867 ] concat -%I -273 564 221 514 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 138.795 306.867 ] concat -%I -307 565 307 516 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 138.795 306.867 ] concat -%I -339 565 385 518 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-courier-bold-r-*-120-* -/Courier-Bold 12 SetF -%I t -[ 1 0 0 1 130.807 982.795 ] concat -%I -[ -(ArchitecturalObject) -( GraphicalObject* shape;) -( *) -( *) -() -] Text -End - -End %I eop - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 265 2305 a fh(Figure)i(8.2)p fl(:)j ff(GraphicalObject)e fl -(and)d ff(ArchitecturalObject)p fl(,)j(After)d(Refactoring)108 2411 y(This)h -(is)f(an)g(example)h(of)f(the)g(refactoring)g(de\014ned)h(in)g(this)f(section\ -.)21 b(Other)15 b(examples)h(are)f(describ)q(ed)37 2468 y(in)i(sections)e(3.4) -f(and)i(9.2.)941 2760 y(103)g eop bop 37 42 a fe(8.9.2)56 b(Argumen)n(ts)18 b -(&)g(Op)r(erations)37 165 y fl(This)j(refactoring)e(con)o(v)o(erts)g(an)g(ass\ -o)q(ciation,)i(mo)q(deled)g(as)f(a)f(sub)q(class/sup)q(erclass)i(relationship\ -,)h(in)o(to)37 221 y(an)e(aggregation.)33 b(All)21 b(b)q(eha)o(vior)f(inherit\ -ed)i(b)o(y)e(the)f(sub)q(class/clien)o(t)j(from)d(its)h(sup)q(erclass)h(b)q -(efore)f(the)37 278 y(refactoring)15 b(will)i(b)q(e)f(delegated)g(to)f(a)f -(new)i(comp)q(onen)o(t,)f(whic)o(h)h(is)g(an)f(instance)h(of)f(the)g(old)h -(sup)q(erclass.)108 372 y(After)10 b(this)g(refactoring,)h(the)f(mo)o(v)o(e)s -14 2 v 13 w(class)g(refactoring)g(could)h(b)q(e)g(applied)h(to)d(mo)o(v)o(e)h -(the)g(sub)q(class/clien)o(t.)37 515 y(The)16 b(argumen)o(ts)e(to)h(this)g -(refactoring)g(are:)106 659 y fj(\017)22 b fl(the)15 b(sup)q(erclass)i(\(Sup) -q(er\))106 753 y fj(\017)22 b fl(the)15 b(sub)q(class/clien)o(t)j(\(Clien)o -(t\))108 897 y(In)f(the)f(descriptions)h(b)q(elo)o(w:)22 b(the)16 b(set)g(of) -f(v)m(ariables)i(inherited)h(b)o(y)e(sub)q(class/clien)o(t)i(is)f(referred)f -(to)f(as)37 953 y fi(setOfV)m(ars)p fl(;)f(the)h(set)g(of)g(functions)h(inher\ -ited)h(b)o(y)e(sub)q(class/clien)o(t)i(is)f(referred)f(to)g(as)g fi(setOfF)m -(uncs)p fl(.)37 1097 y(After)g(c)o(hec)o(king)h(its)g(precondition,)g(this)g -(refactoring:)93 1241 y(1.)22 b(generates)15 b(a)g(unique)i(name)e(for)f(the) -i(new)f(comp)q(onen)o(t)g(v)m(ariable,)i(and)e(calls)h(the)g(refactoring)151 -1297 y(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable)g(to)f(add) -g(the)h(comp)q(onen)o(t)f(v)m(ariable)i(to)d(sub)q(class)s 14 2 v 15 w(clien) -o(t)93 1391 y(2.)22 b(calls)h(the)f(refactoring)g(de\014ned)h(in)g(section)g -(8.3)e(to)g(qualify)j(the)e(newly)h(created)f(v)m(ariable)h(as)f(a)151 1448 y -(comp)q(onen)o(t)93 1541 y(3.)g(calls)h(the)e(abstract)s 14 2 v 13 w(access)s -14 2 v 13 w(to)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(v)m(ariable)i(refacto\ -ring)e(for)g(all)h(v)m(ar)g fj(2)f fl(setOfV)l(ars)h(whic)o(h)151 1598 y(ha)o -(v)o(e)15 b(not)g(already)g(b)q(een)i(abstracted.)93 1692 y(4.)22 b(for)e(eac) -o(h)g(inherited)i(mem)o(b)q(er)e(function)h(\(ie)f(setOfF)l(uncs)h fj([)f fl -(the)h(functions)f(added)h(in)g(the)f(prior)151 1748 y(step\),)15 b(calls)h -(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(function)g(to)e(cop)o(y)h -(it)h(in)o(to)f(the)g(sub)q(class)93 1842 y(5.)22 b fj(8)16 b fl(v)m(ar)g fj -(2)h fl(setOfV)l(ars,)e(replace)i(in)g(v)m(ar's)e(accessing)i(and)f(up)q(dati\ -ng)h(functions)g(\(in)g(sub)q(class/clien)o(t\))151 1898 y(the)12 b(curren)o -(t)h(function)g(b)q(o)q(dy)g(\(a)e(reference)i(or)f(assignmen)o(t)g(to)f(v)m -(ar\))h(with)h(a)f(call)h(to)f(the)g(corresp)q(ond-)151 1955 y(ing)k(function) -g(in)g(the)f(new)h(comp)q(onen)o(t.)93 2049 y(6.)22 b(for)15 b(eac)o(h)g(rema\ -ining)h(function)g(copied)h(in)o(to)e(sub)q(class/clien)o(t)i(in)f(step)f(4,) -g(calls)h(the)f(refactoring)151 2105 y(replace)s 14 2 v 15 w(statemen)o(t)s 14 -2 v 12 w(list)s 14 2 v 14 w(with)s 14 2 v 14 w(function)s 14 2 v 14 w(call)h -(to)f(replace)h(the)g(curren)o(t)f(function)h(b)q(o)q(dy)g(with)f(a)g(call) -151 2162 y(to)g(the)g(corresp)q(onding)h(mem)o(b)q(er)g(function)g(of)e(the)i -(new)f(comp)q(onen)o(t.)37 2321 y fe(8.9.3)56 b(Preconditions)37 2444 y fl -(Precondition:)941 2760 y(104)g eop bop 93 42 a fl(1.)22 b fj(8)16 b fl(F)e fj -(2)i fl(setOfF)l(uncs,)226 98 y fj(8)g fl(refdItem)f fj(2)g fl(\(v)m(ariables\ -ReferencedBy)k(\(F\))14 b fj([)301 154 y fl(functionsCalledBy\(F\)\),)376 211 -y(refdItem)i fj(62)f fl(\(Clien)o(t.lo)q(callyDe\014nedMem)o(b)q(erF)l(unc)q -(tions)j fj([)451 267 y fl(Clien)o(t.lo)q(callyDe\014nedMem)o(b)q(e)q(rV)l -(ariable)q(s\).)151 324 y(\(there)k(are)g(no)f(references)i(among)e(the)h(mem) -o(b)q(ers)h(inherited)g(b)o(y)f(sub)q(class)s 14 2 v 15 w(clien)o(t)h(to)e -(mem)o(b)q(ers)151 380 y(lo)q(cally)c(de\014ned)g(in)f(sub)q(class)s 14 2 v 14 -w(clien)o(t.\))93 474 y(2.)22 b fj(8)16 b fl(F)e fj(2)i fl(setOfF)l(uncs,)226 -531 y fj(8)g fl(refdItem)f fj(2)g fl(\(v)m(ariablesReferencedBy)k(F\),)301 587 -y(Clien)o(t)d fj(\032)g fl(scop)q(eOf\(refdItem\).)151 643 y(\(all)c(v)m(aria\ -bles)h(referenced)f(b)o(y)f fi(setOfF)m(uncs)f fl(are)h(visible)i(to)e(sub)q -(class/clien)o(t)j(\(ie)d(their)h(access)g(con)o(trol)151 700 y(mo)q(de)k(is) -f(not)g(priv)m(ate\).\))93 794 y(3.)22 b fj(8)16 b fl(F)e fj(2)i fl(setOfF)l -(uncs,)226 850 y(F.accessCon)o(trolMo)q(de)e(=)i(public.)151 907 y(\(all)g -(functions)g(in)g(setOfF)l(uncs)g(are)f(public\).)37 1028 y fe(8.9.4)56 b(Beh\ -a)n(vior)18 b(Preserv)m(ation)37 1114 y fl(F)l(or)j(create)s 14 2 v 14 w(mem) -o(b)q(er)s 14 2 v 13 w(v)m(ariable)i(\(step)e(1\):)32 b(precondition)24 b(1)d -(\(the)g(new)h(v)m(ariable)h(do)q(esn't)e(collide)j(with)37 1171 y(another)18 -b(v)m(ariable)g(referenced)h(within)f(its)g(in)o(tended)h(scop)q(e\))f(is)f -(satis\014ed)h(b)q(ecause)h(the)e(new)h(v)m(ariable)h(is)37 1227 y(giv)o(en)d -(a)f(unique)i(name.)108 1283 y(F)l(or)j(the)h(refactoring)g(de\014ned)h(in)g -(section)f(8.3)f(\(step)h(2\):)30 b(the)21 b(precondition)i(is)e(satis\014ed) -g(b)q(ecause)37 1340 y(the)f(v)m(ariable)g(quali\014es)h(as)e(a)g(comp)q(onen) -o(t.)32 b(The)19 b(v)m(alue)i(\(ob)s(ject\))d(is)h(statically)h(assigned)g -(to)f(it,)h(and)f(is)37 1396 y(unreferenced)e(elsewhere.)108 1453 y(F)l(or)j -(abstract)s 14 2 v 13 w(access)s 14 2 v 13 w(to)s 14 2 v 13 w(mem)o(b)q(er)s -14 2 v 14 w(v)m(ariable)i(\(step)e(3\):)31 b(precondition)22 b(1)f(is)g(satis\ -\014ed)g(b)q(ecause)h(this)37 1509 y(refactoring)15 b(is)h(only)g(applied)h -(on)e(v)m(ariables)h(that)f(ha)o(v)o(e)g(not)g(already)g(b)q(een)h(abstracted\ -.)108 1566 y(F)l(or)e(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 14 w(functio\ -n)h(\(step)g(4\):)k(precondition)d(1)e(is)h(satis\014ed)g(b)q(ecause)h(the)f -(lo)q(cally)h(de\014ned)37 1622 y(function)h(is)f(redundan)o(t;)f(preconditio\ -ns)i(2-4)e(\(regarding)g(equiv)m(alen)o(t)i(signatures)f(and)f(function)h(b)q -(o)q(dies\))37 1679 y(are)23 b(satis\014ed)g(b)q(ecause)h(the)e(sup)q(erclass) -i(function)g(is)f(b)q(eing)h(copied)g(in)o(to)e(the)h(class;)k(precondition)d -(5)37 1735 y(\(regarding)15 b(references)h(in)g(the)g(function)g(b)q(o)q(dy\)) -f(is)h(satis\014ed)g(b)q(ecause)g(the)f(function)h(references:)106 1829 y fj -(\017)22 b fl(v)m(ariables)d(whose)d(scop)q(e)i(includes)h(b)q(oth)f(the)f -(sup)q(erclass)h(and)f(sub)q(class/clien)o(t)i(\(b)o(y)e(precondition)151 1885 -y(t)o(w)o(o)d(of)h(this)g(refactoring\))106 1979 y fj(\017)22 b fl(functions) -c(whic)o(h)g(are)f(either)h(inherited)g(b)o(y)l(,)g(or)e(are)h(iden)o(tically) -j(de\014ned)e(in,)g(the)f(sub)q(class/clien)o(t)151 2036 y(\(b)q(ecause)f(the) -f(new)h(function)g(is)f(iden)o(tical)j(to)c(the)h(previously)i(inherited)g -(function)f(it)f(replaces\))108 2129 y(F)l(or)d(step)h(5:)19 b(for)12 b(all)i -(v)m(ars)e(in)i(setOfV)l(ars,)f(the)g(only)g(references)h(to)e(the)h(v)m(aria\ -bles)h(are)f(b)o(y)g(the)g(accessing)37 2186 y(and)18 b(up)q(dating)g(functio\ -ns.)28 b(Changing)17 b(the)h(function)g(b)q(o)q(dies)h(to)e(b)q(e)h(calls)g -(to)f(the)g(corresp)q(onding)i(func-)37 2242 y(tion)f(in)f(the)g(comp)q(onen) -o(t)g(consisten)o(tly)h(replaces)g(all)f(refs)g(to)f(v)m(ars)h(in)h(setOfV)l -(ars)e(with)h(with)h(refs)e(to)g(the)37 2299 y(corresp)q(onding)h(v)m(ariable\ -s)g(in)g(the)f(comp)q(onen)o(t.)22 b(By)16 b(construction,)g(the)g(t)o(yp)q -(e)g(of)f(eac)o(h)h(v)m(ar)g(in)h(setOfV)l(ars)37 2355 y(is)g(the)g(same)f -(as)g(the)h(t)o(yp)q(e)f(of)g(the)h(v)m(ar)f(that)g(replaces)i(it.)24 b(Th)o -(us,)16 b(as)g(for)g(similar)i(refactorings)e(describ)q(ed)37 2412 y(earlier) -h(in)f(this)f(c)o(hapter,)g(this)h(step)f(is)g(b)q(eha)o(vior)h(preserving.) -108 2468 y(F)l(or)d(replace)s 14 2 v 15 w(statemen)o(t)s 14 2 v 12 w(list)s 14 -2 v 14 w(with)s 14 2 v 14 w(function)s 14 2 v 14 w(call)i(\(step)f(6\):)19 b -(precondition)c(1)f(\(the)g(called)h(function)g(is)37 2525 y(visible)j(from)c -(the)h(calling)h(function\))g(is)f(satis\014ed)g(b)o(y)g(precondition)h(3)f -(of)f(this)i(refactoring;)e(precondition)37 2581 y(2)f(\(seman)o(tic)g(equiv) -m(alence\))i(is)f(satis\014ed)g(b)q(ecause)g(it)f(replaces)h(the)f(b)q(o)q -(dy)h(of)e(the)h(function)h(with)g(a)e(call)i(to)f(a)941 2760 y(105)g eop bop -37 42 a fl(function)14 b(\(in)f(the)f(comp)q(onen)o(t\))g(that)g(has)g(a)g -(seman)o(tically)i(equiv)m(alen)o(t)g(function)f(b)q(o)q(dy)l(.)20 b(By)13 b -(construction,)37 98 y(the)i(t)o(w)o(o)f(functions)i(p)q(erform)e(the)h(same) -g(op)q(erations)g(and,)f(from)g(the)h(prior)g(step,)g(all)h(v)m(ariable)g(ref\ -erences)37 154 y(are)f(seman)o(tically)i(equiv)m(alen)o(t.)108 211 y(Th)o(us,) -e(eac)o(h)g(step)g(is)h(b)q(eha)o(vior)g(preserving)g(and,)f(hence,)h(the)f -(refactoring)g(is)g(b)q(eha)o(vior)h(preserving.)37 354 y fd(8.10)70 b(Discus\ -sion)37 457 y fe(8.10.1)56 b(Related)17 b(W)-5 b(ork)18 b(in)h(OODB)g(Sc)n -(hema)e(Ev)n(olution)37 543 y fl(Kim)j([66)o(])f(describ)q(es)i(comp)q(osite) -e(ob)s(jects)f(in)i(the)f(ORION)i(ob)s(ject-orien)o(ted)e(database)f(system,) -i(whic)o(h)37 599 y(are)f(similar)g(to)f(aggregate)f(ob)s(jects.)29 b(Orion) -20 b(supp)q(orted)f fi(c)n(omp)n(osite)g(r)n(efer)n(enc)n(es,)e fl(whic)o(h)i -(are)f(similar)i(to)37 656 y(comp)q(onen)o(ts.)26 b(ORION)19 b(supp)q(orted)e -(sev)o(eral)g(t)o(yp)q(es)g(of)g(comp)q(osite)g(references,)h(one)f(imp)q(ort\ -an)o(t)g(distinc-)37 712 y(tion)i(b)q(eing)g fi(shar)n(e)n(d)f fl(and)g fi -(exclusive)g fl(references.)29 b(An)18 b(ob)s(ject)g(could)h(ha)o(v)o(e)f(at) -f(most)h(one)g(exclusiv)o(e)i(\(and)37 769 y(no)g(shared\))f(references,)i -(or)d(an)o(y)h(n)o(um)o(b)q(er)h(of)f(shared)g(references.)33 b(In)20 b(refac\ -toring,)g(in)g(order)f(to)g(a)o(v)o(oid)37 825 y(information)c(loss)g(the)f -(k)o(ey)h(qualit)o(y)g(of)f(a)g(comp)q(onen)o(t)h(is)g(that)e(it)i(b)q(e)g fi -(exclusive)f fl(to)g(one)g(aggregate)f(ob)s(ject.)37 882 y(Th)o(us,)i(all)h -(comp)q(onen)o(ts)g(in)o(v)o(olv)o(ed)g(in)g(these)f(refactorings)g(are)g(exc\ -lusiv)o(e.)37 1003 y fe(8.10.2)56 b(User)18 b(In)n(terface)37 1089 y fl(Secti\ -on)g(6.2)d(describ)q(es)j(a)f(m)o(ulti-windo)o(w)g(displa)o(y)h(to)e(assist)g -(in)h(de\014ning)h(the)f(proto)q(col)f(for)g(an)h(abstract)37 1146 y(sup)q -(erclass.)28 b(A)18 b(similar)h(in)o(terface)e(\(see)h(Figure)g(8.3\))e(could) -i(b)q(e)h(used)f(in)g(migrating)g(mem)o(b)q(ers)f(b)q(et)o(w)o(een)37 1202 y -(aggregate)j(and)h(comp)q(onen)o(t)g(classes.)76 b(The)21 b(top)g(windo)o(w)g -(displa)o(ys)h(the)f(mem)o(b)q(er)g(v)m(ariables)i(of)d(the)37 1259 y(aggrega\ -te)15 b(class)h ff(Automobile)p fl(.)k(The)c(middle)i(t)o(w)o(o)c(windo)o(ws) -i(displa)o(y)h(the)f(mem)o(b)q(ers)g(for)g(t)o(w)o(o)e(of)h(its)i(com-)37 1315 -y(p)q(onen)o(t)c(classes,)g ff(Engine)g fl(and)f ff(Tire)p fl(.)18 b(In)13 b -(this)f(example,)i(the)e(user)g(requests)g(to)f(mo)o(v)o(e)h(the)g(mem)o(b)q -(er)g(v)m(ariable)37 1372 y fi(warr)n(antyExpir)n(ation)k fl(from)f(the)h(com\ -p)q(onen)o(t)g ff(Tire)f fl(class)h(to)f(its)g(aggregate)f(class)i ff(Automob\ -ile)p fl(.)j(The)d(user)37 1428 y(en)o(ters)h(the)h(request)f(b)o(y)l(,)g(for) -g(example,)h(clic)o(king)h(on)e(the)h(mem)o(b)q(er)f(to)g(b)q(e)h(mo)o(v)o -(ed,)e(and)i(either)g(dragging)37 1484 y(it)f(from)e(the)h(comp)q(onen)o(t)h -(windo)o(w)f(to)g(the)g(aggregate)e(windo)o(w,)j(or)e(b)o(y)h(selecting)i(the) -e(op)q(eration)g(from)g(a)37 1541 y(p)q(op-up)h(displa)o(y)l(.)108 1597 y(The) -f(to)q(ol)f(recognizes)i(that)e(class)h ff(Automobile)d fl(has)j(four)f ff -(Tire)g fl(comp)q(onen)o(ts,)g(so)h(four)f(v)m(ariables)i(need)37 1654 y(to)e -(b)q(e)i(added)f(to)f(the)g(aggregate)f(class.)22 b(In)16 b(the)g(lo)o(w)o -(er)f(windo)o(w,)g(it)h(prompts)f(for)g(the)h(names)f(of)g(the)h(four)37 1710 -y(new)f(v)m(ariables.)22 b(F)l(urthermore,)13 b(since)j(there)f(is)g(already) -h(a)e(v)m(ariable)i(de\014ned)g(in)g(class)f ff(Automobile)e fl(called)37 1767 -y fi(warr)n(antyExpir)n(ation)p fl(,)j(the)f(to)q(ol)g(w)o(arns)g(that)f(the) -h(new)h(v)m(ariables)g(m)o(ust)f(b)q(e)h(named)f(di\013eren)o(tly)h(from)f -(it.)108 1823 y(Suc)o(h)j(an)f(in)o(terface)g(could)h(b)q(e)g(extended)g(to)e -(pro)o(vide)h(displa)o(y)i(en)o(tire)e(aggregation)f(hierarc)o(hies)i(\(ag-) -37 1880 y(gregate)13 b(ob)s(jects,)g(their)h(comp)q(onen)o(ts)g(and)f(sub-com\ -p)q(onen)o(ts\),)h(graphs)f(of)h(inheritance)h(and)f(aggregation)37 1936 y -(hierarc)o(hies,)i(and)f(in)h(in)o(v)o(erted)f(hierarc)o(h)o(y)g(where)g(a)f -(comp)q(onen)o(t)h(class)g(could)h(b)q(e)g(displa)o(y)o(ed,)f(follo)o(w)o(ed) -h(b)o(y)37 1993 y(all)g(aggregate)d(classes)h(con)o(taining)h(an)g(instance)g -(of)f(the)g(comp)q(onen)o(t)h(class.)20 b(Precondition)15 b(c)o(hec)o(king)g -(\(eg:)37 2049 y(to)g(a)o(v)o(oid)g(name)g(con\015icts\))h(could)g(b)q(e)g -(built)h(in)o(to)e(the)g(in)o(terface,)g(as)g(sho)o(wn)g(in)h(Figure)f(8.3.) -108 2105 y(Recall)j(that)d(in)i(c)o(hapter)f(six)h(heuristics)g(could)h(b)q -(e)e(applied)i(to)e(suggest)f(what)h(mem)o(b)q(ers)g(that)f(could)37 2162 y -(b)q(e)g(migrated)f(to)g(an)g(abstract)f(sup)q(erclass.)20 b(Similarly)l(,)c -(heuristics)g(migh)o(t)e(b)q(e)h(applied)h(here)e(to)f(determine)37 2218 y -(whic)o(h)i(mem)o(b)q(ers)e(should)i(b)q(e)f(mo)o(v)o(ed)f(and)g(when)h(an)f -(asso)q(ciation)h(mo)q(deled)h(using)f(inheritance)h(should)g(b)q(e)37 2275 y -(con)o(v)o(erted)f(to)g(an)g(aggregation.)k(Ho)o(w)o(ev)o(er,)13 b(just)h(as) -f(in)i(c)o(hapter)f(six,)g(it)h(is)f(unlik)o(ely)i(that)e(these)g(heuristics) -37 2331 y(will)23 b(b)q(e)f(error-pro)q(of,)g(and)f(\(as)g(describ)q(ed)i(ab) -q(o)o(v)o(e\))d(a)h(sophisticated)h(user)g(in)o(terface)f(can)h(mak)o(e)e(the\ -se)37 2388 y(refactorings)15 b(prett)o(y)g(easy)l(,)g(so)f(heuristics)j(are)e -(not)g(the)g(fo)q(cus)g(of)g(this)h(c)o(hapter.)941 2760 y(106)g eop bop 158 0 -a 25786450 22234234 5065195 27957248 30851645 50191482 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Times-Roman Helvetica -%%Pages: 1 -%%BoundingBox: 77 425 469 763 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.86747 0 0 0.86747 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -89 626 90 626 Rect -End - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -2.5 329 ] concat -%I -136 163 542 550 Rect -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -45 233 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 210 639 ] concat -%I -[ -(PROTOCOL FOR AGGREGATE CLASS: AUTOMOBILE) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -27 189 ] concat -%I -239 435 590 435 Line -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 257 846 ] concat -%I -[ -(Engine autoEngine;) -(Date warrantyExpiration;) -(Tire leftFrontTire;) -(Tire rightFrontTire;) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 58 205 ] concat - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 176.5 327 ] concat -%I -162 522 7 5 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 177 313.5 ] concat -%I -162 522 7 5 Elli -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 147 752 ] concat -%I -[ -(COMPONENT CLASS: ) -( ENGINE) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -91 287 ] concat -%I -239 435 380 435 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 164 708 ] concat -%I -[ -(int milesPerGallon;) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 -46 101 ] concat - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 176.5 327 ] concat -%I -162 522 7 5 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 177 313.5 ] concat -%I -162 522 7 5 Elli -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 370.5 710 ] concat -%I -[ -(Date warrantyExpiration;) -] Text -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 11 238 ] concat - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 339.5 191 ] concat -%I -162 522 7 5 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 0.5 0 0 0.5 340 177.5 ] concat -%I -162 522 7 5 Elli -End - -End %I eop - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 152 615 ] concat -%I -[ -(OPERATION:) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -85 165 ] concat -%I -239 435 323 435 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 153 586 ] concat -%I -[ -() -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -10 394.5 ] concat -%I -144 369 547 369 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -4 398.5 ] concat -%I -342 363 342 229 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -6.99998 256.5 ] concat -%I -144 369 547 369 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 367 751 ] concat -%I -[ -(COMPONENT CLASS: ) -( TIRE) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 130 287 ] concat -%I -239 435 380 435 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 246 612 ] concat -%I -[ -(move warrantyExpiration from Tire to Automobile) -() -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-helvetica-medium-r-*-120-* -/Helvetica 12 SetF -%I t -[ 1 0 0 1 152 591 ] concat -%I -[ -(new variable names:) -( \(warrantyExpiration of leftFrontTire\): _____________________) -( \(warrantyExpiration of rightFrontTire\):_____________________) -( \(warrantyExpiration of leftRearTire\): ______________________) -( \(warrantyExpiration of rightRearTire\): _____________________) -() -(Note: new variable names must differ from warrantyExpiration) -( already defined in class Automobile.) -] Text -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 203 1536 a fh(Figure)17 b(8.3)p fl(:)j(Migrating)15 b(Mem)o -(b)q(ers)g(Bet)o(w)o(een)g(Aggregate)f(and)h(Comp)q(onen)o(t)g(Classes)37 1670 -y fe(8.10.3)56 b(Summary)37 1830 y fl(T)l(o)15 b(summarize,)h(this)f(c)o(hapt\ -er)g(de\014nes)i(sev)o(eral)e(refactorings)g(regarding)g(aggregations:)106 -1924 y fj(\017)22 b fl(qualifying)17 b(a)e(mem)o(b)q(er)g(v)m(ariable)i(as)e -(a)g(comp)q(onen)o(t)106 2018 y fj(\017)22 b fl(mo)o(ving)15 b(mem)o(b)q(ers) -h(from)e(an)h(aggregate)f(class)h(to)g(the)g(class)h(of)f(one)g(of)g(its)g -(comp)q(onen)o(ts)106 2112 y fj(\017)22 b fl(mo)o(ving)12 b(mem)o(b)q(ers)h -(from)f(a)g(comp)q(onen)o(t)g(class)h(to)f(the)g(aggregate)f(classes)i(that)f -(con)o(tain)g(comp)q(onen)o(t)151 2168 y(mem)o(b)q(ers)j(whic)o(h)h(are)f(ins\ -tances)h(of)f(the)g(comp)q(onen)o(t)h(class)106 2262 y fj(\017)22 b fl(con)o -(v)o(erting)15 b(a)g(relationship,)i(mo)q(deled)f(using)g(inheritance,)h(in)o -(to)e(an)g(aggregation.)108 2356 y(This)g(c)o(hapter)f(de\014nes)i(ho)o(w)d -(to)h(c)o(hec)o(k)h(if)g(a)f(mem)o(b)q(er)g(v)m(ariable)i(quali\014es)g(as)e -(an)g(exclusiv)o(e)i(comp)q(onen)o(t)37 2412 y(for)f(its)g(class,)h(whic)o -(h)g(is)f(a)g(precondition)i(used)f(in)g(these)f(refactorings.)941 2760 y(107) -g eop bop 37 353 a fc(Chapter)35 b(9)37 560 y fb(Examples)37 783 y fl(This)13 -b(c)o(hapter)e(describ)q(es)i(t)o(w)o(o)d(examples)i(of)f(ho)o(w)g(refactorin\ -gs)g(can)h(b)q(e)g(in)o(tegrated)f(to)g(impro)o(v)o(e)g(the)h(design)37 839 y -(of)j(a)g(program.)k(The)c(purp)q(ose)h(of)f(these)g(examples)h(is)g(to)f(cle\ -arly)h(demonstrate)e(ho)o(w)h(refactorings)g(w)o(ork,)37 896 y(and)e(to)f(sho) -o(w)g(that)g(refactorings)g(are)g(not)h(used)g(in)g(isolation,)h(but)e(rather) -g(that)g fi(se)n(quenc)n(es)f fl(of)h(refactorings)37 952 y(are)j(often)g(nee\ -ded.)108 1009 y(Chapter)j(three)g(describ)q(ed)i(sev)o(eral)e fi(r)n(e)n(al)g -fl(examples)g(of)g(refactorings)g(man)o(ually)g(applied)i(to)e(ob)s(ject-)37 -1065 y(orien)o(ted)d(application)h(framew)o(orks)c(as)i(they)g(ev)o(olv)o(ed.) -20 b(Those)14 b(examples)h(motiv)m(ated)f(the)g(imp)q(ortance)h(of)37 1122 y -(refactoring)e(in)h(actual)f(design)h(tasks,)e(but)h(at)f(the)i(exp)q(ense)g -(of)e(some)h(extraneous)g(detail)h(and)f(complexit)o(y)l(.)37 1178 y(By)j(con) -o(trast,)d(the)j(examples)g(presen)o(ted)f(here)h(are)f(simpler)h(and)g(clear\ -er)f(\(alb)q(eit)i(less)e(practical\).)108 1235 y(The)j fi(Menu)h(Planning)d -fl(example)j(demonstrates)e(the)h(use)h(of)e(refactorings)h(de\014ned)h(in)g -(c)o(hapters)f(six)37 1291 y(and)c(sev)o(en)f(for)g(sp)q(ecializin)q(g)i(a)e -(class)h(and)f(then)h(migrating)f(common)g(co)q(de)h(to)f(a)f(sup)q(erclass.) -21 b(The)13 b fi(Matrix)37 1347 y fl(example)h(demonstrates)e(the)g(use)h(of) -f(refactorings)g(de\014ned)i(in)f(c)o(hapters)g(six)g(and)f(eigh)o(t)h(for)f -(c)o(hanging)h(ho)o(w)37 1404 y(an)18 b(in)o(terclass)h(relationship)g(is)f -(mo)q(deled)h(\(from)e(inheritance)j(to)d(an)h(aggregation\);)f(that)g(exampl\ -e)h(also)37 1460 y(includes)g(refactorings)d(for)f(creating)i(an)f(abstract)f -(sup)q(erclass)i(of)f(related)h(comp)q(onen)o(t)f(classes.)37 1604 y fd(9.1) -70 b(Generalizing)20 b(&)k(Sp)r(ecializ)o(i)o(ng:)29 b(Men)n(u)23 b(Planning) -f(Example)37 1705 y fl(This)14 b(example)g(demonstrates)f(the)g(use)h(of)f -(refactorings)g(de\014ned)h(in)g(c)o(hapters)f(six)h(and)g(sev)o(en.)19 b(Thi\ -s)14 b(meal)37 1761 y(planning)20 b(program)d(assumes)h(v)o(ery)g(predictable) -i(eating)e(habits.)29 b(The)18 b(user)g(sp)q(eci\014es)i(the)e(da)o(ys)g(of)f -(the)37 1818 y(w)o(eek)i(that)f(they)h(will)h(b)q(e)f(in)g(to)o(wn,)g(and)f -(the)h(program)f(prin)o(ts)g(out)h(the)f(dinner)i(men)o(u)f(for)f(that)g(w)o -(eek.)37 1874 y(The)e(implemen)o(tation)g(b)q(efore)g(refactoring)f(\(written) -g(in)h(C++\))f(is:)157 1981 y fg(enum)23 b(DaysInTheWeek)f({)i(Monday,)f(Tues\ -day,)g(Wednesday,)f(Thursday,)658 2037 y(Friday,)h(Saturday,)f(Sunday};)157 -2150 y(class)h(Date)228 2206 y({)228 2263 y(protected:)300 2319 y(DaysInTheWe\ -ek)f(dayOfWeek;)300 2376 y(int)h(dayOfMonth;)228 2432 y(public:)300 2489 y -(Date)g(\(DaysInTheWeek)f(theDayOfWeek,)g(int)i(theDayOfMonth\))372 2545 y -({dayOfWeek)e(=)i(theDayOfWeek;)395 2602 y(dayOfMonth)f(=)h(theDayOfMonth;) -941 2760 y fl(108)g eop bop 419 42 a fg(};)300 98 y(void)23 b(printDinnerMenu) -f(\(\))372 154 y({if)h(\(dayOfWeek)g(==)g(Monday\))443 211 y(cout)g(<<)h("Chi\ -cken)f(Kiev";)395 267 y(else)h(if)f(\(dayOfWeek)g(==)g(Friday\))443 324 y(cou\ -t)g(<<)h("Baked)f(Flounder";)395 380 y(else)443 437 y(cout)g(<<)h("Stir)f(Fri\ -ed)g(Vegetables";)372 493 y(})228 550 y(};)157 606 y(main\(\))205 663 y({)205 -719 y(Date)g(firstDayInTown\(Monday,1\),)324 775 y(secondDayInTown\(Thursday,) -o(4\),)324 832 y(thirdDayInTown\(Friday,5\);)205 888 y(firstDayInTown.printDi\ -n)o(nerMenu)o(\(\);)205 945 y(secondDayInTown.printDi)o(nnerMen)o(u\(\);)205 -1001 y(thirdDayInTown.printDin)o(nerMenu)o(\(\);)205 1058 y(})37 1164 y fl -(In)15 b(class)f ff(Date)p fl(,)g(the)g(mem)o(b)q(er)g(v)m(ariable)i fi(dayOf\ -We)n(ek)e fl(is)g(assigned)h(an)f(argumen)o(t)f(of)g(the)h(constructor,)f(and) -37 1220 y(is)h(tested)e(in)i(a)e(conditional)i(statemen)o(t)e(of)g(the)h(mem) -o(b)q(er)g(function)g fi(printDinnerMenu)p fl(.)19 b(This)13 b(conditional)37 -1277 y(test)19 b(suggests)g(that)f(the)h(design)h(of)f(the)g(program)f(migh)o -(t)h(b)q(e)h(re\014ned)g(b)o(y)f(sp)q(ecializin)q(g)i(the)f ff(Date)f fl(clas\ -s)37 1333 y(based)d(on)f(the)g(en)o(umerated)h(v)m(alues)g(of)f(the)g(v)m(ari\ -able)i fi(dayOfWe)n(ek)p fl(.)108 1390 y(The)c(example)g(b)q(elo)o(w)g(descri\ -b)q(es)h(a)e(sp)q(ecial)j(purp)q(ose,)e(ultra-high)h(lev)o(el)f(refactoring)g -(\(ala)f(macro\))f(that)37 1446 y(p)q(erforms)i(its)f(sp)q(ecialized)k(task) -11 b(b)o(y)i(com)o(bining)g(the)g(refactorings)f(de\014ned)i(in)f(prior)g(c)o -(hapters.)18 b(When)13 b(this)37 1503 y(ultra-high)18 b(lev)o(el)g(refactorin\ -g)f(is)g(in)o(v)o(ok)o(ed,)g(the)g(refactoring)f(to)q(ol)h(\(hereafter)f(refe\ -rred)h(to)f(as)h(`the)f(to)q(ol'\))37 1559 y(sp)q(ecializes)d(the)e(class)f ff -(Date)h fl(based)f(on)g(the)g(range)g(of)g(v)m(alues)h(\(an)f(en)o(umerated)g -(t)o(yp)q(e\))g(of)g(a)g(mem)o(b)q(er)g(v)m(ariable)37 1616 y(referenced)j -(b)o(y)e(a)g(conditional)i(in)f(the)f(function)h fi(printDinnerMenu)p fl(.)17 -b(The)12 b(refactoring)f(is)g(st)o(ylized,)i(in)f(that)37 1672 y(it)i(uses)f -(the)g(v)m(alues)h(of)e(the)h(en)o(umerated)g(t)o(yp)q(e)g(to)f(automatically) -h(determine)h(and)f(name)g(the)g(sub)q(classes.)1892 1656 y fs(1)37 1729 y fl -(It)j(pro)q(ceeds)g(as)f(follo)o(ws:)108 1785 y(Since)25 b(the)f(conditional) -h(tests)e(the)g(v)m(alue)i(of)e(a)g(v)m(ariable)i(whose)f(t)o(yp)q(e)f(is)h -(the)g(en)o(umerated)f(t)o(yp)q(e)37 1841 y fi(DaysInTheWe)n(ek)p fl(,)13 b -(the)i(to)q(ol)f(creates)h(a)f(sub)q(class)h(for)f(eac)o(h)h(v)m(alue)g(in)h -(that)d(en)o(umerated)i(t)o(yp)q(e.)20 b(F)l(ollo)o(wing)37 1898 y(the)14 b -(steps)g(describ)q(ed)i(in)e(section)h(7.5,)d(the)i(to)q(ol)g(creates)g(sev)o -(en)g(sub)q(classes)h(of)e ff(Date)h fl(with)g(the)g(refactoring)37 1954 y fi -(cr)n(e)n(ate)s 14 2 v 14 w(empty)s 14 2 v 14 w(class)p fl(,)j(one)g(for)g -(eac)o(h)h(da)o(y)f(of)g(the)h(w)o(eek.)27 b(The)17 b(names)h(of)f(the)g(sub) -q(classes)i(corresp)q(ond)f(to)37 2011 y(the)d(set)f(of)f(v)m(alues)i(of)f -(the)g(en)o(umerated)g(t)o(yp)q(e.)842 1994 y fs(2)882 2011 y fl(The)g(to)q -(ol)g(assigns)g(an)g(in)o(v)m(arian)o(t)h(to)e(eac)o(h)i(sub)q(class)g(of)e -(the)37 2067 y(form:)157 2161 y fg(dayOfWeek=<day)22 b(of)h(the)h(week)f(repr\ -esented)f(by)i(the)g(subclass>.)37 2255 y fl(The)c(to)q(ol)f(de\014nes)h(a)e -(constructor)g(in)i(eac)o(h)f(sub)q(class)h(with)g(the)f fi(cr)n(e)n(ate)s 14 -2 v 13 w(memb)n(er)s 14 2 v 14 w(function)f fl(refactoring.)37 2311 y(The)11 b -(constructor)e(consists)i(of)f(an)g(assignmen)o(t)g(that)g(sets)g(the)g(v)m -(alue)h(of)f(the)h(mem)o(b)q(er)f(v)m(ariable)i fi(dayOfWe)n(ek)p fl(.)37 2392 -y 750 2 v 89 2419 a fu(1)107 2435 y fp(Other)h(suc)o(h)g(high-lev)o(el)j(refa\ -ctorings)e(could)h(b)q(e)e(de\014ned,)h(with)g(minor)g(v)n(ariations.)89 2465 -y fu(2)107 2481 y fp(If)e(the)i(user)f(w)o(an)o(ted)h(di\013eren)o(t)h(names) -f(for)f(the)g(classes,)h(they)g(could)h(b)q(e)e(c)o(hanged)i(later)f(using)h -(the)e fm(change)r 12 2 v 10 w(class)r 12 2 v 10 w(name)37 2526 y fp(refactor\ -ing.)941 2760 y fl(109)g eop bop 108 42 a fl(The)13 b(to)q(ol)g(then)g(migrat\ -es)g(the)g(function)g fi(printDinnerMenu)f fl(do)o(wn)h(to)f(the)h(sub)q(clas\ -ses)h(and)f(simpli\014es)37 98 y(it,)22 b(as)d(describ)q(ed)k(in)d(section)h -(7.7.)34 b(F)l(or)19 b(example,)j(the)e(refactoring)g(rede\014nes)h(the)f fi -(printDinnerMenu)37 154 y fl(function)d(in)f(the)f(sub)q(class)h ff(Monda)o -(y)f fl(as:)157 305 y fg(void)23 b(printDinnerMenu)f(\(\))252 361 y({cout)h -(<<)h("Chicken)f(Kiev";)252 418 y(})108 568 y fl(The)15 b(to)q(ol)f(then)h -(sp)q(ecializes)j(the)c(instances)i(of)e(the)h(sup)q(erclass)g ff(Date)p fl -(,)g(using)g(the)g(refactoring)f(de\014ned)37 624 y(in)j(section)e(7.9.)108 -681 y(F)l(urther)e(re\014nemen)o(ts)g(are)g(p)q(ossible.)21 b(Since)14 b(the) -f(class)h ff(Date)f fl(is)g(truly)h(abstract)e(\(it)h(has)f(no)h(instances\),) -37 737 y(and)i(since)h(the)e(function)h fi(printDinnerMenu)f fl(is)h(unrefere\ -nced)h(elsewhere)f(in)g(the)g(class)g(and)f(is)h(rede\014ned)37 794 y(in)f -(all)g(of)f(the)g(sub)q(classes,)h(the)f(to)q(ol)g(can)g(delete)h(the)f(funct\ -ion)h(from)e(the)h(sup)q(erclass)h(with)g(the)f(refactoring)37 850 y fi(delet\ -e)s 14 2 v 14 w(memb)n(er)s 14 2 v 14 w(functions)p fl(.)108 907 y(Sev)o(eral) -22 b(further)f(refactorings)g(can)h(remo)o(v)o(e)f(unnecessary)h(assignmen)o -(ts,)g(an)g(argumen)o(t)e(v)m(ariable,)37 963 y(mem)o(b)q(er)15 b(v)m(ariable) -g(and)g(an)f(en)o(umerated)g(t)o(yp)q(e.)19 b(These)c(refactorings)e(could)j -(b)q(e)e(in)o(v)o(ok)o(ed)h(individually)j(b)o(y)37 1020 y(the)e(user)f(or,)f -(as)h(is)h(assumed)f(here,)h(in)o(v)o(ok)o(ed)f(automatically)l(.)108 1076 y -(First,)f(the)h(to)q(ol)g(migrates)f(to)g(the)h(sub)q(classes)h(the)f(b)q(o)q -(dy)g(of)g(the)g(constructor)f(de\014ned)i(in)f(class)h ff(Date)p fl(.)37 1132 -y(Constructors)k(in)h fi(C++)e fl(are)i(di\013eren)o(t)f(from)g(other)g(funct\ -ions,)i(in)f(that)f(a)g(sup)q(erclass)h(constructor)f(is)37 1189 y(not)15 b -(o)o(v)o(erridden)h(b)o(y)f(a)g(sub)q(class)h(constructor;)e(rather,)g(when)h -(an)g(instance)h(of)f(a)g(sub)q(class)h(is)f(created)g(the)37 1245 y(sup)q -(erclass)20 b(constructor)e(is)g(\014rst)g(called)i(follo)o(w)o(ed)f(b)o(y)f -(a)h(call)g(to)f(the)g(sub)q(class)i(constructor.)28 b(One)19 b(w)o(a)o(y)37 -1302 y(to)d(think)g(of)f(this)h(is)g(that)f(eac)o(h)h(sub)q(class)h(construct\ -or)e(b)q(egins)i(with)f(implicit)i(calls)f(to)e(the)g(constructors)37 1358 y -(de\014ned)j(in)f(its)f(sup)q(erclasses.)23 b(Beha)o(vior)17 b(can)f(b)q(e)g -(preserv)o(ed)h(b)o(y)f(adding)g(the)g(co)q(de)h(from)e(the)h(sup)q(erclass) -37 1415 y(constructor)e(to)f(the)h(fron)o(t)f(of)g(the)h(constructor)f(in)i -(eac)o(h)f(direct)g(sub)q(class,)h(while)g(deleting)h(the)e(co)q(de)g(from)37 -1471 y(the)i(sup)q(erclass)g(constructor.)569 1455 y fs(3)108 1528 y fl(F)l -(or)f(example,)g(the)h(constructor)e(in)i(the)f(class)h ff(Monda)o(y)f fl(w)o -(ould)h(no)o(w)e(b)q(e:)157 1690 y fg(Monday)23 b(\(DaysInTheWeek)f(theDayOfW\ -eek,)g(int)h(theDayOfMonth\):)205 1747 y(Date\(theDayOfWeek,)e(theDayOfMonth\ -\))300 1803 y({dayOfWeek)h(=)i(theDayOfWeek;)324 1860 y(dayOfMonth)e(=)i(theD\ -ayOfMonth;)324 1916 y(dayOfWeek)e(=)i(Monday;)300 1973 y(};)108 2135 y fl(The) -e(\014rst)f(statemen)o(t)f(is)i(a)f(dead)g(assignmen)o(t,)i(and)e(the)h(to)q -(ol)f(remo)o(v)o(es)f(it.)39 b(The)21 b(argumen)o(t)g fi(the-)37 2192 y(DayOf\ -We)n(ek)g fl(is)f(no)o(w)g(unreferenced,)i(and)e(the)g(to)q(ol)g(remo)o(v)o -(es)f(it)h(with)h(the)f fi(delete)s 14 2 v 13 w(function)s 14 2 v 13 w(ar)n -(gument)37 2248 y fl(refactoring.)f(The)14 b(mem)o(b)q(er)f(v)m(ariable)h fi -(dayOfWe)n(ek)f fl(is)h(no)f(longer)g(referenced)h(in)g fi(printDinnerMenu)e -fl(since)37 2305 y(the)h(conditional)h(test)f(has)f(b)q(een)i(remo)o(v)o(ed;) -e(the)h(\014nal)g(assignmen)o(t)g(statemen)o(t)f(in)h(the)g(constructor)f(is) -h(th)o(us)37 2361 y(a)j(dead)h(assignmen)o(t)e(and)i(the)f(to)q(ol)g(remo)o -(v)o(es)f(it.)22 b(Since)c fi(dayOfWe)n(ek)e fl(is)g(unreferenced,)h(the)f -(to)q(ol)g(deletes)37 2418 y(it)e(with)f(the)g(refactoring)g fi(delete)s 14 2 -v 13 w(unr)n(efer)n(enc)n(e)n(d)s 14 2 v 12 w(variable)p fl(.)19 b(Then,)13 b -(the)g(to)q(ol)g(deletes)h(the)f(en)o(umerated)g(t)o(yp)q(e)37 2474 y fi(Days\ -InTheWe)n(ek)h fl(whic)o(h)i(is)g(no)f(longer)h(referenced.)21 b(The)15 b(res\ -ulting)h(co)q(de)g(is)g(no)o(w:)37 2555 y 750 2 v 89 2582 a fu(3)107 2598 y fp -(Suc)o(h)d(a)g(refactoring)i(w)o(ould)f(b)q(e)f(a)g(sligh)o(t)i(v)n(ariation) -g(on)e(the)g fm(inline)r 12 2 v 10 w(function)r 12 2 v 10 w(c)n(al)r(l)e fp -(refactoring.)941 2760 y fl(110)g eop bop 157 42 a fg(class)23 b(Date)228 98 y -({)228 154 y(protected:)300 211 y(int)g(dayOfMonth;)228 267 y(public:)300 324 -y(Date)g(\(int)h(theDayOfMonth\))e({)h(};)228 380 y(};)157 493 y(class)g(Mond\ -ay)g(:)h(public)f(Date)228 550 y({)228 606 y(public:)300 663 y(Monday)g(\(int) -g(theDayOfMonth\))f(:)i(Date)f(\(theDayOfMonth\))372 719 y({dayOfMonth)f(=)i -(theDayOfMonth;)419 775 y(};)300 832 y(void)f(printDinnerMenu)f(\(\))372 888 y -({cout)h(<<)g("Chicken)g(Kiev";)372 945 y(})228 1001 y(};)157 1114 y(\(the)g -(remaining)g(subclasses)f(are)i(similarly)e(defined\))157 1227 y(main\(\))205 -1284 y({Monday)g(firstDayInTown\(1\);)228 1340 y(Thursday)h(secondDayInTown\(\ -4\);)228 1396 y(Friday)g(thirdDayInTown\(5\);)228 1453 y(firstDayInTown.print\ -DinnerMen)o(u\(\);)228 1509 y(secondDayInTown.printDinnerMe)o(nu\(\);)228 1566 -y(thirdDayInTown.printDinnerMen)o(u\(\);)228 1622 y(})37 1715 y fl(A)o(t)13 b -(this)g(p)q(oin)o(t,)g(the)f ff(Date)h fl(class)g(has)g(b)q(een)g(sp)q(eciali\ -zed)j(and)d(the)f(conditional)j(test)d(remo)o(v)o(ed.)18 b(Refactoring)37 1771 -y(could)f(stop)d(at)h(this)h(p)q(oin)o(t.)108 1827 y(Ho)o(w)o(ev)o(er,)e(b)o -(y)g(in)o(v)o(oking)i(t)o(w)o(o)d(additional)k(refactorings)d(\(describ)q(ed) -i(in)g(c)o(hapter)f(six\),)g(the)f(implemen-)37 1884 y(tation)h(could)h(b)q -(e)f(further)f(optimized)i(b)o(y)f(migrating)g(common)f(co)q(de)h(in)h fi(pri\ -ntDinnerMenu)d fl(function)j(up)37 1940 y(to)f(the)g(sup)q(erclass:)93 2033 y -(1.)22 b(the)e(function)h(signature)f(of)g(the)g fi(printDinnerMenu)f fl(func\ -tion)i(could)g(b)q(e)g(added)f(bac)o(k)g(in)o(to)g(the)151 2089 y(sup)q(ercla\ -ss)c ff(Date)g fl(with)f(the)h(refactoring)e fi(add)s 14 2 v 15 w(function)s -14 2 v 13 w(signatur)n(e)93 2179 y fl(2.)22 b(common)e(co)q(de)h(in)g(the)f -(sub)q(class)h(implemen)o(tations)h(of)d fi(printDinnerMenu)h fl(could)h(b)q -(e)g(migrated)151 2235 y(up)f(to)g(the)g(sup)q(erclass,)h(using)g(the)f(refac\ -toring)f(describ)q(ed)j(in)f(section)f(6.4.2.)33 b(As)19 b(part)h(of)f(that) -151 2292 y(refactoring;)14 b(the)g(segmen)o(ts)f(of)h(di\013ering)h(co)q(de)g -(w)o(ould)f(b)q(e)h(placed)g(in)o(to)f(a)g(newly)h(de\014ned)g(function,)151 -2348 y(here)h(called)h fi(mainCourse)p fl(.)108 2441 y(The)11 b fi(printDinne\ -rMenu)f fl(function)i(is)g(small,)g(and)f(automatically)g(splitting)i(up)e -(suc)o(h)g(a)g(small)h(function)37 2497 y(in)g(this)g(w)o(a)o(y)d(w)o(ould)j -(not)e(impro)o(v)o(e)h(the)g(design)h(in)g(all)f(cases.)19 b(Th)o(us,)11 b -(these)g(latter)g(t)o(w)o(o)e(optimizations)j(w)o(ould)37 2554 y(probably)k -(b)q(e)g(man)o(ually)g(c)o(hosen,)f(although)h(the)f(to)q(ol)g(could)h(sugges\ -t)f(these)g(c)o(hanges)g(to)g(the)g(user.)108 2610 y(The)h(refactored)e(co)q -(de)i(is)g(no)o(w:)941 2760 y(111)g eop bop 157 98 a fg(class)23 b(Date)228 -154 y({)228 211 y(protected:)300 267 y(int)g(dayOfMonth;)228 324 y(public:) -300 380 y(Date)g(\(int)h(theDayOfMonth\))e({)h(};)300 437 y(virtual)g(char)g -(*)h(mainCourse\(\))e(=)i(0;)300 493 y(void)f(printDinnerMenu)f(\(\))372 550 y -({cout)h(<<)g(mainCourse\(\);)372 606 y(})228 663 y(};)157 775 y(class)g(Mond\ -ay)g(:)h(public)f(Date)228 832 y({)228 888 y(public:)300 945 y(Monday)g(\(int) -g(theDayOfMonth\))f(:)i(Date\(theDayOfMonth\))372 1001 y({dayOfMonth)e(=)i -(theDayOfMonth;)419 1058 y(};)300 1114 y(char)f(*)h(mainCourse)f(\(\))372 1171 -y({return)f("Chicken)h(Kiev";)372 1227 y(})228 1284 y(};)157 1396 y(...)37 -1553 y fl(As)16 b(a)f(result)g(of)g(these)g(refactorings:)106 1642 y fj(\017) -22 b fl(the)16 b(design)h(is)f(clearer.)22 b(The)16 b(distinctions)h(b)q(et)o -(w)o(een)f(da)o(ys)g(of)f(the)h(w)o(eek)f(are)h(made)f(more)h(explicit.)151 -1698 y(Existing)g(instances)g(ha)o(v)o(e)e(b)q(een)i(sp)q(ecialized)q(.)22 b -(In)16 b(subsequen)o(t)g(uses)f(of)g(the)g(to)q(ol,)f(instances)i(w)o(ould) -151 1755 y(b)q(e)g(sp)q(eci\014ed)h(according)f(to)f(the)g(da)o(y)g(of)f(the) -i(w)o(eek)f(they)g(represen)o(t.)106 1846 y fj(\017)22 b fl(a)17 b(conditiona\ -l)h(test,)e(sev)o(eral)h(assignmen)o(ts,)g(v)m(ariables)h(and)f(an)f(en)o(ume\ -rated)h(t)o(yp)q(e)g(ha)o(v)o(e)f(b)q(een)i(re-)151 1903 y(mo)o(v)o(ed.)106 -1995 y fj(\017)k fl(the)17 b(co)q(de)g(for)f(prin)o(ting)i(the)e(men)o(u)h -(has)g(b)q(een)g(encapsulated)h(in)g(one)f(place,)g(a)o(w)o(a)o(y)e(from)h -(the)h(co)q(de)151 2051 y(that)d(determines)h(the)g(men)o(u.)k(T)l(o)14 b(sub\ -sequen)o(tly)i(alter)e(the)h(means)f(of)g(displa)o(ying)i(the)e(men)o(u,)h -(only)151 2108 y(the)g fi(printDinnerMenu)g fl(de\014ned)h(in)g(class)g ff -(Date)f fl(needs)h(to)f(b)q(e)h(c)o(hanged.)108 2197 y(In)e(summary)l(,)e(the) -i(result)f(of)g(these)g(refactorings)g(is)g(a)g(cleaner)h(design,)g(less)g -(co)q(de)f(and)h(p)q(ossibly)g(faster)37 2253 y(execution.)37 2396 y fd(9.2) -70 b(Con)n(v)n(erting)23 b(to)g(an)g(Aggregation:)32 b(Matrix)23 b(Example)37 -2497 y fl(This)18 b(example)g(demonstrates)e(the)h(use)h(of)e(refactorings)h -(de\014ned)h(in)g(c)o(hapters)f(six)g(and)g(eigh)o(t,)h(fo)q(cusing)37 2554 y -(mostly)12 b(on)h(comp)q(onen)o(t)f(related)g(refactorings.)19 b(Sometimes)12 -b(the)g(relationship)i(b)q(et)o(w)o(een)f(t)o(w)o(o)d(classes)j(do)q(es)37 -2610 y(not)19 b(b)q(ecome)g(clear)g(un)o(til)h(after)e(implemen)o(tation)i -(is)f(underw)o(a)o(y)l(.)31 b(Consider)19 b(the)g(case)f(where)h(the)g(class) -941 2760 y(112)g eop bop 37 42 a ff(Tw)o(oDimensionalArra)o(y)9 b fl(is)14 b -(de\014ned,)g(then)f(the)g ff(Matrix)f fl(class)h(is)g(de\014ned)i(as)d(a)g -(sub)q(class)i(of)f(it.[46)o(])f(A)h(matrix)37 98 y(is)j(a)f(sp)q(ecial)i(use) -e(of)g(a)g(t)o(w)o(o)f(dimensional)j(arra)o(y)l(,)d(and)h(can)g(b)q(e)h(thoug\ -h)o(t)e(of)h(as)g(a)g(sp)q(ecialization)i(of)e(it.)20 b(F)l(or)37 154 y(this) -c(example,)g(matrices)f(ha)o(v)o(e)g(a)g(maxim)o(um)g(of)g(400)f(cells)j(eac) -o(h)e(storing)g(in)o(teger)g(v)m(alues.)735 209 y - 7564902 3683779 15524495 25589104 23089397 29272883 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Times-Bold -%%Pages: 1 -%%BoundingBox: 236 389 351 445 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -21.687 42.2891 ] concat -%I -472 439 472 439 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 296.59 554.012 ] concat -%I -[ -(TwoDimensionalArray) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 195.614 -65.0724 ] concat -%I -155 626 155 626 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 343.614 500.928 ] concat -%I -[ -(Matrix) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 194.614 -73.0724 ] concat -%I -167 613 167 575 Line -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 91 571 a fh(Figure)j(9.1)p fl(:)i(Inheritance)c(Relationship)i -(Bet)o(w)o(een)d(Classes)g ff(Tw)o(oDimensionalArra)n(y)e fl(and)i ff(Matrix) -37 673 y fl(The)h(classes)g(are)f(de\014ned)h(as)f(follo)o(ws:)157 767 y fg -(class)23 b(TwoDimensionalArray)228 823 y({)228 879 y(protected:)300 936 y -(int)g(elements[400];)300 992 y(int)g(columns,)g(rows;)228 1049 y(public:)300 -1105 y(TwoDimensionalArray)e(\(int)j(numberOfRows,)e(int)h(numberOfColumns\)) -372 1162 y({)g(...)h(};)300 1218 y(virtual)f(int)g(get\(int)g(rowNumber,)g -(int)g(columnNumber\))f({)i(...)f(};)300 1275 y(virtual)g(void)g(put)h(\(int) -f(newValue,)g(int)g(rowNumber,)730 1331 y(int)g(columnNumber\))372 1388 y({)g -(...)h(};)228 1444 y(};)157 1557 y(class)f(Matrix)g(:)h(public)f(TwoDimension\ -alArray)228 1613 y({)228 1670 y(public:)300 1726 y(Matrix)g(\(int)g(numberOfR\ -ows,)f(int)i(numberOfColumns\))e(:)348 1783 y(TwoDimensionalArray)f(\(numberO\ -fRows,numberOfColu)o(mns\))g({};)300 1839 y(Matrix)i(matrixMultiply)f(\(Matri\ -x)h(anotherMatrix\))348 1896 y({)g(...)h(j=get\(x,y\);)e(...)i(put\(k,x,y\);) -e(...};)300 1952 y(void)h(rotate\(\))g({)h(...};)300 2009 y(Matrix)f(martixIn\ -verse\(\))f({)i(...};)228 2065 y(};)108 2215 y fl(It)17 b(seemed)h(reasonable) -g(at)e(\014rst)h(to)g(mo)q(del)h(this)f(relationship)i(using)f(inheritance;)i -(the)d(higher)h(lev)o(el)37 2271 y(matrix)h(op)q(erations)h(call)g(the)g(lo)o -(w)o(er)f(lev)o(el)h(functions)g(inherited)i(from)c(its)i(sup)q(erclass.)33 b -(A)19 b(matrix)g(w)o(as)37 2328 y(though)o(t)f(of)g(as)g(a)g(sp)q(ecial)i(t)o -(yp)q(e)e(of)g(t)o(w)o(o)f(dimensional)j(arra)o(y)l(.)28 b(Ho)o(w)o(ev)o(er,) -18 b(a)g(matrix)g(is)g(a)g(mathematical)37 2384 y(abstraction)g(that)g(can)h -(b)q(e)g(represen)o(ted)g(in)g(di\013eren)o(t)f(w)o(a)o(ys.)29 b(The)18 b(rep\ -resen)o(tation)h(is)g(part)e(of)h(the)h(ma-)37 2441 y(trix)c(abstraction,)f -(but)h(the)g(matrix)f(abstraction)g(and)h(its)g(represen)o(tation)g(are)f(rea\ -lly)i(distinct)f(concepts.)37 2497 y(Op)q(erations)i(on)g(the)f(abstraction)g -(should)h(b)q(e)g(separated)f(from)f(op)q(erations)i(on)f(its)g(represen)o -(tation.)23 b(F)l(or)37 2554 y(applications)e(where)d(\(for)g(example\))h(mat\ -rices)g(are)f(sparse,)h(represen)o(tations)f(other)g(than)h(t)o(w)o(o)e(dimen\ --)37 2610 y(sional)g(arra)o(ys)c(are)i(more)g(e\016cien)o(t.)941 2760 y(113)g -eop bop 108 42 a fl(The)18 b(refactoring)f(de\014ned)i(in)f(section)g(8.7)f -(is)h(applied)h(to)e(b)q(etter)h(mo)q(del)g(the)g(relationship)h(b)q(et)o(w)o -(een)37 98 y(the)d(classes)f ff(Matrix)g fl(and)g ff(Tw)o(oDimensionalArra)n -(y)p fl(.)i(During)f(that)e(refactoring,)h(the)g(to)q(ol:)93 200 y(1.)22 b -(adds)17 b(an)g(instance)h(of)e(the)h(class)h ff(Tw)o(oDim)o(ensionalArra)o -(y)c fl(as)i(a)h(mem)o(b)q(er)g(v)m(ariable)h(in)g(class)f ff(Matrix)151 256 y -fl(as)e(mem)o(b)q(er)g(v)m(ariable)i fi(matrixR)n(epr)p fl(,)f(using)f(the)h -(create)s 14 2 v 13 w(mem)o(b)q(er)s 14 2 v 13 w(v)m(ariable)h(refactoring.) -93 349 y(2.)22 b(quali\014es)17 b(the)f(v)m(ariable)g fi(matrixR)n(epr)g fl -(as)f(an)h(exclusiv)o(e)h(comp)q(onen)o(t)e(of)g(class)h ff(Matrix)p fl(,)f -(as)g(describ)q(ed)151 405 y(in)h(section)g(8.3.)93 498 y(3.)22 b(replaces)e -(all)g(calls)g(to)e(the)h(mem)o(b)q(er)g(functions)h fi(get)e fl(and)h fi(put) -h fl(in)g(class)f ff(Matrix)f fl(with)h(calls)h(to)e(the)151 554 y(corresp)q -(onding)e(functions)g(in)g(the)g(comp)q(onen)o(t.)108 656 y(Then,)f(the)h(to) -q(ol)f(c)o(hanges)g(the)g(sup)q(erclass)i(of)d(class)i ff(Matrix)p fl(,)e(usi\ -ng)i(refactoring)f(mo)o(v)o(e)s 14 2 v 12 w(class.)37 713 y(The)h(classes)g -(are)f(no)o(w)f(de\014ned)j(as)e(follo)o(ws:)157 814 y fg(class)23 b(TwoDimen\ -sionalArray)228 871 y({)228 927 y(protected:)300 984 y(int)g(elements[400];) -300 1040 y(int)g(columns,)g(rows;)228 1097 y(public:)300 1153 y(TwoDimensiona\ -lArray)e(\(int)j(numberOfRows,)e(int)h(numberOfColumns\))372 1210 y({)g(...)h -(};)300 1266 y(virtual)f(int)g(get\(int)g(rowNumber,)g(int)g(columnNumber\))f -({)i(...)f(};)300 1323 y(virtual)g(void)g(put)h(\(int)f(newValue,)g(rowNumber\ -,)f(int)i(columnNumber\))372 1379 y({)f(...)h(};)228 1435 y(};)157 1548 y(cla\ -ss)f(Matrix)228 1605 y({)228 1661 y(protected:)300 1718 y(TwoDimensionalArray) -e(*)j(matrixRepr;)228 1774 y(public:)300 1831 y(Matrix)f(\(int)g(numberOfRows\ -,)f(int)i(numberOfColumns\))348 1887 y({matrixRepr)e(=)i(new)f(TwoDimensional\ -Array\(numberOf)o(Rows,)1255 1944 y(numberOfColumns};)300 2000 y(Matrix)g(mat\ -rixMultiply)f(\(Matrix)h(anotherMatrix\))348 2056 y({)g(...)h(j=matrixRepr->g\ -et\(x,y\);)395 2113 y(...)g(matrixRepr->put\(k,x,y\);)d(...};)300 2169 y(void) -i(rotate\(\))g({)h(...};)300 2226 y(Matrix)f(martixInverse\(\))f({)i(...};) -228 2282 y(};)108 2441 y fl(Note)12 b(that)g(the)g(represen)o(tation)h(sp)q -(eci\014c)h(functions)f(for)f(retrieving)h(and)g(up)q(dating)g(an)f(elemen)o -(t)h(of)f(the)37 2497 y(matrix)g(are)g(de\014ned)i(in)f(the)f(comp)q(onen)o -(t)g(class)h ff(Tw)o(oDim)o(ensionalArra)o(y)p fl(,)c(whereas)j(functions)h -(more)f(closely)37 2554 y(related)g(to)f(the)g(matrix)g(abstraction)g(are)g -(de\014ned)h(in)g(the)g ff(Matrix)e fl(class.)19 b(Note)11 b(that)g(in)h(the) -f fi(matrixMultiply)37 2610 y fl(function)17 b(of)d(class)i ff(Matrix)p fl -(,)e(the)h fi(get)g fl(and)h fi(put)g fl(functions)g(are)e(referenced)j(throu\ -gh)d(the)i(new)f(comp)q(onen)o(t.)941 2760 y(114)g eop bop 108 42 a fl(This) -15 b(separation)g(not)f(only)i(clari\014es)g(the)e(design)i(b)o(y)f(separatin\ -g)f(functions)i(related)f(to)f(the)h(abstrac-)37 98 y(tion)21 b(and)f(one)g -(if)h(its)f(p)q(ossible)i(represen)o(tations,)f(but)f(also)g(allo)o(ws)h(the) -f(program)f(to)g(b)q(e)i(expanded)g(to)37 154 y(supp)q(ort)16 b(m)o(ultiple)h -(represen)o(tations)e(for)g(m)o(ultiple)i(uses.)108 211 y(F)l(or)e(some)g(app\ -lications,)i(the)e(matrix)g(is)h(kno)o(wn)g(to)e(b)q(e)i(sparse)g(and)f(repre\ -sen)o(tations)h(more)f(e\016cien)o(t)37 267 y(than)d(t)o(w)o(o)f(dimensional) -j(arra)o(ys)d(can)h(b)q(e)h(used.)19 b(The)13 b(follo)o(wing)f(steps)g(extend) -h(the)f(to)q(ol)g(to)g(supp)q(ort)g(matrix)37 324 y(represen)o(tations)k(othe\ -r)e(than)i(t)o(w)o(o)d(dimensional)18 b(arra)o(ys:)93 417 y(1.)k(creating)15 b -(the)g(class)g ff(MatrixRep)o(resentation)h fl(as)e(a)h(sup)q(erclass)g(of)g -ff(Tw)o(oDim)o(ensionalArra)o(y)p fl(,)c(using)k(the)151 473 y(refactorings)g -fi(cr)n(e)n(ate)s 14 2 v 13 w(empty)s 14 2 v 14 w(class)f fl(and)i fi(move)s -14 2 v 14 w(class)93 567 y fl(2.)22 b(creating)h(a)f(new)h(class)g ff(Spa)o -(rseMatrixRep)o(resentation)h fl(as)e(a)h(sub)q(class)g(of)f ff(MatrixRep)o -(resentation)p fl(,)151 623 y(using)16 b(the)f fi(cr)n(e)n(ate)s 14 2 v 14 w -(empty)s 14 2 v 14 w(class)f fl(refactoring)93 717 y(3.)22 b(cop)o(ying)c(mem) -o(b)q(ers)f(from)g(the)h(class)f ff(Tw)o(oDimensionalArra)n(y)e fl(in)o(to)i -(the)h(new)f(class,)h(and)g(man)o(ually)151 773 y(reimplemen)o(ting)f(those)e -(op)q(erations)93 867 y(4.)22 b(migrating)17 b(common)g(b)q(eha)o(vior)g(to)g -(the)g(abstract)f(sup)q(erclass,)i(using)g(the)f(refactorings)g(describ)q(ed) -151 923 y(in)f(c)o(hapter)f(six)93 1017 y(5.)22 b(generalizing)14 b(the)d(t)o -(yp)q(e)h(of)f(the)g(v)m(ariable)i fi(matrixR)n(epr)f fl(in)h(class)e ff(Matr\ -ix)g fl(to)g(b)q(e)h ff(MatrixRep)o(resentation)p fl(.)37 1110 y(The)k(result\ -ing)g(inheritance)h(hierarc)o(hies)g(and)e(class)h(de\014nitions)h(are:)158 -1168 y 25786450 4604723 6972866 25325977 32759316 29930700 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Times-Bold -%%Pages: 1 -%%BoundingBox: 106 385 498 455 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.8 0 0 0.8 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 134.337 565.988 ] concat -%I -[ -(Matrix) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 344.626 565.18 ] concat -%I -[ -(MatrixRepresentation) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -79.1569 36.8674 ] concat -%I -472 439 472 439 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 256.47 496.542 ] concat -%I -[ -(TwoDimensionalArray) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 138.144 -70.4941 ] concat -%I -155 626 155 626 Line -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1.08434 0 0 1.08434 -56.3855 117.108 ] concat -%I -394 393 349 356 Line -End - -Begin %I Pict -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 1 0 0 1 0 -2.16867 ] concat - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 441.132 497.952 ] concat -%I -[ -(SparseMatrixRepresentation) -] Text -End - -Begin %I Line -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ -0.180549 1.0692 -1.0692 -0.180549 956.311 195.01 ] concat -%I -394 393 349 356 Line -End - -End %I eop - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 157 1707 a fg(class)23 b(Matrix)228 1763 y({)228 1820 y(protec\ -ted:)300 1876 y(MatrixRepresentation)e(*)j(matrixRepr;)228 1933 y(public:)300 -1989 y(Matrix)f(\(int)g(numberOfRows,)f(int)i(numberOfColumns\))348 2045 y -({matrixRepr)e(=)i(new)f(TwoDimensionalArray\(numberOf)o(Rows,)1255 2102 y -(numberOfColumns};)300 2158 y(Matrix)g(matrixMultiply)f(\(Matrix)h(anotherMat\ -rix\))348 2215 y({)g(...)h(j=matrixRepr->get\(x,y\);)395 2271 y(...)g(matrixR\ -epr->put\(k,x,y\);)d(...};)300 2328 y(void)i(rotate\(\))g({)h(...};)300 2384 y -(Matrix)f(martixInverse\(\))f({)i(...};)228 2441 y(};)157 2554 y(class)f(Matr\ -ixRepresentation)228 2610 y({)941 2760 y fl(115)g eop bop 228 42 a fg(protect\ -ed:)300 98 y(int)23 b(columns,)g(rows;)228 154 y(public:)300 211 y(MatrixRepr\ -esentation)e(\(int)i(numberOfRows,)825 267 y(int)g(numberOfColumns\);)300 324 -y(virtual)g(int)g(get\(int)g(rowNumber,)g(int)g(columnNumber\))f(=)i(0;)300 -380 y(virtual)f(int)g(put)h(\(int)f(newValue,)g(int)g(rowNumber,)706 437 y -(int)g(columnNumber\))f(=)i(0;)228 493 y(};)157 606 y(class)f(TwoDimensionalA\ -rray)e(:)j(public)f(MatrixRepresentation)228 663 y({)228 719 y(protected:)300 -775 y(int)g(elements[400];)228 832 y(public:)300 888 y(TwoDimensionalArray)e -(\(int)j(numberOfRows,)e(int)h(numberOfColumns\))372 945 y({)g(...)h(};)300 -1001 y(int)f(get\(int)g(rowNumber,)g(int)g(columnNumber\))f({)i(...)g(};)300 -1058 y(void)f(put)h(\(int)f(newValue,)g(rowNumber,)f(int)i(columnNumber\))372 -1114 y({)f(...)h(};)228 1171 y(};)157 1284 y(class)f(SparseMatrixRepresentati\ -on)d(:)k(MatrixRepresentation)228 1340 y({)228 1396 y(protected:)300 1453 y -(sparseArrayElement)d(elements[50];)372 1509 y(/*)i(maximum)g(50)h(elements)e -(for)i(this)f(sparse)g(representation;)443 1566 y(type)g(sparseArrayElement)f -(defined)h(elsewhere)f(*/)300 1622 y(int)h(get\(int)g(rowNumber,)g(int)g(colu\ -mnNumber\))f({)i(...)g(};)300 1679 y(void)f(put)h(\(int)f(newValue,)g(rowNumb\ -er,)f(int)i(columnNumber\))372 1735 y({)f(...)h(};)228 1792 y(};)37 1953 y fl -(As)16 b(a)f(result)g(of)g(these)g(refactorings:)106 2046 y fj(\017)22 b fl -(the)15 b(mathematical)h(abstraction)f(is)g(separated)g(from)g(the)g(underlyi\ -ng)i(represen)o(tation)106 2140 y fj(\017)22 b fl(the)15 b(program)e(de\014ne\ -s)j(m)o(ultiple)g(represen)o(tations)f(for)f(Matrices,)g(making)h(explicit)i -(their)e(common)151 2196 y(features.)25 b(This)17 b(structure)g(w)o(ould)g -(mak)o(e)g(it)g(easier)g(to)g(extend)g(the)g(to)q(ol)g(with)g(additional)i -(matrix)151 2253 y(represen)o(tations)c(in)h(the)g(future.)37 2396 y fd(9.3) -70 b(Summary)37 2497 y fl(This)19 b(c)o(hapter)f(describ)q(es)i(t)o(w)o(o)d -(examples)i(of)e(ho)o(w)h(refactorings)g(can)g(b)q(e)h(in)o(tegrated.)28 b -(The)18 b(\014rst)g(\()p fi(Menu)37 2554 y(Planning)p fl(\))e(example)i(demon\ -strates)f(the)g(use)h(of)f(refactorings)g(de\014ned)i(in)f(c)o(hapters)f(six) -h(and)f(sev)o(en)h(for)37 2610 y(sp)q(ecializi)q(ng)23 b(a)c(class)h(and)g -(then)g(migrating)g(common)g(co)q(de)g(to)f(a)h(sup)q(erclass.)34 b(The)21 b -(second)f(\()p fi(Matrix)p fl(\))941 2760 y(116)g eop bop 37 42 a fl(example) -21 b(demonstrates)e(the)g(use)h(of)g(refactorings)f(de\014ned)i(in)f(c)o(hapt\ -ers)f(six)h(and)g(eigh)o(t)g(for)f(c)o(hanging)37 98 y(ho)o(w)13 b(an)f(in)o -(terclass)i(relationship)g(is)g(mo)q(deled)g(\(from)e(inheritance)i(to)e(an)h -(aggregation\).)18 b(These)13 b(examples)37 154 y(demonstrate)19 b(ho)o(w)g -(refactorings)g(m)o(ust)g(b)q(e)h(applied)h(together)e(to)g(impro)o(v)o(e)g -(the)g(design)i(of)e(a)g(to)q(ol)g(and)37 211 y(supp)q(ort)d(extensions.)108 -267 y(Eac)o(h)e(refactoring)g(c)o(hec)o(ks)g(is)g(o)o(wn)g(preconditions)h -(and)f(is)h(guaran)o(teed)f(to)f(preserv)o(e)h(program)f(b)q(eha)o(v-)37 324 y -(ior.)26 b(Therefore,)17 b(it)g(is)g(safe)g(to)g(string)f(the)i(refactorings) -e(together.)24 b(This)18 b(p)q(ermits)g(trying)f(out)f(di\013eren)o(t)37 380 y -(sequences)h(of)e(refactorings,)f(and)h(encourages)g(design)i(exploration.) -108 437 y(It)e(is)g(exp)q(ected)h(that)e(when)h(a)g(designer)h(\014rst)e(uses) -h(a)g(refactoring)f(to)q(ol,)g(they)h(will)i(man)o(ually)e(apply)h(a)37 493 y -(small)g(sequence)g(of)e(refactorings)g(to)g(p)q(erform)g(limited)j(restructu\ -ring)d(tasks.)19 b(As)c(the)f(designer)i(b)q(ecomes)37 550 y(more)g(sophistic\ -ated,)g(more)f(complicated)i(sequences)g(of)e(refactorings)g(will)j(b)q(e)e -(used;)g(for)f(a)g(small)i(set)e(of)37 606 y(frequen)o(tly)h(needed)h(tasks,) -d(the)h(designer)h(will)h(de\014ne)f(higher-lev)o(el)i(refactorings)d(\(ala)g -(macros\).)108 663 y(These)g(examples)f(demonstrate)g(ho)o(w)f(the)i(designer) -g(and)f(the)g(to)q(ol)g(w)o(ork)f(together)h(in)h(impro)o(ving)f(the)37 719 y -(design)g(of)d(a)h(program.)18 b(The)13 b(refactoring)e(to)q(ol)i(pro)o(vides) -f(p)q(o)o(w)o(erful)h(supp)q(ort)f(in)h(p)q(erforming)g(precondition)37 775 y -(c)o(hec)o(king)k(and)f(implemen)o(ting)i(the)e(c)o(hanges.)22 b(Ho)o(w)o(ev) -o(er,)15 b(there)g(is)i(no)f(w)o(a)o(y)e(for)i(a)f(refactoring)h(to)q(ol)g -(to)f(b)q(e)37 832 y(able)i(to)d(automatically)i(predict)g(what)f(c)o(hanges) -g(the)h(designer)g(will)h(need)f(and)g(automatically)g(do)f(them.)37 888 y -(Therefore,)g(the)g(role)h(of)f(the)g(designer)h(remains)g(imp)q(ortan)o(t.) -941 2760 y(117)g eop bop 37 353 a fc(Chapter)35 b(10)37 560 y fb(Related)42 b -(Approac)m(hes)37 783 y fl(This)23 b(c)o(hapter)f(fo)q(cuses)h(on)f(sev)o(era\ -l)g(areas)g(of)g(closely)h(related)g(w)o(ork.)40 b(In)23 b(prior)f(c)o(hapter\ -s,)h(generally)37 839 y(related)17 b(w)o(ork)e(w)o(as)f(describ)q(ed)k(on)e -(the)g(topics)g(of)f(soft)o(w)o(are)f(reuse,)i(soft)o(w)o(are)e(restructuring\ -,)i(application)37 896 y(framew)o(orks,)f(detecting)j(co)q(de)f(di\013erences\ -,)h(and)e(data)g(\015o)o(w)g(analysis.)25 b(This)17 b(c)o(hapter)g(discusses) -g(sev)o(eral)37 952 y(approac)o(hes)22 b(for)g(supp)q(orting)g(go)q(o)q(d)g -(ob)s(ject-orien)o(ted)g(design)h(st)o(yle)f(and)g(for)f(managing)h(ev)o(olut\ -ion)h(of)37 1009 y(ob)s(ject-orien)o(ted)17 b(systems.)22 b(Also)16 b(describ) -q(ed)i(is)f(some)f(recen)o(t)g(w)o(ork)f(on)h(restructuring)h(applied)h(to)d -(areas)37 1065 y(other)g(than)g(ob)s(ject-orien)o(ted)h(systems.)37 1208 y fd -(10.1)70 b(CR)n(C)22 b(Approac)n(h)i(to)g(Designing)d(Ob)t(ject-Orien)n(ted)f -(Systems)37 1310 y fl(Wirfs-Bro)q(c)o(k,)c(Wilk)o(erson)h(and)f(Wiener)h([126) -n(])f(describ)q(e)h(an)f(approac)o(h)g(to)f(Ob)s(ject-Orien)o(ted)i(Design)g -(fo-)37 1366 y(cusing)23 b(on)e fi(classes)p fl(,)g(class)h fi(r)n(esp)n(onsi\ -bilities)d fl(and)i(the)h fi(c)n(ol)r(lab)n(or)n(ations)e fl(among)g(classes.) -1605 1350 y fs(1)1664 1366 y fl(In)i(an)f(initial)37 1423 y(exploratory)e(pha\ -se,)g(classes,)h(resp)q(onsibiliti)q(es)h(and)e(collab)q(orations)h(are)f(de\ -\014ned.)32 b(In)19 b(the)g(subsequen)o(t)37 1479 y(analysis)g(phase,)e(syste\ -ms)g(are)g(de\014ned,)i(collab)q(orations)f(simpli\014ed,)i(hierarc)o(hies)f -(built)f(con)o(taining)g(ab-)37 1536 y(stract)d(and)g(concrete)g(classes,)h -(and)f(ob)s(ject)g(proto)q(cols)g(are)g(de\014ned.)108 1592 y(While)20 b(this) -e(approac)o(h)g(is)h(mainly)g(targeted)f(for)f(the)i(initial)h(task)d(analysi\ -s)i(and)g(system)f(design,)h(it)37 1649 y(has)d(imp)q(ortan)o(t)e(implication\ -s)k(on)d(refactoring.)108 1705 y(They)20 b(emphasize)g(the)g(need)g(for)f(ite\ -rating)g(the)h(design)g(of)f(a)g(system)g fi(b)n(efor)n(e)h(it)g(is)f(built)p -fl(.)33 b(This)20 b(of-)37 1761 y(ten)g(in)o(v)o(olv)o(es)h(some)f(restructur\ -ing)g(\(on)f(pap)q(er\).)34 b(By)20 b(con)o(trast,)g(refactoring)f(supp)q(ort\ -s)h(iteration)g(and)37 1818 y(restructuring)c fi(after)f fl(\(and)g fi(while) -p fl(\))g(the)g(system)g(is)h(built.)108 1874 y(They)e(also)f(note)g(that)g -(a)g(reusable)h(design)h(gro)o(ws)d(out)h(of)g(domain)g(analysis,)i(and)e(the) -h(design)g(m)o(ust)f(b)q(e)37 1931 y(clear)i(in)g(order)f(to)f(b)q(e)i(reusab\ -le.)21 b(Clarit)o(y)14 b(is)g(imp)q(ortan)o(t)g(not)g(only)g(b)q(efore)h(a)f -(system)f(is)i(built,)g(but)g(during)37 1987 y(and)f(after)e(it)h(is)h(built.) -20 b(While)15 b(there)e(are)g(some)g(general)g(principles)j(for)c(impro)o(vin\ -g)i(clarit)o(y)l(,)g(some)e(asp)q(ects)37 2044 y(of)18 b(clarit)o(y)h(are)f -(dep)q(enden)o(t)i(on)e(the)h(application)h(and)e(the)h(designer.)30 b(Change\ -s)18 b(o)q(ccur)h(o)o(v)o(er)f(time)g(b)q(oth)37 2100 y(to)g(the)g(designer's) -h(understanding)g(of)f(an)g(application)i(and)f(in)g(most)e(cases)h(to)g(the) -g(application)i(itself.)37 2157 y(Refactorings)c(can)f(assist)g(in)h(impro)o -(ving)g(the)f(clarit)o(y)h(of)f(a)f(design,)i(in)g(ligh)o(t)g(of)f(these)g -(c)o(hanges.)108 2213 y(Since)e(clarit)o(y)f(is)g(at)e(least)i(partly)f(sub)s -(jectiv)o(e,)h(some)g(in)o(teraction)f(with)h(the)g(designer)g(is)g(needed)h -(during)37 2270 y(refactoring.)20 b(The)14 b(clarit)o(y)g(of)f(a)h(design)h -(can)e(b)q(e)i(compromised)f(if)h(refactorings)e(are)g(applied)j(\\blindly")g -(to)37 2326 y(optimize)h(conformance)f(to)f(other)g(design)i(criteria,)f(suc) -o(h)g(as)g(minimizing)i(program)d(size)i(or)e(minimizing)37 2383 y(access)h -(to)e(v)m(ariables.)37 2455 y 750 2 v 89 2482 a fu(1)107 2497 y fp(Other)f -(approac)o(hes)h(to)f(ob)r(ject-orien)o(ted)i(analysis)g(and)f(design)g(inclu\ -de)i([21])c(and)i([36].)941 2760 y fl(118)g eop bop 37 42 a fd(10.2)70 b(Desi\ -gning)22 b(Reusable)g(Classes)37 143 y fl(This)16 b(refactoring)e(researc)o -(h)g(directly)i(builds)h(on)d(researc)o(h)h(done)g(at)f(the)g(Univ)o(ersit)o -(y)i(of)e(Illinois)j(b)o(y)e(John-)37 199 y(son)i(and)f(F)l(o)q(ote)g(to)f -(supp)q(ort)i(reusable)g(classes)g([59)o(].)23 b(T)l(o)16 b(impro)o(ving)h -(the)f(design)h(of)f(an)g(ob)s(ject)g(orien)o(ted)37 256 y(system,)f(they)g -(de\014ne)h(rules)g(of)e(th)o(um)o(bs)h(for)g(\014nding)h(standard)f(proto)q -(cols,)f(abstract)g(classes)i(and)f(frame-)37 312 y(w)o(orks.)k(Related)c(to) -e(proto)q(cols,)h(they)g(recommend)g(consisten)o(t)g(naming)h(of)e(related)i -(functions,)f(replacing)37 369 y(case)21 b(analysis)f(with)h(sub)q(classing,) -h(and)e(minimizing)j(the)d(size)h(of)e(metho)q(ds)i(and)f(n)o(um)o(b)q(er)g -(of)g(function)37 425 y(argumen)o(ts.)k(Related)18 b(to)e(abstract)f(classes,) -j(they)e(recommend)i(deep)f(and)g(narro)o(w)e(inheritance)k(hierar-)37 482 y -(c)o(hies,)g(minimizing)h(direct)f(access)e(to)g(v)m(ariables,)i(and)f(using) -h(sub)q(classing)g(for)e(sp)q(ecialization.)29 b(Related)37 538 y(to)18 b(fra\ -mew)o(orks,)e(they)i(recommend)h(factoring)e(implemen)o(tation)i(di\013erence\ -s)h(in)o(to)d(sub)q(comp)q(onen)o(ts,)i(s-)37 595 y(plitting)j(complicated)f -(classes)f(and)g(structuring)g(the)g(function)h(call)g(hierarc)o(h)o(y)f(so)f -(that)g(subfunctions)37 651 y(are)c(de\014ned)h(in)f(comp)q(onen)o(ts.)20 b -(These)14 b(rules)i(of)e(th)o(um)o(b)g(are)g(based)h(mostly)f(on)g(exp)q(erie\ -nces)j(in)e(Smalltalk)37 708 y(programming.)108 764 y(Johnson)k(and)f(F)l(o)q -(ote)g(fo)q(cused)h(at)e(a)h(high)h(lev)o(el)g(on)g fi(what)f fl(ough)o(t)g -(to)g(b)q(e)g(done,)h(while)h(this)f(researc)o(h)37 820 y(fo)q(cused)d(on)e fi -(how)h fl(automated)e(supp)q(ort)i(could)g(b)q(e)g(pro)o(vided.)21 b(Their)15 -b(w)o(ork)e(describ)q(ed)k(a)d(set)g(of)g(high)h(lev)o(el)37 877 y(guidelines) -21 b(that)c(can)g(b)q(e)i(applied)g(man)o(ually)f(\(or)f(p)q(ossibly)i(automa\ -tically\))f(to)f(impro)o(v)o(e)g(design,)i(while)37 933 y(this)i(researc)o -(h)f(precisely)j(sp)q(eci\014es)f(b)q(eha)o(vior)f(preserving)g(abstract)e -(editing)i(op)q(erations)g(to)f(automate)37 990 y(design)c(re\014nemen)o(t.)k -(F)l(or)15 b(example,)g(one)g(of)f(their)i(guidelines)h(is:)j fi(\\Split)c -(lar)n(ge)f(classes.")k fl(This)d(guideline)37 1046 y(is)i(v)m(ague.)24 b(Thi\ -s)18 b(thesis)f(de\014nes)h(sev)o(eral)e(w)o(a)o(ys)g(to)g(split)i(up)f(large) -g(classes:)23 b(b)o(y)16 b(separating)h(abstractions)37 1103 y(in)o(to)d(abst\ -ract)f(classes,)h(b)o(y)g(sp)q(ecializin)q(g)i(classes)e(using)h(sub)q(classi\ -ng,)g(and)f(b)o(y)g(de\014ning)h(comp)q(onen)o(ts)f(and)37 1159 y(mo)o(ving)i -(mem)o(b)q(ers)f(in)o(to)g(the)g(comp)q(onen)o(ts.)108 1216 y(This)20 b(resea\ -rc)o(h)f(di\013ers)h(from)e(and)i(extends)g([59)o(])f(in)h(other)f(w)o(a)o -(ys.)31 b(Their)20 b(pap)q(er)g(includes)i(a)d(set)g(of)37 1272 y(thirteen)d -(heuristics;)g(this)g(researc)o(h)e(de\014nes)i(a)f(la)o(y)o(ered)g(taxonom)o -(y)f(of)g(sev)o(eral)h(dozen)h(refactorings.)j(The)37 1329 y(refactoring)14 b -(taxonom)o(y)e(made)i(clear)h(that)e(their)h(thirteen)h(rules)f(of)g(th)o(um) -o(b)f(w)o(ere)h(not)f(distinct)i(but)f(in)o(ter-)37 1385 y(relate.)20 b(Tw)o -(o)14 b(of)g(their)i(rules)f(are:)k fi(\\Sub)n(classes)14 b(should)i(b)n(e)g -(sp)n(e)n(cializations.")i fl(and)d fi(\\Split)g(lar)n(ge)h(classes.")37 1441 -y fl(\(the)d(latter,)f(also)h(men)o(tioned)h(ab)q(o)o(v)o(e\).)k(Chapter)12 b -(sev)o(en)h(describ)q(es)i(an)d(approac)o(h)h(that)f(exploits)h(sub)q(class-) -37 1498 y(ing)i(for)f(sp)q(ecialization)i(in)f(splitting)g(large)g(classes.)k -(This)c(researc)o(h)f(also)g(unco)o(v)o(ered)g(design)h(information)37 1554 y -(that)g(w)o(as)f(needed)j(to)d(automate)g(refactorings,)h(and)g(considered)i -(implemen)o(tation)f(issues.)108 1611 y(Johnson)11 b(and)f(F)l(o)q(ote)g(reco\ -gnized)i(the)e(need)h(for)f(this)h(researc)o(h)f(in)h([59)o(])f(and)g(motiv)m -(ated)h(its)f(imp)q(ortance.)37 1754 y fd(10.3)70 b(Ac)n(hieving)22 b(Go)r -(o)r(d)h(St)n(yle)f(in)g(Smalltalk)f(Programs)37 1855 y fl(Ro)q(c)o(hat)h([98) -o(])e(prop)q(oses)i(sev)o(eral)f(guidelines)j(for)c(ac)o(hieving)j(go)q(o)q -(d)e(programming)f(st)o(yle)i(in)g(Smalltalk.)37 1912 y(Among)f(the)g(guideli\ -nes:)34 b(Carefully)22 b(name)f(classes)g(and)g(class)g(mem)o(b)q(ers.)37 b -(Eac)o(h)21 b(class)g(and)g(metho)q(d)37 1968 y(should)e(ha)o(v)o(e)f(a)g(sin\ -gle)h(purp)q(ose;)g(m)o(ulti-purp)q(ose)h(classes)e(and)g(metho)q(ds)g(should) -h(b)q(e)g(split.)29 b(Sub)q(classes)37 2025 y(should)13 b(b)q(e)f(re\014nemen) -o(ts)g(\(in)g(proto)q(col)g(or)f(implemen)o(tation\))h(of)f(their)h(sup)q(erc\ -lasses.)20 b(Nested)12 b(conditionals)37 2081 y(should)17 b(b)q(e)f(replaced) -g(with)g(m)o(ultiple)h(classes)e(to)g(ac)o(hiev)o(e)h(p)q(olymorphism.)108 -2138 y(Ro)q(c)o(hat)22 b(concludes)i([98)o(])e(that)g(organizational)g(to)q -(ols)g(are)g(needed)i(to)d(supp)q(ort)i(these)f(guidelines.)37 2194 y(These) -17 b(guidelines)i(are)d(re\015ected)h(b)q(oth)f(in)h(the)f(supp)q(orting)h -(refactorings)f(and)g(most)g(clearly)h(in)g(the)g(dis-)37 2251 y(cussion)g -(of)d(sub)q(classing)j(in)f(c)o(hapter)f(sev)o(en)h(of)e(this)i(thesis.)37 -2394 y fd(10.4)70 b(Demeter)21 b(Pro)t(ject)37 2495 y fl(Lieb)q(erherr)d(and) -e(others)g(in)g(the)g(Demeter)g(pro)s(ject)f(at)g(Northeastern)h(Univ)o(ersit) -o(y)g(ha)o(v)o(e)g(studied)h(ho)o(w)e(to)37 2552 y(impro)o(v)o(e)e(the)g(pro) -q(ductivit)o(y)h(of)e(ob)s(ject-orien)o(ted)h(designers)g(and)g(programmers[7\ -1)n(,)f(69].)18 b(They)13 b(ha)o(v)o(e)g(pro-)37 2608 y(p)q(osed)h(rules)g -(for)e(bringing)i(discipline)i(to)d(the)g(ob)s(ject)f(orien)o(ted)h(design)h -(pro)q(cess)f(\(the)g(\\La)o(w)f(of)g(Demeter"\))941 2760 y(119)g eop bop 37 -42 a fl(and)17 b(ha)o(v)o(e)f(dev)o(elop)q(ed)i(a)e(set)h(of)e(structures)i -(and)f(to)q(ols,)g(whic)o(h)i(they)e(pac)o(k)m(age)h(as)f(the)g(Demeter)g(sys\ -tem.)37 98 y(Their)i(st)o(yle)g(is)f(claimed)i(to)d(increase)j(information)e -(hiding,)i(minimize)g(coupling)g(b)q(et)o(w)o(een)e(classes,)h(and)37 154 y -(impro)o(v)o(e)13 b(main)o(tainabilit)o(y)h(and)e(comprehensibili)q(t)o(y)l -(.)21 b(They)13 b(ha)o(v)o(e)f(dev)o(elop)q(ed)i(to)q(ols)e(to)g(c)o(hec)o -(k)h(if)g(programs)37 211 y(conform)i(to)g(the)g(la)o(w.)108 267 y(There)g -(are)g(some)f(shortcomings)g(to)h(the)f(Demeter)h(approac)o(h.)k(The)c(Demete\ -r)g(researc)o(hers)f([72)o(])h(note)37 324 y(that)j(restructuring)g(a)f(progr\ -am)g(to)g(mak)o(e)g(it)h(conform)f(with)h(their)h(\\la)o(w")e(can)h(require)g -(increasing)h(the)37 380 y(n)o(um)o(b)q(er)g(of)e(metho)q(ds)h(and)g(metho)q -(d)g(argumen)o(ts,)g(and)g(result)g(in)h(slo)o(w)o(er)e(execution)i(sp)q(eed) -g(and)f(p)q(o)q(orer)37 437 y(readabilit)o(y)c(of)e(co)q(de.)19 b(Wirfs-Bro)q -(c)o(k)13 b(and)f(Wilk)o(erson)h([125)o(])f(argue)g(that)g(the)g(la)o(w)g(o)o -(v)o(erconstrains)g(the)g(con-)37 493 y(nections)17 b(b)q(et)o(w)o(een)f(ob)s -(jects,)f(and)h(more)f(imp)q(ortan)o(tly)h(shifts)g(the)g(fo)q(cus)g(a)o(w)o -(a)o(y)e(from)h(the)h(resp)q(onsibilit)o(y-)37 550 y(driv)o(en)22 b(asp)q(ect\ -s)f(of)f(design)h(\(where)g(it)f(b)q(elongs\))i(to)o(w)o(ard)d(the)h(data-dri\ -v)o(en)h(asp)q(ects.)36 b(Sakkinen)22 b([108)o(])37 606 y(discusses)17 b(othe\ -r)e(problems)h(in)g(applying)g(the)f(La)o(w)g(of)g(Demeter.)108 663 y(Nonethe\ -less,)f(the)f(Demeter)g(w)o(ork)e(is)j(an)f(imp)q(ortan)o(t)f(con)o(tribution) -i(to)e(ob)s(ject-orien)o(ted)h(design)h(st)o(yle.)37 719 y(Abstraction)h(is)g -(imp)q(ortan)o(t)f(in)h(impro)o(ving)g(the)f(main)o(tainabilit)o(y)j(of)d(ob) -s(ject-orien)o(ted)g(systems.)19 b(A)c(refac-)37 775 y(toring)20 b(that)f(dir\ -ectly)i(supp)q(orts)e(the)h(hiding)h(of)e(v)m(ariables,)j(in)e(line)h(with)f -(the)g(Demeter)f(guidelines,)k(is)37 832 y fi(abstr)n(act)s 14 2 v 14 w(ac)n -(c)n(ess)s 14 2 v 12 w(to)s 14 2 v 14 w(memb)n(er)s 14 2 v 14 w(variable)p fl -(.)36 b(Another)21 b(w)o(a)o(y)e(to)h(b)q(etter)h(encapsulate)g(v)m(ariable)h -(access)f(is)g(to)37 888 y(refactor)15 b(v)m(ariables)h(in)o(to)f(a)g(comp)q -(onen)o(t)h(and)f(limit)i(access)e(to)f(the)i(comp)q(onen)o(t.)108 945 y(Anot\ -her)f(imp)q(ortan)o(t)f(con)o(tribution)h(of)f(their)h(w)o(ork)f(is)h(in)g -(de\014ning)h(structures)f(and)f(to)q(ols)h(for)f(ob)s(ject-)37 1001 y(orien) -o(ted)23 b(design.)41 b(A)22 b fi(class)g(dictionary)g fl(de\014nes)h(classes\ -,)h(mem)o(b)q(ers)e(and)g(inheritance)i(relationships.)37 1058 y(Class)18 b -(dictionaries)h(can)e(b)q(e)h(represen)o(ted)g(graphically)l(,)h(where)f(clas\ -ses)g(and)f(mem)o(b)q(ers)h(are)f(represen)o(ted)37 1114 y(as)c(v)o(ertices,) -h(inheritance)h(relationships)f(are)f(represen)o(ted)h(using)g fi(alternation) -g(e)n(dges)p fl(,)e(and)h(class/mem)o(b)q(er)37 1171 y(relationships)18 b(are) -e(represen)o(ted)g(using)h fi(c)n(onstruction)f(e)n(dges)p fl(.)21 b(There)c -(are)e(to)q(ols)h(for)f(con)o(v)o(erting)h(b)q(et)o(w)o(een)37 1227 y(textual) -g(and)g(graphical)g(represen)o(tations)g(of)f(class)h(dictionaries,)g(for)f -(unco)o(v)o(ering)h(subgraphs)g(of)f(related)37 1284 y(ob)s(jects)g(called)h -fi(pr)n(op)n(agation)g(p)n(atterns)p fl(,)e(and)h(for)g(generated)g(C++)g(sou\ -rce)g(co)q(de)g(from)f(their)i(represen)o(ta-)37 1340 y(tions.)108 1396 y(Ber\ -gstein)d([15)o(])g(de\014ned)h(a)e(set)h(of)f(ob)s(ject)g(preserving)i(class) -f(transformations)e(that)h(can)h(b)q(e)g(applied)i(to)37 1453 y(class)i(dicti\ -onary)f(graphs.)21 b(He)16 b(sho)o(ws)f(that)g(all)h(ob)s(ject)f(preserving)i -(class)f(transformations)e(that)h(can)h(b)q(e)37 1509 y(p)q(erformed)c(on)f -(class)g(dictionary)h(graphs)e(can)h(b)q(e)h(decomp)q(osed)g(in)o(to)f(a)f -(small)i(set)f(of)f(primitiv)o(e)j(op)q(erations:)37 1566 y(adding)k(or)f(del\ -eting)i(a)e(\\useless")g(alternation,)g(abstracting)g(or)g(distributing)h(com\ -mon)f(parts)g(and)g(part)37 1622 y(replacemen)o(t.)k(These)11 b(c)o(hanges)g -(corresp)q(ond)h(to)e(adding)i(or)e(deleting)j(an)e(unreferenced)i(class)e -(as)g(a)f(sub)q(class)37 1679 y(of)16 b(an)h(existing)g(class,)g(migrating)f -(mem)o(b)q(ers)h(up)f(or)g(do)o(wn)g(an)h(inheritance)h(hierarc)o(h)o(y)l(,)f -(or)f(c)o(hanging)g(the)37 1735 y(t)o(yp)q(e)f(\(class\))f(of)g(a)g(mem)o(b)q -(er.)19 b(Eac)o(h)c(of)e(these)i(c)o(hanges,)f(pro)o(vide)h(that)e(their)i -(preconditions)h(are)e(met,)g(will)37 1792 y(preserv)o(e)f(existing)h(ob)s -(jects;)f(that)f(is,)h(the)g(set)g(of)f(mem)o(b)q(ers)h(for)g(eac)o(h)f(ob)s -(ject)h(will)h(b)q(e)g(unc)o(hanged)f(b)o(y)g(these)37 1848 y(transformations\ -.)108 1905 y(These)i(op)q(erations)g(corresp)q(ond)f(to)g(some)g(of)g(the)h -(supp)q(orting)g(refactorings)f(de\014ned)i(in)f(c)o(hapter)g(\014v)o(e,)37 -1961 y(whic)o(h)i(are)e(frequen)o(tly)h(used)g(to)f(implemen)o(t)i(other)e -(refactorings.)21 b(Ho)o(w)o(ev)o(er,)14 b(the)i(refactoring)f(approac)o(h)37 -2017 y(o)o(v)o(erall)22 b(is)g(more)f(general)h(and)g(p)q(o)o(w)o(erful.)39 b -(Refactorings)22 b(op)q(erations)f(that)g(cannot)g(b)q(e)h(expressed)h(in)37 -2074 y(terms)17 b(of)f(these)h(transformations)e(include)k(abstracting)d(v)m -(ariables,)i(mo)q(difying)g(functions)g(and)f(mo)o(ving)37 2130 y(mem)o(b)q -(ers)k(b)q(et)o(w)o(een)f(comp)q(onen)o(t)h(and)f(aggregate)f(classes.)36 b -(Abstracting)20 b(v)m(ariables)h(is)g(not)f(needed)i(in)37 2187 y(the)17 b -(Demeter)f(system,)g(since)h(v)m(ariable)h(references)f(are)f(abstracted)g -(in)h(the)g(co)q(de)g(generated)f(from)g(their)37 2243 y(represen)o(tations.) -26 b(F)l(unction)18 b(mo)q(di\014cations)g(are)f(not)g(supp)q(orted)g(b)q(eca\ -use)h(the)f(data)g(dictionary)h(graph)37 2300 y(is)f(limited)g(to)e(supp)q -(orting)i(data)e(mo)q(deling.)22 b(P)o(erhaps)16 b(the)g(most)e(imp)q(ortan)o -(t)i(di\013erence)h(b)q(et)o(w)o(een)f(refac-)37 2356 y(torings)d(and)h(the)f -(ob)s(ject)g(preserving)h(class)g(transformations)e(is)h(that)g(refactoring)g -(can)g(c)o(hange)g(the)h(set)f(of)37 2413 y(mem)o(b)q(ers)k(in)g(a)f(class,)h -(as)f(long)g(as)g(the)h(o)o(v)o(erall)f(b)q(eha)o(vior)h(of)f(the)g(program)f -(is)i(preserv)o(ed.)24 b(This)17 b(p)q(ermits)37 2469 y(c)o(hanges)k(suc)o -(h)g(as)f(mo)o(ving)h(mem)o(b)q(ers)g(b)q(et)o(w)o(een)g(comp)q(onen)o(t)g -(and)g(aggregate)e(classes,)j(whic)o(h)f(are)g(not)37 2526 y(co)o(v)o(ered)16 -b(in)g(Bergstein's)f(approac)o(h.)20 b(Extensions)c(to)f(Bergstein's)g(approa\ -c)o(h)g(are)g(b)q(eing)i(in)o(v)o(estigated)f(b)o(y)37 2582 y(the)g(Demeter)f -(researc)o(hers)g([70)o(].)941 2760 y(120)g eop bop 37 42 a fd(10.5)70 b(Reor\ -ganizing)22 b(Generic)g(Applications:)28 b(Ithaca)37 143 y fl(As)20 b(part)e -(of)h(the)g(ITHA)o(CA)g(\(Esprit)g(I)q(I\))h(pro)s(ject,)f(researc)o(h)g(b)o -(y)g(Casais)g(at)f(the)i(Univ)o(ersit)o(y)f(of)g(Genev)m(a)37 199 y(in)o(v)o -(estigated)14 b(approac)o(hes)f(to)f(supp)q(ort)h(the)g(ev)o(olution)h(of)f -(a)g(generic)h(application,)g(whic)o(h)g(is)g(similar)g(to)f(an)37 256 y(appl\ -ication)k(framew)o(ork.)i(As)c(with)g(Bergstein's)g(approac)o(h)g(describ)q -(ed)i(ab)q(o)o(v)o(e,)e(Casais')f(fo)q(cus)h(w)o(as)g(up)q(on)37 312 y(inheri\ -tance)i(related)f(c)o(hanges.)108 369 y(He)g(de\014nes)g(four)f(means)g(for)f -(supp)q(orting)i(ev)o(olution)g([31)o(]:)106 463 y fj(\017)22 b fi(tailoring) -p fl(,)17 b(where)h(the)g(existing)g(class)g(de\014nitions)h(are)e(not)g(dire\ -ctly)i(mo)q(di\014ed,)g(but)f(adaptations)151 519 y(are)i(applied)j(to)c(inhe\ -rited)k(prop)q(erties)e(when)g(deriving)h(new)e(sub)q(classes.)37 b(F)l(or)20 -b(example,)i(when)151 576 y(in)o(tro)q(ducing)e(a)e(new)g(sub)q(class)h(a)f -(function)h(inherited)i(from)c(its)i(sup)q(erclass)g(ma)o(y)e(b)q(e)i(o)o(v)o -(erridden.)151 632 y(Or,)f(some)f(ob)s(ject-orien)o(ted)g(languages)g(allo)o -(w)h(a)f(v)m(ariable)i(inherited)g(from)d(the)i(sup)q(erclass)g(to)f(b)q(e) -151 688 y(renamed)f(in)g(a)f(sub)q(class)h(b)q(e)g(retain)f(other)g(prop)q -(erties.)106 782 y fj(\017)22 b fi(sur)n(gery)p fl(,)16 b(whic)o(h)h(are)g -(structural)f(c)o(hanges)g(made)g(to)g(a)g(particular)h(class.)24 b(These)17 b -(c)o(hanges)f(include)151 839 y(adding,)g(remo)o(ving)f(or)g(renaming)g(a)g -(v)m(ariable)i(or)d(function,)i(or)f(c)o(hanging)g(the)h(t)o(yp)q(e)f(of)g -(a)f(v)m(ariable.)106 933 y fj(\017)22 b fi(versioning)p fl(,)14 b(to)g(supp) -q(ort)h(con\014guration)h(managemen)o(t)e(of)h(m)o(ulti-p)q(erson)i(pro)s(jec\ -ts)106 1026 y fj(\017)22 b fi(r)n(e)n(or)n(ganization)p fl(,)17 b(whic)o(h)h -(are)g(more)f(signi\014can)o(t)i(structural)e(c)o(hanges)h(whic)o(h)g(ma)o -(y)f(in)o(v)o(olv)o(e)i(the)e(in-)151 1083 y(tro)q(duction)f(or)e(suppression) -j(of)e(classes.)108 1177 y(Adding)20 b(a)f(new,)h(unreferenced)g(class)f(is)h -(an)f(example)h(of)e(tailoring.)32 b(Man)o(y)18 b(refactorings,)i(suc)o(h)f -(as)37 1233 y(adding)e(a)e(v)m(ariable)h(to)f(a)g(class,)g(are)g(examples)h -(of)f(class)h(surgery)l(.)k(The)15 b(refactorings)g(that)g(mo)o(v)o(e)f(class\ -es,)37 1290 y(and)i(the)f(three)g(higher)h(lev)o(el)h(refactorings,)d(are)h -(examples)h(of)f(class)h(reorganization.)108 1346 y(Casais')h(researc)o(h)g -(fo)q(cuses)h(on)g(the)f(\014nal)h(area)f(\(reorganization\).)27 b(His)18 b -(approac)o(h)f(fo)q(cuses)h(on)f(reuse)37 1402 y(b)o(y)k(inheritance.)36 b -(A)20 b(class)g(sp)q(eci\014cation)i(is)f(de\014ned)g(as)f(a)g(set)g(of)f(pro\ -p)q(erties.)36 b(These)20 b(prop)q(erties)h(are)37 1459 y(either)16 b(inherit\ -ed)g(or)e(lo)q(cally)i(in)o(tro)q(duced.)k(If)15 b(classes)g(or)f(class)g(\\p\ -rop)q(erties")h(\(mem)o(b)q(ers\))f(are)g(arbitrarily)37 1515 y(added)19 b -(to)e(a)g(class)h(hierarc)o(h)o(y)l(,)g(classes)g(migh)o(t)f(inherit)i(prop)q -(erties)f(that)f(violate)h(their)g(sp)q(eci\014cation,)i(or)37 1572 y(prop)q -(erties)f(ma)o(y)e(b)q(e)i(rein)o(tro)q(duced)g(that)e(could)i(ha)o(v)o(e)f -(b)q(een)h(inherited)g(from)e(an)h(existing)h(class.)29 b(Lo)q(cal)37 1628 y -(and)16 b(global)g(reorganization)g(strategies)f(are)g(in)o(tro)q(duced.)22 b -(When)16 b(a)f(new)h(class)g(is)g(in)o(tro)q(duced,)g(lo)q(calized)37 1685 y -(reorganizations)k(to)f(the)h(class)g(hierarc)o(h)o(y)g(can)g(b)q(e)h(applied) -g(so)f(that)f(the)h(new)f(class)i(do)q(es)f(not)f(inherit)37 1741 y(prop)q -(erties)d(that)e(are)h(rejected)g(in)g(b)o(y)g(sp)q(eci\014cation.)22 b(A)o -(t)14 b(a)h(more)f(global)h(lev)o(el,)h(the)f(same)g(prop)q(ert)o(y)f(ma)o -(y)37 1798 y(app)q(ear)f(in)g(t)o(w)o(o)e(otherwise)i(unrelated)g(classes.)20 -b(T)l(o)12 b(a)o(v)o(oid)g(this)h(duplication,)i(the)d(inheritance)i(hierarc) -o(hies)37 1854 y(are)k(globally)h(reorganized)f(in)g(a)g(w)o(a)o(y)f(that)f -(the)i(shared)g(prop)q(ert)o(y)f(is)i(mo)o(v)o(ed)e(to)g(a)g(third)h(class)g -(and)g(the)37 1911 y(t)o(w)o(o)c(classes)i(inherit)h(from)d(it.)108 1967 y -(Eliminating)e(duplicated)h(prop)q(erties,)e(and)g(ensuring)g(that)f(the)h -(inherited)h(b)q(eha)o(vior)f(of)f(a)g(class)h(do)q(esn't)37 2023 y(violate) -17 b(its)f(proto)q(col,)f(are)h(useful)g(design)h(goals.)k(Ho)o(w)o(ev)o(er,) -15 b(these)h(goals)f(do)h(not)f(alw)o(a)o(ys)g(con)o(tribute)h(to,)37 2080 y -(and)11 b(can)g(sometimes)g(w)o(ork)f(coun)o(ter)g(to,)h(the)g(more)f(imp)q -(ortan)o(t)g(\(alb)q(eit)i(less)f(rigorous\))f(goal)h(of)f(refactoring,)37 -2136 y(whic)o(h)17 b(is)e(to)g fi(impr)n(ove)h(design)g(clarity)p fl(.)108 -2193 y(Casais')f(strategies)h(sometimes,)g fi(but)h(not)g(always)p fl(,)f(wil\ -l)h(pro)q(duce)g(what)f(the)g(programmer)e(in)o(tended.)37 2249 y(A)k(cen)o -(tral)g(concept)h(of)e(application)j(framew)o(orks)c(is)i(that)f(eac)o(h)h -(class)h(should)f(corresp)q(ond)h(to)e(a)g(mean-)37 2306 y(ingful)f(abstracti\ -on.)j(Ho)o(w)o(ev)o(er,)13 b(the)i(reorganizations)f(noted)g(ab)q(o)o(v)o(e)g -(can)g(in)o(tro)q(duce)h(classes)g(that)f(do)g(not)37 2362 y(necessarily)19 b -(corresp)q(ond)e(to)f(meaningful)i(abstractions,)e(but)h(rather)g(are)f(neede\ -d)i(to)e(mak)o(e)g(the)h(mec)o(ha-)37 2419 y(nism)h(w)o(ork.)23 b(Also,)17 b -(there)f(is)h(hea)o(vy)g(use)g(made)f(of)g(m)o(ultiple)j(inheritance,)f(whic) -o(h)f(can)g(mak)o(e)f(it)h(di\016cult)37 2475 y(to)e(understand)h(ho)o(w)f -(inheritance)h(hierarc)o(hies)h(map)e(in)o(to)g(t)o(yp)q(e)g(sp)q(ecializatio\ -n)j(hierarc)o(hies.)108 2532 y(Casais')g(researc)o(h)h(mak)o(es)f(imp)q(ortan) -o(t)h(con)o(tributions)g(including)j(the)d(c)o(haracterization)g(of)f(c)o(han\ -ges)37 2588 y(in)o(to)j(the)h(four)e(categories)h(listed)h(ab)q(o)o(v)o(e,)g -(his)g(lo)q(cal)g(and)f(global)h(reorganization)f(strategies,)g(and)h(his)941 -2760 y(121)g eop bop 37 42 a fl(ob)s(ject)15 b(mo)q(del.)20 b(Ho)o(w)o(ev)o -(er,)14 b(as)g(he)i(notes)e(in)i([31)o(],)e(his)i(reorganization)f(algorithms) -f(deal)i(exclusiv)o(ely)h(with)37 98 y(inheritance.)34 b(There)19 b(is)h(no)f -(facilit)o(y)h(for)e(splitting)j(metho)q(ds,)e(restructuring)h(their)f(co)q -(de,)h(or)f(c)o(hanging)37 154 y(the)i(clien)o(t/serv)o(er)h(relationship)g -(b)q(et)o(w)o(een)f(classes.)37 b(These)22 b(areas)e(are)g(addressed)h(in)h -(the)f(refactoring)37 211 y(researc)o(h,)g(as)f(Casais)g(cites)g(in)h([31)o -(].)34 b(Splitting)22 b(and)e(restructuring)h(functions)f(is)h(co)o(v)o(ered) -f(in)h(c)o(hapter)37 267 y(six.)k(In)17 b(c)o(hapter)g(eigh)o(t,)f(an)h(appro\ -ac)o(h)f(is)h(describ)q(ed)i(for)d(replacing)h(inherited)i(b)q(eha)o(vior)e -(with)g(b)q(eha)o(vior)37 324 y(delegated)g(to)d(\(pro)o(vided)i(b)o(y\))f -(a)f(comp)q(onen)o(t.)37 466 y fd(10.6)70 b(Managing)25 b(Sc)n(hema)d(Ev)n -(olution)g(in)h(an)g(OODB)37 567 y fl(W)l(ork)16 b(in)g(ob)s(ject-orien)o(ted) -g(databases)f(\(OODBs\))h(has)f(b)q(een)i(motiv)m(ated)f(b)o(y)f(sev)o(eral)h -(w)o(ell-kno)o(wn)h(short-)37 624 y(comings)h(of)f(more)g(con)o(v)o(en)o(tion\ -al)g(database)g(tec)o(hnology)l(,)h(one)f(b)q(eing)h(that)f(the)g(structural) -g(information)37 680 y(stored)e(in)i(a)e(database)f(sc)o(hema)i(cannot)f(natu\ -rally)h(mo)q(del)g(frequen)o(tly)g(useful)g(seman)o(tic)g(concepts,)f(suc)o -(h)37 736 y(as)e(generalization)h(and)f(aggregation)e(relationships.)21 b(Sc) -o(hemas)12 b(ev)o(olv)o(e)h(o)o(v)o(er)f(time;)h(man)o(y)g(of)f(the)g(c)o(han\ -ges)37 793 y(made)k(to)e(sc)o(hemas)h(in)h(OODBs)g(are)f(similar)h(to)f(refac\ -torings.)108 849 y(Sc)o(hema)c(ev)o(olution)g(has)g(b)q(een)g(studied)h(for)e -(sev)o(eral)h(OODB)g(systems,)g(most)f(notably)g(ORION)j([9)o(,)d(66].)1894 -833 y fs(2)37 906 y fl(Just)16 b(as)f(with)g(refactoring,)g(the)g(metho)q(dol\ -ogy)g(for)g(handling)i(sc)o(hema)e(c)o(hanges)g(has)g(included:)106 992 y fj -(\017)22 b fl(dev)o(eloping)17 b(a)e(taxonom)o(y)f(of)g(c)o(hanges)106 1083 y -fj(\017)22 b fl(de\014ning)17 b(a)e(set)g(of)f(prop)q(erties)i(that)f(m)o(ust) -f(remain)i(in)o(v)m(arian)o(t)g(across)e(sc)o(hema)h(c)o(hanges)106 1174 y fj -(\017)22 b fl(de\014ning)17 b(the)e(c)o(hanges)g(in)h(the)g(taxonom)o(y)d(in) -k(a)d(w)o(a)o(y)h(that)f(preserv)o(es)h(these)h(prop)q(erties.)37 1261 y(.) -108 1317 y(In)d(the)g(ORION)h(system,)e(a)g(distinction)i(is)f(made)g(b)q(et) -o(w)o(een)g fi(soft)f fl(c)o(hanges)g(\(those)g(that)g(do)h(not)f(require)37 -1374 y(existing)g(instances)f(to)f(c)o(hange)g(their)h(classes\))f(and)h fi -(har)n(d)g fl(c)o(hanges.)18 b(Examples)11 b(of)f(soft)f(c)o(hanges)i(are)f -(adding)37 1430 y(or)h(renaming)g(an)g(en)o(tit)o(y)l(,)g(similar)h(to)e(some) -h(supp)q(orting)g(refactorings.)18 b(An)11 b(in)o(teresting)g(hard)g(c)o(hang\ -e)g(is)g(the)37 1487 y(partitioning)h(of)f(a)g(class)g(in)o(to)g(sev)o(eral)g -(sub)q(classes.)20 b(One)12 b(t)o(yp)q(e)f(of)f(partitioning)i(is)g(horizon)o -(tal)f(partitioning,)37 1543 y(a)i(database)g(selection)h(op)q(eration)f(whic) -o(h)h(is)g(analogous)f(to)f(sp)q(ecializin)q(g)j(a)e(class)g(in)o(to)g(a)g -(set)g(of)g(sub)q(classes.)37 1599 y(An)k(existing)g(instance)g(is)f(assigned) -h(to)e(a)h(sub)q(class)h(if)f(it)h(satis\014es)f(a)f(\\partitioning)i(conditi\ -on")g(whic)o(h)g(is)37 1656 y(a)i(kind)i(of)d(class)i(in)o(v)m(arian)o(t.)33 b -(Another)19 b(t)o(yp)q(e)g(of)g(partitioning)h(is)g(a)f(v)o(ertical)g(partiti\ -oning,)i(a)e(database)37 1712 y(pro)s(jection)f(op)q(eration)h(whic)o(h)g(is) -f(analogous)g(to)g(simplifying)i(a)e(complex)h(aggregate)d(class)j(b)o(y)f -(de\014ning)37 1769 y(comp)q(onen)o(ts)e(and)h(migrating)f(mem)o(b)q(ers)g -(to)f(those)h(comp)q(onen)o(ts.)22 b(One)16 b(asp)q(ect)h(of)e(v)o(ertical)i -(partitioning)37 1825 y(that)12 b(mak)o(es)g(it)g(di\013eren)o(t)h(from)e(mig\ -rating)i(mem)o(b)q(ers)f(to)g(comp)q(onen)o(ts)g(is)h(that,)f(after)f(the)i -(attributes)f(ha)o(v)o(e)37 1882 y(b)q(een)17 b(mo)o(v)o(ed)e(to)f(the)h(new) -h(classes,)f(and)g(the)h(original)g(class)g(is)f(deleted.)108 1938 y(ORION)23 -b(represen)o(ts)f(aggregations)e(as)h fi(c)n(omplex)h(obje)n(cts)p fl(.)38 b -(A)21 b fi(c)n(omp)n(osite)h(link)e fl(represen)o(ts)i(a)f(rela-)37 1995 y -(tionship)g(b)q(et)o(w)o(een)e(a)g(comp)q(osite)g(ob)s(ject)f(and)i(its)f(com\ -p)q(onen)o(t.)31 b(A)19 b fi(c)n(omp)n(osite)g(link)f fl(can)h(carry)g(sp)q -(ecial)37 2051 y(seman)o(tics,)14 b(suc)o(h)f(as)f(the)h(comp)q(onen)o(t)g -(is)h(exclusiv)o(e)g(to)f(one)g(comp)q(osite)g(ob)s(ject.)19 b(This)13 b(noti\ -on)g(of)g(exclusiv)o(e)37 2108 y(comp)q(onen)o(ts)j(w)o(as)e(applied)j(in)f -(the)g(refactorings)e(describ)q(ed)j(in)f(c)o(hapter)f(sev)o(en.)108 2164 y -(Not)20 b(surprisingly)l(,)k(the)d(fo)q(cus)g(of)g(researc)o(h)f(in)o(to)h -(OODBs)h(has)e(b)q(een)i(on)f(altering)g(and)g(migrating)37 2221 y fi(data)14 -b fl(\(mem)o(b)q(er)f(v)m(ariables\))i(with)e(less)h(emphasis)g(placed)g(up)q -(on)g(mem)o(b)q(er)f(functions.)20 b(Ho)o(w)o(ev)o(er,)13 b(there)g(are)37 -2277 y(facilities)i(in)f(ORION)h(to)d(detect)h(when)g(functions)h(\(metho)q -(ds\))e(ha)o(v)o(e)g(b)q(een)i(in)o(v)m(alidated)h(b)q(ecause)f(the)f(data)37 -2333 y(they)j(reference)g(has)f(b)q(een)h(altered)g(due)g(to)e(a)h(sc)o(hema) -g(c)o(hange.)108 2390 y(Some)h(researc)o(h)f(in)o(to)g(OODBs)i(has)e(consider\ -ed)i(v)o(ersioning)f(issues)h(and)e(m)o(ultiple)j(inheritance,)f(out-)37 2446 -y(side)22 b(the)e(scop)q(e)h(of)g(this)f(refactoring)h(researc)o(h.)35 b(Con) -o(v)o(ersely)l(,)22 b(OODB)f(researc)o(h)f(has)g(not)g(fo)q(cused)i(on)37 2522 -y 750 2 v 89 2548 a fu(2)107 2564 y fp(Other)10 b(systems)i(include)h(Gemston\ -e)e([92],)f fo(O)773 2568 y fu(2)801 2564 y fp(and)i(OTGen.)k(Casais)11 b([31\ -])g(compares)g(features)g(of)g(these)g(ob)r(ject-orien)o(ted)37 2610 y(databa\ -se)k(systems)e(with)h(regard)f(to)g(sc)o(hema)h(ev)o(olution.)941 2760 y fl -(122)g eop bop 37 42 a fl(sev)o(eral)14 b(topics)f(imp)q(ortan)o(t)g(in)h(ref\ -actoring,)e(suc)o(h)i(as)e(simplifying)k(conditional)e(expressions)g(using)g -(in)o(v)m(ari-)37 98 y(an)o(ts,)h(and)g(con)o(v)o(erting)g(an)g(asso)q(ciatio\ -n)h(mo)q(deled)g(using)g(inheritance)h(in)o(to)e(an)h(aggregation.)37 241 y fd -(10.7)70 b(Program)24 b(T)-6 b(ransformations)37 342 y fl(Refactorings)18 b -(supp)q(ort)g(c)o(hange)f(b)o(y)g(p)q(erforming)h(a)f(t)o(yp)q(e)g(of)g(progr\ -am)g(transformation.)25 b(Researc)o(h)17 b(in)o(to)37 399 y(more)h(am)o(bitio\ -us)g(forms)f(of)g(program)g(transformations)f(and)i(automatic)f(programming)g -(has)h(b)q(een)h(un-)37 455 y(derw)o(a)o(y)f(for)f(o)o(v)o(er)g(15)g(y)o(ears\ -.)28 b(Early)18 b(w)o(ork)f(in)h(this)h(area)e(w)o(as)g(done)h(b)o(y)g(Bursta\ -ll)h(and)f(Darlington)g([27)o(];)37 512 y(extensiv)o(e)f(w)o(ork)d(has)h(b)q -(een)i(done)e(b)o(y)g(Balzer)i(and)e(others)g(at)g(USC/ISI)h([8)o(],)f(includ\ -ing)j(recen)o(t)d(w)o(ork)f(in)o(to)37 568 y(building)k(an)d(ev)o(olution)h -(transformation)e(library[61].)108 624 y(This)k(w)o(ork)e(has)h(fo)q(cused)g -(on)g(the)h(pro)q(cess)f(of)f(con)o(v)o(erting)h(a)g(formal)g(sp)q(eci\014cat\ -ion)i(in)o(to)e(an)g(e\016cien)o(t)37 681 y(implemen)o(tation.)22 b(Examples) -15 b(of)g(b)q(eha)o(vior)h(preserving)g(transformations)e(are:)106 772 y fj -(\017)22 b fi(folding)d(and)h(unfolding)p fl(.)31 b(F)l(olding)20 b(replaces) -g(a)f(co)q(de)g(segmen)o(t)g(with)h(a)e(function)i(call;)i(unfolding)151 829 y -(inline)c(expands)e(a)f(function)h(call.)21 b(There)15 b(are)g(refactorings)g -(for)f(eac)o(h)h(of)g(these)h(op)q(erations.)106 922 y fj(\017)22 b fi(abstr) -n(action)p fl(.)28 b(Abstraction)18 b(substitutes)g(a)g(v)m(ariable)h(for)f -(ev)o(ery)g(instance)h(of)e(an)h(expression,)h(and)151 978 y(de\014nes)c(that) -e(v)m(ariable)i(to)e(b)q(e)h(the)g(v)m(alue)h(of)e(that)g(expression.)20 b -(This)14 b(transformation)e(did)j(not)e(arise)151 1034 y(in)i(the)f(refactori\ -ng)f(researc)o(h,)h(although)g(there)g(are)f(analogous)h(refactorings)f(to)g -(create)h(a)g(function)151 1091 y(whose)h(b)q(o)q(dy)h(is)g(an)f(expression,) -h(and)f(con)o(v)o(ert)g(an)g(expression)h(to)e(a)h(function)h(call.)106 1184 y -fj(\017)22 b fi(splitting)15 b(typ)n(e)p fl(.)20 b(This)c(is)f(a)g(transforma\ -tion)f(that)g(splits)i(a)f(t)o(yp)q(e)g(in)o(to)g(subt)o(yp)q(es,)g(analogous) -g(to)f(the)151 1240 y(refactoring)h(that)f(sp)q(ecializes)k(a)d(class)h(b)o -(y)f(de\014ning)i(sub)q(classes.)106 1333 y fj(\017)22 b fi(bubble)15 b(up)p -fl(.)k(This)c(transformation)d(mo)o(v)o(es)h(a)g(function)h(out)g(of)f(an)g -(enclosing)i(mo)q(dule)g(and)f(expands)151 1390 y(its)i(scop)q(e.)23 b(Refact\ -oring)17 b(can)f(expand)h(the)f(scop)q(e)g(of)g(a)g(function)h(b)o(y)f(c)o -(hanging)g(its)h(access)f(con)o(trol)151 1446 y(mo)q(de)g(or)e(b)o(y)h(mo)o -(ving)h(it)f(to)g(a)f(sup)q(erclass)j(or)d(to)h(a)g(comp)q(onen)o(t)g(class.) -108 1537 y(Since)h(program)d(transformation)h(systems)g(b)q(egin)h(with)g(a)g -(formal)f(sp)q(eci\014cation)i(rather)e(than)g(source)37 1594 y(co)q(de,)g -(they)f(can)h(b)o(y)f(construction)g(a)o(v)o(oid)g(some)g(of)f(the)i(co)q(de) -f(lev)o(el)i(complexities)g(and)e(dep)q(endencies)j(that)37 1650 y(can)g(mak) -o(e)e(refactoring)h(source)g(co)q(de)h(di\016cult.)21 b(On)16 b(the)f(other)g -(hand,)g(it)g(is)h(di\016cult)h(to)d(correctly)h(de\014ne)37 1707 y(the)f(inp\ -ut)h(to)e(these)h(systems.)19 b(As)14 b(Balzer)h(notes)e(in)i([8)o(],)e(one)h -(of)g(the)g(c)o(hief)g(failures)h(in)g(program)e(transfor-)37 1763 y(mation)h -(systems)g(has)g(b)q(een)h(the)f(unreadabilit)o(y)i(of)e(their)g(sp)q(eci\014\ -cation)i(languages.)k(It)14 b(has)g(tak)o(en)g(a)g(high)37 1820 y(lev)o(el)k -(of)d(user)h(sophistication,)h(b)q(oth)f(in)h(the)f(application)i(domain)e -(and)g(in)h(the)f(domain)g(of)g(sp)q(eci\014cation)37 1876 y(languages)g(and) -f(transformations,)f(to)g(apply)i(man)o(y)f(automatic)g(programming)f(approac) -o(hes.)108 1933 y(Refactorings)i(are)g(a)f(t)o(yp)q(e)h(of)g(program)f(transf\ -ormation,)f(but)i(with)h(an)f(imp)q(ortan)o(t)f(di\013erence)i(from)37 1989 y -(man)o(y)11 b(past)f(transformational)g(approac)o(hes.)18 b(Those)11 b(approa\ -c)o(hes)g(usually)h(assumed)f(a)f(top)h(do)o(wn)g(pro)q(cess,)37 2045 y(going) -16 b(from)f(a)g(formal,)f(abstract)h(sp)q(eci\014cation)i(to)e(an)g(implemen) -o(tation.)22 b(In)16 b(con)o(trast,)e(refactorings)h(are)37 2102 y(lo)o(w)o -(er)i(lev)o(el,)g(systematic,)f(and)h(are)f(less)h(dep)q(enden)o(t)h(on)f(the) -f(seman)o(tics)h(of)f(a)g(program.)22 b(The)17 b(idea)g(is)g(to)37 2158 y(rai\ -se)f(program)e(editing)j(to)d(a)h(higher)h(lev)o(el,)g(not)f(to)g(build)i(a)e -(design)h(language.)108 2215 y(Refactorings)i(do)f(not)h(force)f(up)q(on)h -(a)f(designer)i(a)e(rigid,)i(top)e(do)o(wn)g(design)i(st)o(yle.)27 b(Exp)q -(erience)20 b(has)37 2271 y(sho)o(wn)13 b(that)g(the)g(dev)o(elopmen)o(t)h -(of)e(a)h(large)g(soft)o(w)o(are)f(program)g(do)q(es)h(not)g(pro)q(ceed)h(in) -g(a)f(purely)h(top)f(do)o(wn)37 2328 y(manner)f([38)o(,)g(89)o(].)18 b(Soft)o -(w)o(are)10 b(design)j(is)f(in)h(man)o(y)e(w)o(a)o(ys)f(an)i(informal)g(pro)q -(cess)g([63)o(].)19 b(Refactorings)11 b(supp)q(ort)37 2384 y(iterativ)o(e)21 b -(conceptual)g(shifts.)34 b(F)l(or)20 b(example,)h(the)g(refactoring)e(that)g -(de\014nes)i(an)f(abstract)f(sup)q(erclass)37 2441 y(generates)c(a)g(common)f -(design)i(abstraction)f(from)f(lo)o(w-lev)o(el)j(implemen)o(tation;)f(this)f -(design)h(abstraction)37 2497 y(can)i(then)g(b)q(e)g(used)g(for)f(further)g -(lo)o(w)g(lev)o(el)i(implemen)o(tation.)28 b(Refactorings)17 b(shield)i(the)f -(designer)g(from)37 2554 y(man)o(y)12 b(of)g(the)h(lo)o(w)o(est)f(lev)o(el)h -(implemen)o(tation)h(details)f(regarding)g(program)e(restructuring,)i(and)f -(can)h(mak)o(e)37 2610 y(it)23 b(easier)f(to)f(shift)h(b)q(et)o(w)o(een)g(hig\ -h)h(lev)o(el)g(design)g(and)f(implemen)o(tation.)40 b(F)l(urthermore,)23 b -(refactorings)941 2760 y(123)g eop bop 37 42 a fl(supp)q(ort)23 b(design)f -(without)g(requiring)h(the)g(designer)f(to)g(b)q(e)g(pro\014cien)o(t)h(in)g -(writing)f(abstract,)g(st)o(ylized)37 98 y(formal)15 b(sp)q(eci\014cations.) -108 154 y(One)22 b(imp)q(ortan)o(t)f(insigh)o(t)h(gained)h(from)d(researc)o -(h)i(in)o(to)f(program)f(transformations)g(is)i(that)f(while)37 211 y(man)o -(y)g(systems)g(started)g(out)g(with)h(the)f(goal)g(of)g(fully)i(automating)e -(the)g(transformation)f(pro)q(cess,)j(it)37 267 y(b)q(ecame)17 b(ob)o(vious)g -(that)e(in)i(handling)h(non-trivial)f(programs)e(a)h(transformation)f(system) -h(required)h(some)37 324 y(in)o(teraction)f(with)g(the)f(user.)20 b(A)15 b -(similar)i(insigh)o(t)f(has)f(b)q(een)h(gained)g(from)e(the)i(refactoring)e -(researc)o(h.)37 446 y fe(10.7.1)56 b(T)-5 b(ransforming)18 b(Blo)r(c)n(k)f -(Structured)h(Languages)37 531 y fl(Grisw)o(old)c([52)o(])f(in)o(v)o(estigate\ -d)h(meaning)g(preserving)h(transformations)d(to)h(restructure)g(programs)f -(written)37 588 y(in)17 b(a)f(blo)q(c)o(k-structured)h(programming)e(language\ -,)h(to)g(mak)o(e)f(main)o(taining)i(suc)o(h)g(programs)d(easier.)23 b(The)37 -644 y(language)18 b(analyzed)g(in)f(this)h(researc)o(h)f(w)o(as)f(Sc)o(heme.) -26 b(F)l(rom)16 b(the)h(program)f(source,)h(a)g(program)f(dep)q(en-)37 701 y -(dency)e(graph)e(is)h(created.)19 b(A)12 b(set)g(of)g(meaning)h(preserving)g -(graph)g(transformation)e(rules,)i(similar)h(to)d(lo)q(cal)37 757 y(compiler) -20 b(optimizations,)g(are)e(de\014ned)i(for)e(manipulating)i(statemen)o(ts)d -(within)j(a)e(blo)q(c)o(k.)31 b(These)19 b(rules)37 814 y(include,)f(for)c -(example:)106 907 y fj(\017)22 b fl(renaming)16 b(a)f(lo)q(cal)h(v)m(ariable) -106 1001 y fj(\017)22 b fl(adding)16 b(a)f(new)g(v)m(ariable)i(to)e(store)f -(an)h(in)o(termediate)h(result)106 1095 y fj(\017)22 b fl(replacing)17 b(an)f -(expression)h(with)g(an)f(equiv)m(alen)o(t)h(expression)g(\(suc)o(h)f(as)g -(a)f(v)m(ariable,)j(if)e(the)g(v)m(ariable)151 1151 y(has)d(previously)h(b)q -(een)g(assigned)g(the)f(v)m(alue)h(of)f(the)g(expression,)h(or)e(a)h(function) -h(call,)g(if)g(the)f(function)151 1208 y(b)q(o)q(dy)j(is)g(equiv)m(alen)o(t)h -(to)d(the)h(expression)i(it)e(replaces\))106 1302 y fj(\017)22 b fl(con)o(v)o -(erting)15 b(a)g(scaler)h(in)o(to)f(some)g(nested)g(structure)g(\(suc)o(h)h -(as)e(an)i(arra)o(y)e(or)g(record\),)106 1396 y fj(\017)22 b fl(mo)o(ving)15 b -(an)g(assignmen)o(t)g(in)o(to)h(and)f(out)g(of)g(a)f(conditional)j(blo)q(c)o -(k.)108 1489 y(Lik)o(e)11 b(the)f(refactoring)g(researc)o(h,)h(his)g(researc) -o(h)f(in)o(v)o(estigated)g(source)g(to)g(source)g(program)f(restructuring)37 -1546 y(to)20 b(aid)h(soft)o(w)o(are)d(main)o(tenance.)35 b(Ho)o(w)o(ev)o(er,) -20 b(his)h(w)o(ork)e([52)o(])h(fo)q(cused)h(on)f(transforming)f(the)h(syn)o -(tactic)37 1602 y(constructs)e(of)f(a)g(blo)q(c)o(k-structured)i(language;)g -(his)f(fo)q(cus)g(w)o(as)f(not)h(on)f(transformations)g(in)o(v)o(olving)h(in-) -37 1659 y(heritance)h(or)f(a)g(t)o(yp)q(e)g(hierarc)o(h)o(y)l(.)28 b(In)19 b -([52)o(])f(he)g(cites)h(our)e(refactoring)h(researc)o(h)g(and)g(discusses)h -(ho)o(w)f(his)37 1715 y(approac)o(h)j(migh)o(t)h(b)q(e)f(applied)j(for)c(ob)s -(ject-orien)o(ted)i(systems.)37 b(He)22 b(notes)f(sev)o(eral)g(complexities)i -(that)37 1772 y(inheritance)d(causes)e(in)h(program)e(analysis)h(and)g(transf\ -ormation;)g(these)g(complexities)h(are)f(dealt)g(with)37 1828 y(more)d(fully) -i(in)f(the)f(prior)g(c)o(hapters)g(of)g(this)h(\(refactoring\))e(thesis.)108 -1885 y(His)i(use)f(of)g(program)f(dep)q(endency)k(graphs)c(and)i(\015o)o(w)e -(la)o(ws)h(for)g(describing)i(source)e(to)g(source)g(trans-)37 1941 y(formati\ -ons)h(is)i(an)e(imp)q(ortan)o(t)g(con)o(tribution.)25 b(One)18 b(reason)e(wh) -o(y)h(he)g(c)o(ho)q(ose)f(Sc)o(heme)i(as)e(a)g(language)h(to)37 1997 y(analyz\ -e)e(w)o(as)d(b)q(ecause)j(a)e(to)q(ol)h(w)o(as)e(a)o(v)m(ailable)j(for)e(gene\ -rating)h(and)g(manipulating)h(program)d(dep)q(endency)37 2054 y(graphs.)24 b -(A)17 b(area)f(for)g(future)h(researc)o(h)f(w)o(ould)h(b)q(e)g(to)f(dev)o(elo\ -p)i(and)f(in)o(v)o(estigate)f(the)h(use)g(of)f(suc)o(h)h(a)f(to)q(ol)37 2110 y -(for)f(refactoring)g(ob)s(ject)f(orien)o(ted)i(programs.)37 2254 y fd(10.8)70 -b(Summary)37 2355 y fl(This)21 b(c)o(hapter)e(fo)q(cuses)h(on)f(sev)o(eral)h -(areas)f(of)g(researc)o(h)g(closely)i(related)f(to)f(refactoring.)32 b(These) -20 b(areas)37 2412 y(ha)o(v)o(e)c(included)i(supp)q(orting)e(go)q(o)q(d)g(ob) -s(ject-orien)o(ted)g(design)g(st)o(yle,)g(managing)f(the)h(ev)o(olution)h(of) -e(ob)s(ject-)37 2468 y(orien)o(ted)h(systems,)e(and)i(restructuring)f(applied) -i(to)e(areas)f(other)h(than)g(ob)s(ject-orien)o(ted)h(systems.)941 2760 y(124) -g eop bop 37 353 a fc(Chapter)35 b(11)37 560 y fb(Conclusions)37 801 y fd(11.\ -1)70 b(Summary)23 b(of)h(Con)n(tributions)37 903 y fl(This)12 b(thesis)f(de\ -\014nes)h(a)f(set)g(of)f(program)g(restructuring)h(op)q(erations)g(\(refactor\ -ings\))f(sp)q(eci\014c)i(to)f(supp)q(orting)37 959 y(the)21 b(design,)g(ev)o -(olution)g(and)f(reuse)h(of)e(ob)s(ject-orien)o(ted)h(application)i(framew)o -(orks.)33 b(It)20 b(mak)o(es)f(sev)o(eral)37 1016 y(imp)q(ortan)o(t)c(con)o -(tributions:)93 1104 y(1.)22 b(It)d(iden)o(ti\014es)i(a)e(set)f(of)h(program) -f(restructurings)h(\(refactorings\))f(that)g(p)q(eople)j(apply)e(to)g(ob)s -(ject-)151 1160 y(orien)o(ted)d(application)h(framew)o(orks.)93 1252 y(2.)22 b -(It)16 b(sho)o(ws)f(ho)o(w)g(to)f(automatically)i(supp)q(ort)g(refactorings)f -(in)h(a)g(w)o(a)o(y)e(that)h(preserv)o(es)g(the)h(b)q(eha)o(vior)151 1308 y -(of)e(a)f(program.)19 b(Most)13 b(of)g(the)h(refactorings)g(are)g(simple)h -(to)e(implemen)o(t)j(and)e(it)g(is)h(almost)e(trivial)i(to)151 1365 y(sho)o -(w)g(that)g(they)h(are)f(b)q(eha)o(vior)h(preserving.)21 b(A)16 b(small)g(set) -g(of)f(refactorings)g(are)g(m)o(uc)o(h)g(more)h(com-)151 1421 y(plicated.)21 b -(A)13 b(la)o(y)o(ered)h(hierarc)o(h)o(y)g(of)f(refactorings)g(w)o(as)g(de\014\ -ned)h(to)f(help)i(deal)f(with)g(the)g(complexit)o(y)151 1478 y(of)h(the)g(ref\ -actoring)g(pro)q(cess.)93 1570 y(3.)22 b(It)c(de\014nes)h(in)g(detail)g(three) -f(of)f(the)h(most)f(complex)i(refactorings:)25 b(generalizing)20 b(the)e(inhe\ -ritance)151 1626 y(hierarc)o(h)o(y)l(,)25 b(sp)q(ecializing)h(the)c(inheritan\ -ce)j(hierarc)o(h)o(y)e(and)g(using)g(aggregations)f(to)g(mo)q(del)h(the)151 -1682 y(relationships)d(among)e(classes.)30 b(It)18 b(decomp)q(oses)h(these)g -(op)q(erations)f(in)o(to)h(more)f(primitiv)o(e)h(parts,)151 1739 y(and)d(disc\ -usses)h(the)f(p)q(o)o(w)o(er)f(of)h(these)g(op)q(erations)g(from)f(the)h(p)q -(ersp)q(ectiv)o(es)h(of)f(automatabilit)o(y)f(and)151 1795 y(usefulness)i(in) -f(supp)q(orting)g(design.)93 1887 y(4.)22 b(It)15 b(de\014nes)h(design)f(cons\ -train)o(ts)g(needed)h(in)f(refactoring,)f(sp)q(eci\014cally)k(class)d(in)o -(v)m(arian)o(ts)g(and)g(exclu-)151 1943 y(siv)o(e)c(comp)q(onen)o(ts.)19 b -(These)11 b(constrain)o(ts)f(are)h(needed)h(to)e(ensure)h(b)q(eha)o(vior)g -(is)h(preserv)o(ed)f(across)f(some)151 2000 y(refactorings.)29 b(The)18 b(the\ -sis)h(discusses)h(ho)o(w)d(to)h(analyze)h(a)f(program)f(to)h(determine)h(if)g -(it)f(satis\014es)151 2056 y(these)e(constrain)o(ts,)e(and)h(ho)o(w)g(to)g -(use)g(this)h(design)g(information)f(to)g(refactor)f(a)h(program.)37 2199 y fd -(11.2)70 b(Limitations)21 b(of)i(Approac)n(h)37 2300 y fl(There)16 b(are)f -(sev)o(eral)g(limitations)i(of)d(this)i(approac)o(h:)93 2388 y(1.)22 b(It)13 b -(requires)g(b)q(eha)o(vior)g(preserv)m(ation)g(at)f(ev)o(ery)h(step.)19 b(The\ -re)13 b(are)f(cases)h(where)f(states)g(of)g(temp)q(orary)151 2445 y(inconsist\ -ency)h(migh)o(t)d(b)q(e)h(desirable,)i(for)d(example)i(when)f(replacing)h(one) -f(algorithm)g(with)g(another.)1894 2428 y fs(1)37 2522 y 750 2 v 89 2548 a fu -(1)107 2564 y fp(Refactorings)j(can,)g(ho)o(w)o(ev)o(er,)f(b)q(e)h(applied)h -(to)e(lo)q(calize)j(b)q(eha)o(vior)f(within)g(a)e(class)h(or)f(small)i(set)e -(of)g(classes)i(and)f(thereb)o(y)37 2610 y(b)q(etter)g(encapsulate)h(suc)o -(h)f(c)o(hanges.)941 2760 y fl(125)g eop bop 93 42 a fl(2.)22 b(The)c(descrip\ -tion)h(of)e(refactoring)g(in)h(this)g(thesis)g(is)g(limited)i(b)o(y)d(the)h -(features)f(in)h(the)g(underlying)151 98 y(programming)12 b(language)h(b)q -(eing)h(refactored.)k(The)13 b(strict)f(inheritance)j(relationship)f(among)e -(t)o(yp)q(es,)151 154 y(a)j(feature)f(of)h fi(C++,)f fl(limits)i(t)o(yp)q(e)f -(substitution,)g(generalizing)i(and)e(sp)q(ecializing.)23 b(Multiple)16 b(inh\ -er-)151 211 y(itance)j(is)g(not)f(incorp)q(orated)h(in)o(to)g(the)f(refactori\ -ng)g(approac)o(h)h(de\014ned)g(here,)h(nor)e(are)g(language)151 267 y(feature\ -s)d(suc)o(h)g(as)g(automatic)g(t)o(yp)q(e)g(con)o(v)o(ersion)h(\(casts)e(in)i -fi(C++)p fl(\).)93 361 y(3.)22 b(The)15 b(p)q(o)o(w)o(er)f(of)g(this)h(approa\ -c)o(h)f(is)h(also)g(limited)h(b)o(y)f(the)f(program)g(analysis)h(tec)o(hnique\ -s)h(used.)k(The)151 418 y(undecidabili)q(t)o(y)k(of)d(the)h(basic)g(problem)g -fi(r)n(e)n(quir)n(es)f fl(that)g(an)o(y)g(`solution')g(b)q(e)i(conserv)m(ativ) -o(e.)39 b(The)151 474 y(algorithms)21 b(presen)o(ted)g(in)h(this)f(thesis)g -(can)g(almost)f(certainly)i(b)q(e)g(impro)o(v)o(ed)f(up)q(on.)37 b(Ho)o(w)o -(ev)o(er,)151 531 y(an)21 b(impro)o(v)o(ed)f(solution)i(will)g(still)g(b)q -(e)f(conserv)m(ativ)o(e;)i(there)e(will)h(still)g(b)q(e)g(cases)e(in)h(whic)o -(h)h(v)m(alid)151 587 y(refactorings)15 b(will)i(b)q(e)f(disallo)o(w)o(ed.)93 -681 y(4.)22 b(The)11 b(practical)h(utilit)o(y)h(of)d(this)i(approac)o(h)e(is) -i(not)f(kno)o(wn.)18 b(A)11 b(v)m(aluable)i(con)o(tribution)f(could)g(b)q(e)f -(made)151 737 y(b)o(y)k(soft)o(w)o(are)f(engineering)j(studies)g(of)e(refacto\ -ring)g(large)g(programs)f(written)i(in)g(sev)o(eral)g(practical)151 794 y(\(a\ -lb)q(eit)22 b(complicated\))h(languages)e(with)h(sev)o(eral)f(di\013eren)o -(t)g(programming)g(st)o(yles.)38 b(Automated)151 850 y(refactoring)14 b(shoul\ -d)h(probably)g(b)q(e)f(most)g(v)m(aluable)i(when)e(applied)i(to)e(large)g(pro\ -grams,)f(but)h(global)151 907 y(program)g(analysis)i(ma)o(y)f(b)q(e)h(exp)q -(ensiv)o(e)g(when)g(applied)h(to)e(these)g(programs.)37 1050 y fd(11.3)70 b -(Implemen)n(tation)20 b(Considerations)37 1151 y fl(Exp)q(erimen)o(tal)14 b -(researc)o(h)e(is)h(needed,)h(studying)f(the)g(role)g(of)f(refactoring)g(in)h -(large,)f(m)o(ulti-p)q(erson)i(soft)o(w)o(are)37 1208 y(dev)o(elopmen)o(ts.) -20 b(Soft)o(w)o(are)12 b(pro)q(cess)i(studies)g(are)f(needed,)h(to)f(b)q(ette\ -r)g(understand)h(the)f(role)h(of)f(refactoring)37 1264 y(in)k(concept)e(proto\ -t)o(yping,)f(design)j(re\014nemen)o(t,)e(implemen)o(tation)h(and)g(main)o(ten\ -ance)g(tasks.)108 1321 y(This)e(section)g(discusses)h(some)f(of)f(the)h(issue\ -s)g(that)f(w)o(ould)h(arise)g(in)g(implemen)o(ting)i(a)d(practical)i(refac-) -37 1377 y(toring)i(system.)22 b(This)17 b(discussion)h(is)f(based)f(on)g(less\ -ons)h(learned)g(from)f(the)g(protot)o(yp)q(e)g(built)h(as)f(part)g(of)37 1434 -y(this)g(researc)o(h.)108 1490 y(A)h(practical)g(refactoring)f(system)g(w)o -(ould)h(ha)o(v)o(e)f(sev)o(eral)g(requiremen)o(ts.)25 b(Since)18 b(refactorin\ -gs)e(are)g fi(b)n(e-)37 1546 y(havior)e(pr)n(eserving)d fl(program)f(restruct\ -uring)i(op)q(erations,)g(a)g(practical)g(refactoring)g(system)f(m)o(ust)g(pro) -o(vide)37 1603 y(a)h(program)e(represen)o(tation)i(that)f(is)h(ric)o(h)g(enou\ -gh)g(to)f(supp)q(ort)h(precondition)h(c)o(hec)o(king)g(and)f(p)q(erform)f(con\ --)37 1659 y(sisten)o(t)18 b(up)q(dates.)28 b(This)19 b(c)o(hapter)e(discusses) -i(tec)o(hniques)h(for)d(parsing)h(a)f(program,)g(and)h(for)f(generating)37 -1716 y(and)j(main)o(taining)h(cross)e(reference)h(information.)33 b(T)l(o)19 b -(supp)q(ort)h(design)g(exploration,)h(a)e(system)g(m)o(ust)37 1772 y(also)c -(b)q(e)g(\015exible)i(and)e(fast.)k(Finally)l(,)d(for)e(a)g(refactoring)h(to) -q(ol)f(to)g(b)q(e)i(useful,)f(it)g(m)o(ust)f(in)o(tegrate)g(w)o(ell)i(with)37 -1829 y(the)g(organization)f(targeted)f(to)h(use)h(it.)37 1950 y fe(11.3.1)56 b -(Explicitly)15 b(Represen)n(ting)j(the)g(Structure)g(of)h(a)g(Program)37 2036 -y fl(A)13 b(textual)g(represen)o(tation)g(of)f(program)g(source)h(is)g(not)f -(ric)o(h)i(enough)f(to)f(supp)q(ort)h(refactoring.)18 b(Consider,)37 2093 y -(for)f(example,)h(the)g(refactoring)e(that)h(c)o(hanges)g(the)g(name)h(of)e -(a)h(mem)o(b)q(er)h(function,)g(de\014ned)h(in)f(c)o(hapter)37 2149 y(\014v)o -(e.)i(This)14 b(refactoring)f(c)o(hanges)h(not)f(only)h(the)g(function)g(de\ -\014nition)i(but)d(also)h(c)o(hanges)f(all)i(places)f(where)37 2206 y(the)f -(function)h(is)f(called.)21 b(Dep)q(ending)14 b(on)f(the)f(access)h(con)o(tro\ -l)f(mo)q(de)h(of)g(the)f(mem)o(b)q(er)h(function,)h(it)f(ma)o(y)f(b)q(e)37 -2262 y(referenced)g(in)g(its)f(con)o(taining)g(class,)h(its)f(sub)q(classes)h -(and)e(other)h(places)g(that)f(reference)i(an)e(instance)i(of)e(one)37 2319 y -(of)15 b(those)h(classes.)21 b(This)16 b(refactoring)f(m)o(ust)g(c)o(hange)g -(the)g(function)i(name)e(in)h(all)h(these)e(places.)22 b(Ho)o(w)o(ev)o(er,)37 -2375 y(there)17 b(are)f(cases)g(where)h(a)f(name)h(substitution)g(should)g -(not)f(b)q(e)h(made.)24 b(The)17 b(same)f(name)g(ma)o(y)g(b)q(e)h(used)37 2431 -y(elsewhere)g(in)e(the)g(program)f(to)h(refer)f(to)h(a)f(v)m(ariable)j(or)d -(p)q(ossibly)i(ev)o(en)g(to)e(a)h(class;)g(distinguishing)i(these)37 2488 y -(cases)f(requires)g(an)f(analysis)h(of)f(the)h(program)e(syn)o(tax.)19 b(Or,) -d(a)f(di\013eren)o(t)g(function)h(with)g(the)f(same)g(name)37 2544 y(ma)o(y)h -(b)q(e)h(de\014ned)g(in)g(another,)f(unrelated)h(class;)f(distinguishing)j -(this)e(case)f(requires)h(t)o(yp)q(e)f(information.)37 2601 y(A)g(simple)g -(textual)g(scan)f(and)g(replacemen)o(t)h(approac)o(h)f(cannot)g(mak)o(e)g(the\ -se)g(distinctions.)941 2760 y(126)g eop bop 108 42 a fl(Rather,)11 b(a)g(prog\ -ram)e(represen)o(tation)i(is)g(needed)h(for)e(refactoring)g(that)g(mak)o(es)g -(structural)g(information)37 98 y(explicit,)21 b(and)d(that)g(supp)q(orts)g -(automated)f(analysis,)i(b)q(etter)f(than)g(program)f(source.)29 b(This)19 b -(structural)37 154 y(information)13 b(is)g(needed)h(not)e(only)h(to)e(execute) -i(a)f(refactoring,)h(but)f(also)g(to)g(c)o(hec)o(k)h(the)f(preconditions)i -(that)37 211 y(determine)g(if)e(the)g(refactoring)g(is)h(v)m(alid.)20 b(F)l -(or)12 b(example,)h(precondition)h(c)o(hec)o(king)f(for)e(the)h(refactoring)g -(that)37 267 y(c)o(hanges)h(the)g(name)f(of)g(a)g(mem)o(b)q(er)h(function)g -(in)o(v)o(olv)o(es)g(collecting)h(the)f(sets)f(of)g(mem)o(b)q(er)h(functions) -g(de\014ned)37 324 y(on)j(a)f(class)g(and)g(its)h(sup)q(erclasses.)21 b(This) -16 b(requires)g(syn)o(tax)e(analysis)i(and)f(t)o(yp)q(e)h(information.)108 380 -y(An)e(abstract)e(syn)o(tax)h(tree,)g(annotated)g(with)h(t)o(yp)q(e)f(and)h -(reference)g(information,)f(is)h(a)f(represen)o(tation)37 437 y(can)j(b)q(e)g -(used)f(to)g(refactor)f(programs.)37 558 y fe(11.3.2)56 b(Soft)n(w)n(are)20 b -(Refactoring)d(Pro)r(cess)37 644 y fl(Curren)o(t)g(programming)f(practice)h -(usually)h(in)o(v)o(olv)o(es)g(main)o(taining)g(and)e(up)q(dating)i(programs) -e(in)h(source)37 701 y(co)q(de)f(form.)j(In)c(order)g(to)f(in)o(tegrate)g(ref\ -actoring)h(in)o(to)f(suc)o(h)h(en)o(vironmen)o(ts,)g(program)f(source)h(m)o -(ust)f(\014rst)37 757 y(b)q(e)22 b(con)o(v)o(erted)f(to)f(an)h(abstract)f(syn) -o(tax)g(tree)h(represen)o(tation)g(b)q(efore)g(refactoring,)g(and)h(the)f(up) -q(dated)37 814 y(program)15 b(source)g(m)o(ust)f(b)q(e)i(regenerated)f(from)g -(the)g(represen)o(tation)g(after)g(refactoring.)k(Figure)c(11.1)f(\(at)37 870 -y(end)21 b(of)e(c)o(hapter\))g(sho)o(ws)f(the)i(stages)f(in)h(the)f(refactori\ -ng)g(pro)q(cess.)33 b(Within)21 b(a)e(refactoring)g(system,)h(a)37 927 y(pars\ -er)d(creates)f(a)g(syn)o(tax)f(tree)i(represen)o(tation)f(of)g(the)g(program) -g(source.)23 b(The)17 b(parse)f(trees)g(are)g(passed)37 983 y(to)f(the)g(refa\ -ctorer,)f(whic)o(h)i(\014rst)e(analyzes)i(the)f(trees)g(and)g(adds)h(t)o(yp)q -(e)f(and)g(cross-reference)h(information.)37 1039 y(Then)d(the)e(refactorer)g -(manipulates)i(the)e(represen)o(tation)h(based)g(on)g(commands)f(from)g(the)h -(user)f(\(a)g(h)o(uman)37 1096 y(doing)16 b(design)f(or)f(p)q(ossibly)i(a)e -(higher)i(lev)o(el)g(program\).)i(Finally)l(,)e(a)e(prett)o(y)g(prin)o(ter)h -(is)g(called)h(to)e(prin)o(t)g(the)37 1152 y(refactored)h(co)q(de.)108 1209 y -(The)h(approac)o(h)e(that)h(w)o(e)g(used)h(to)e(build)k(the)d(protot)o(yp)q -(e)f(w)o(as)h(to)g(write)g(a)g(simple)i(parser)d(from)h(C++)37 1265 y(in)o -(to)k(Lisp)h(forms)d(using)i(a)f(Y)l(A)o(CC-compatible)i(sp)q(eci\014cation)g -(of)e(C++)h(dev)o(elop)q(ed)h(b)o(y)f(Roskind)g([100)o(].)37 1322 y(A)k(Commo\ -n)f(Lisp)i([62)o(])e(program,)i(making)e(extensiv)o(e)i(use)f(of)f(the)h(Comm\ -on)f(Lisp)i(Ob)s(ject)f(System)37 1378 y(\(CLOS\))g(facilities,)i(used)d(the) -h(output)e(of)h(the)g(parser)f(to)h(build)i(a)d(complex)i(structure)f(represe\ -n)o(ting)37 1435 y(the)h(program.)39 b(Eac)o(h)22 b(program)f(part)h(w)o(as)f -(represen)o(ted)h(as)g(an)g(aggregation,)g(where)h(the)f(aggregate)37 1491 y -(ob)s(ject)c(corresp)q(onded)h(to)e(the)i(ro)q(ot)e(no)q(de)i(of)e(the)h(pars\ -e)g(tree)g(and)h(the)f(c)o(hild)h(no)q(des)g(w)o(ere)f(represen)o(ted)37 1548 -y(as)d(comp)q(onen)o(ts.)k(Man)o(y)14 b(comp)q(onen)o(ts)h(w)o(ere)f(themselv) -o(es)h(the)f(ro)q(ot)g(of)g(a)g(sub-tree,)h(whose)f(c)o(hildren)j(w)o(ere)37 -1604 y(represen)o(ted)h(\(recursiv)o(ely\))f(as)f(comp)q(onen)o(ts.)25 b(Eac) -o(h)16 b(no)q(de)h(in)h(the)f(tree)f(w)o(as)g(an)h(instance)g(of)f(one)h(of)f -(the)37 1660 y(\(CLOS\))f(classes)g(de\014ned)h(in)f(the)g(refactorer)e(corre\ -sp)q(onding)j(to)e(the)g(signi\014can)o(t)i(non-terminals)f(de\014ned)37 1717 -y(in)h(the)e(grammar.)k(The)d(refactorings)f(w)o(ere)g(implemen)o(ted)i(as)f -(Common)e(Lisp)j(functions.)k(A)15 b(crude)g(co)q(de)37 1773 y(regenerator,)g -(used)h(mostly)g(for)f(debugging,)h(w)o(as)f(implemen)o(ted)i(as)e(a)h(CLOS)g -(generic)h(output)e(function,)37 1830 y(distributed)i(among)e(the)g(classes.) -108 1886 y(Using)h(an)f(ob)s(ject-orien)o(ted)g(approac)o(h)f(to)g(represen)o -(t)h(the)g(parse)g(tree)g(as)g(an)g(aggregate)e(ob)s(ject)h(made)37 1943 y -(the)i(factoring)g(of)f(some)g(functions)i(easy)l(.)22 b(Man)o(y)15 b(of)g -(the)h(op)q(erations)g(on)f(for)g(example)i(a)f(class)g(de\014nition)37 1999 y -(in)o(v)o(olv)o(e)g(tra)o(v)o(ersing)f(the)g(en)o(tire)h(tree)f(represen)o -(ting)h(the)f(class,)g(but)g(only)h(a)f(few)g(no)q(des)h(w)o(ere)f(mo)q(di\ -\014ed)i(in)37 2056 y(the)h(pro)q(cess.)28 b(These)18 b(op)q(erations)g(w)o -(ere)f(de\014ned)i(as)f(CLOS)g(generic)h(functions,)g(de\014ned)g(on)e(all)i -(classes)37 2112 y(represen)o(ting)f(no)q(des)g(in)g(the)f(tree.)25 b(F)l(or) -16 b(most)g(classes,)i(these)f(functions)h(just)f(consisted)g(of)g(calls)h -(to)e(the)37 2169 y(corresp)q(onding)22 b(functions)f(in)h(the)e(comp)q(onen) -o(ts;)j(the)e(in)o(teresting)g(mo)q(di\014cations)h(w)o(ere)e(encapsulated)37 -2225 y(within)d(the)e(classes)h(of)f(the)g(no)q(des)h(b)q(eing)g(c)o(hanged.) -37 2347 y fe(11.3.3)56 b(Generating)17 b(and)j(Main)n(taining)e(Cross)i(Refer\ -ences)37 2432 y fl(Refactoring)14 b(one)f(part)f(of)g(a)h(program)e(often)i -(requires)h(c)o(hanging)f(other)f(parts)g(of)h(the)g(program)e(that)i(refer) -37 2489 y(to)e(it.)19 b(It)12 b(is)g(sometimes)f(necessary)h(\(esp)q(ecially) -i(during)e(precondition)h(c)o(hec)o(king\))f(to)f(\014nd)h(all)h(references)f -(to)37 2545 y(a)j(v)m(ariable,)h(function)f(or)f(class)h(b)q(eing)h(c)o(hange\ -d.)k(A)15 b(refactoring)f(system)g(m)o(ust)g(detect)h(these)g(\\bac)o(kw)o -(ard)37 2602 y(references")j(\(that)e(is,)h(references)h fi(to)f fl(the)g(v)m -(ariable,)i(function)f(or)e(class\),)h(and)h(consisten)o(tly)f(c)o(hange)g -(the)941 2760 y(127)g eop bop 37 42 a fl(program.)35 b(If,)21 b(for)f(example\ -,)i(the)f(refactoring)f(that)f(mo)o(v)o(es)h(a)g(v)m(ariable)i(from)d(an)i -(aggregate)d(class)j(to)37 98 y(the)h(class)g(of)f(one)h(of)f(its)h(comp)q -(onen)o(ts.)39 b(The)22 b(refactoring)g(in)o(v)o(olv)o(es)g(adding)g(a)f(new) -h(v)m(ariable)h(to)e(the)37 154 y(comp)q(onen)o(t)c(class,)g(deleting)i(it)d -(from)g(the)h(aggregate)e(class)i(and)g(c)o(hanging)g(references)h(to)e(the)g -(v)m(ariable.)37 211 y(When)e(refactoring)f(is)h(\014nished,)h(it)e(is)h(esse\ -n)o(tial)g(that)f(no)g(references)h(to)f(the)g(old,)h(deleted)g(v)m(ariable)h -(b)q(e)f(left)37 267 y(dangling)j(in)f(the)f(system.)108 324 y(References)23 b -(made)e fi(by)g fl(a)g(v)m(ariable,)i(function)g(or)d(class)i(are)f(most)f -(naturally)i(resolv)o(ed)f(when)h(that)37 380 y(ob)s(ject)14 b(is)g(loaded;)h -(ho)o(w)o(ev)o(er,)e(there)h(are)g(sev)o(eral)g(approac)o(hes)g(for)g(handlin\ -g)h(references)g fi(to)f fl(these)h(parts)e(of)37 437 y(a)i(program.)108 493 y -(A)o(t)23 b(one)h(extreme,)i(this)e(cross)f(reference)h(information)g(can)g -(b)q(e)h(precomputed)f(and)g(stored)f(in)i(a)37 550 y(database,)c(whic)o(h)g -(is)g(up)q(dated)g(as)e(the)i(program)e(structure)h(c)o(hanges.)34 b(A)o(t)20 -b(the)g(other)g(extreme,)h(cross)37 606 y(reference)16 b(information)g(can)f -(b)q(e)h(generated)f(as)g(needed)h(b)o(y)g(tra)o(v)o(ersing)e(the)h(program)f -(structure.)108 663 y(Precomputing)j(the)f(cross)f(reference)i(information)g -(has)e(the)i(adv)m(an)o(tage)e(of)h(making)g(cross)g(reference)37 719 y(lo)q -(okup)22 b(\(queries\))f(easy)l(,)h(but)e(making)h(up)q(dates)g(to)f(this)h -(cross)g(reference)g(information)g(can)g(b)q(e)g(hard.)37 775 y(Sev)o(eral)c -(to)q(ols)f(ha)o(v)o(e)f(b)q(een)i(dev)o(elop)q(ed)h(to)d(create)h(these)g -(tables)g(from)f(C++)i(source)f(co)q(de)g([50)o(,)g(81)o(];)g(to)q(ols)37 832 -y(ha)o(v)o(e)k(also)f(b)q(een)i(dev)o(elop)q(ed)g(for)e(other)g(ob)s(ject)g -(orien)o(ted)g(languages.)33 b(Ho)o(w)o(ev)o(er,)19 b(refactorings)g(c)o(hang\ -e)37 888 y(program)g(structure,)i(and)f(almost)f(ev)o(ery)h(refactoring)f(req\ -uires)i(the)f(cross)g(reference)g(database)g(to)f(b)q(e)37 945 y(up)q(dated.) -i(These)16 b(database)e(c)o(hanges)i(can)f(b)q(e)h(costly)f(and)g(complex.) -108 1001 y(A)o(t)c(the)g(other)f(extreme,)i(generating)f(the)g(cross)f(refere\ -nce)i(information)f(as)g(needed)h(from)e(the)i(program)37 1058 y(structure)i -(has)g(the)g(adv)m(an)o(tage)f(that)h(the)g(resulting)h(cross)e(reference)i -(information)f(is)g(alw)o(a)o(ys)f(up)i(to)e(date.)37 1114 y(When)h(a)f(progr\ -am)f(is)h(refactored,)g(there)g(is)h(no)f(need)h(to)e(also)h(up)q(date)h(a)f -(separate)f(structure)h(that)g(records)37 1171 y(cross-reference)g(informatio\ -n.)19 b(Ho)o(w)o(ev)o(er,)11 b(tree)h(tra)o(v)o(ersals)e(can)i(b)q(e)h(costly) -f(for)f(large)h(programs,)f(and)h(since)37 1227 y(cross)i(reference)g(informa\ -tion)g(is)g(needed)h(at)e(sev)o(eral)g(p)q(oin)o(ts)h(in)h(most)e(refactoring\ -s,)g(for)g(a)g(large)h(program)37 1284 y(this)i(approac)o(h)f(is)h(probably)f -(unacceptably)i(slo)o(w.)108 1340 y(Approac)o(hes)22 b(corresp)q(onding)h(to) -f(these)g(t)o(w)o(o)f(extremes)h(w)o(ere)g(tried)g(in)h(this)g(researc)o(h.) -40 b(The)23 b(\014rst)37 1396 y(approac)o(h)c(made)h(extensiv)o(e)g(use)f(of) -g(a)g(cross)g(reference)h(database.)31 b(When)20 b(the)f(program)f(w)o(as)g -(read)i(in)37 1453 y(to)f(the)g(refactorer,)g(sev)o(eral)h(tables)f(of)g(sema\ -n)o(tic)h(information)f(w)o(ere)g(generated)g(and)h(stored)e(within)j(a)37 -1509 y(sp)q(ecial)f(ob)s(ject)d(called)i(the)f fi(glob)n(al)g(information)g -(manager)p fl(.)27 b(During)18 b(refactoring,)g(when)g(the)g(structure)37 1566 -y(of)f(the)h(program)e(w)o(as)h(constan)o(tly)g(c)o(hanging,)h(it)f(w)o(as)g -(di\016cult)i(to)e(main)o(tain)g(consistency)i(b)q(et)o(w)o(een)e(the)37 1622 -y(tables)f(and)f(the)h(implemen)o(tation.)108 1679 y(Then,)e(a)e(second)i(app\ -roac)o(h)e(w)o(as)h(tried,)g(where)g(this)h(information)f(w)o(as)f(generated) -h(dynamically)l(.)21 b(The)37 1735 y(only)16 b(reference)f(information)g(stor\ -ed)f(within)i(the)f(global)h(information)e(manager)g(w)o(as)g(the)h(list)h -(of)e(classes)37 1792 y(and)g(global)h(declarations)f(\(functions)h(and)f(en) -o(umerated)f(t)o(yp)q(es\).)19 b(Later,)14 b(when)g(a)g(refactoring)f(needed) -i(to)37 1848 y(kno)o(w)c(for)g(example)h(all)h(references)f(to)e(a)h(mem)o -(b)q(er)h(v)m(ariable,)h(the)e(global)h(information)g(manager)e(generated)37 -1905 y(the)15 b(set)e(b)o(y)h(tra)o(v)o(ersing)g(the)g(relev)m(an)o(t)g(parse) -g(trees.)20 b(Compared)13 b(to)h(the)g(earlier)h(approac)o(h,)e(this)i(approa\ -c)o(h)37 1961 y(to)20 b(handling)i(cross)e(reference)h(information)f(w)o(as)f -(simpler)j(to)d(implemen)o(t)j(and)e(debug;)j(w)o(orking)d(with)37 2017 y(sma\ -ll)c(examples)g(there)g(w)o(ere)f(no)g(noticeable)h(p)q(erformance)g(p)q(enal\ -ties.)108 2074 y(A)c(practical)g(refactoring)f(system)g(w)o(ould)h(need)h(a)e -(metho)q(d)h(for)f(handling)i(cross)e(reference)h(information)37 2130 y(that) -18 b(falls)g(somewhere)g(b)q(et)o(w)o(een)g(these)g(t)o(w)o(o)f(extremes.)27 b -(The)18 b(cost)f(of)h(rep)q(eated)g(tree)g(tra)o(v)o(ersals)e(could)37 2187 y -(b)q(e)f(prohibitiv)o(e)h(if)e(the)g(program)f(b)q(eing)j(refactored)d(is)i -(large)f(\(eg:)k(a)c(million)i(lines)g(of)e(co)q(de\).)19 b(One)c(w)o(a)o(y)e -(to)37 2243 y(reduce)i(the)e(n)o(um)o(b)q(er)h(of)f(tree)h(tra)o(v)o(ersals)e -(needed)j(w)o(ould)f(b)q(e)g(to)f(\\cac)o(he")g(within)i(a)e(referenced)h(ob) -s(ject)f(the)37 2300 y(set)j(of)f(ob)s(jects)g(\(represen)o(ting)h(parts)f -(of)g(the)h(program\))e(that)h(migh)o(t)h(refer)f(to)g(it,)h(as)f(this)h(info\ -rmation)g(is)37 2356 y(often)g(needed)i(during)f(refactoring.)23 b(The)16 b -(cac)o(he)h(of)f(bac)o(kw)o(ard)f(references)i(to,)f(for)f(example,)i(a)f(v)m -(ariable)37 2413 y(could)i(b)q(e)g(implemen)o(ted)h(as)d(\(p)q(oin)o(ters)h -(to\))f(the)h(set)g(of)f(functions)i(that)e fi(might)h fl(reference)h(the)f -(v)m(ariable.)1892 2396 y fs(2)37 2496 y 750 2 v 89 2523 a fu(2)107 2539 y fp -(The)e(cac)o(he)i(could,)h(alternativ)o(ely)m(,)h(b)q(e)d(engineered)i(to)e -(con)o(tain)h(p)q(oin)o(ters)g(to)f(the)g(classes)h(or)f(expressions)i(that)e -(migh)o(t)37 2585 y(reference)e(the)f(v)n(ariable.)941 2760 y fl(128)g eop bop -37 42 a fl(The)13 b(cac)o(he)f(w)o(ould)h(con)o(tain)f(a)g fi(sup)n(erset)g fl -(of)g(all)h(true)f(bac)o(kp)q(oin)o(ters;)h(in)g(other)f(w)o(ords,)f(it)i(w)o -(ould)f(p)q(oin)o(t)h(to)f(all)37 98 y(the)j(functions)h(that)e(reference)i -(the)f(v)m(ariable,)g(plus)h(p)q(ossibly)h(some)d(functions)i(that)e(no)h(lon\ -ger)g(reference)37 154 y(the)20 b(v)m(ariable.)33 b(Since)20 b(the)f(set)g -(of)g(bac)o(kp)q(oin)o(ters)g(is)h(a)f(sup)q(erset)g(of)g(the)g(set)g(of)f -(true)h(bac)o(kp)q(oin)o(ters,)h(the)37 211 y(cac)o(he)c(only)g(needs)g(to)e -(b)q(e)i(up)q(dated)g(when)g(references)f(to)g(the)g(v)m(ariable)i(are)e fi -(adde)n(d)g fl(to)g(the)g(program)f(\(not)37 267 y(when)k(they)g(are)f(delete\ -d\).)28 b(The)17 b(cac)o(he)h(could)h(b)q(e)f(cleaned)h(up)e(when)h(an)g(atte\ -mpt)e(is)i(made)g(to)e(\014nd)j(all)37 324 y(references)e(to)e(the)g(v)m(aria\ -ble;)i(p)q(oin)o(ters)f(to)f(functions)i(that)d(no)i(longer)g(reference)g(the) -g(v)m(ariable)h(w)o(ould)f(b)q(e)37 380 y(remo)o(v)o(ed)f(from)g(the)g(cac)o -(he.)108 437 y(Clearly)l(,)j(for)d(large)i(programs)e(the)i(represen)o(tation\ -\(s\))f(used)h(will)h(in\015uence)h(ho)o(w)d(exp)q(ensiv)o(e)i(it)f(is)g(to) -37 493 y(refactor)d(the)g(program.)k(One)d(w)o(a)o(y)e(to)g(ac)o(hiev)o(e)i -(some)f(e\016ciencies)i(in)f(main)o(taining)g(consistency)g(b)q(et)o(w)o(een) -37 550 y(m)o(ultiple)21 b(program)c(represen)o(tations)h(is)h(describ)q(ed)i -(b)o(y)d(Grisw)o(old)h([52)o(].)29 b(His)19 b(restructuring)g(of)f(Sc)o(heme) -37 606 y(programs)12 b(used)i(an)e(abstract)g(syn)o(tax)g(tree)h(\(AST\))f -(represen)o(tation,)h(and)g(a)g(program)f(dep)q(endency)j(graph)37 663 y(\(PD\ -G\))e(whic)o(h)i(recorded)g(data)e(\015o)o(w)h(and)g(con)o(trol)g(\015o)o(w)g -(dep)q(endencies.)22 b(PDG)14 b(up)q(dates)g(w)o(ere)g(exp)q(ensiv)o(e.)37 719 -y(The)i(AST)g(announced)h(three)f(ev)o(en)o(ts)f(as)g(the)h(program)f(w)o(as) -f(restructured:)21 b(insert,)16 b(delete)h(and)f(c)o(hange.)37 775 y(The)22 b -(`AST-PDG)e(consistency')i(comp)q(onen)o(t)f(receiv)o(ed)h(these)f(ev)o(en)o -(ts,)h(and)f(determined)i(the)e(up)q(dates)37 832 y(needed)15 b(to)e(the)h -(PDG.)e(A)i(`lazy)f(consistency')h(strategy)f(w)o(as)f(applied,)k(where)d(up) -q(dates)h(to)f(the)h(PDG)f(w)o(ere)37 888 y(cac)o(hed)j(and)f(not)g(actually) -h(applied)h(to)d(the)h(PDG)f(un)o(til)j(after)d(a)h(transformation)e(w)o(as)i -(completed)h(and)f(a)37 945 y(new)h(transformation)d(w)o(as)h(ab)q(out)g(to)h -(b)q(egin.)21 b(Suc)o(h)15 b(tec)o(hniques)h(ma)o(y)e(apply)i(for)e(a)g(pract\ -ical)i(refactoring)37 1001 y(system.)37 1123 y fe(11.3.4)56 b(Supp)r(orting) -18 b(Design)g(Exploration)37 1209 y fl(As)g(noted)g(at)f(the)g(start)g(of)g -(this)h(thesis,)g(design)h(is)f(hard.)27 b(Designing)19 b(reusable)f(soft)o -(w)o(are)e(in)o(v)o(olv)o(es)i(cre-)37 1265 y(ativit)o(y)d(and)g(exploring)h -(design)f(alternativ)o(es.)20 b(Sp)q(eed)c(and)e(clarit)o(y)h(of)f(the)h(user) -g(in)o(terface)g(are)f(imp)q(ortan)o(t)37 1322 y(in)k(a)e(refactoring)f(to)q -(ol)i(that)e(supp)q(orts)i(design)g(exploration.)23 b(A)17 b(refactoring)f -(to)q(ol)g(that)f(is)i(to)q(o)f(slo)o(w)g(will)37 1378 y(\\get)i(in)h(the)g -(w)o(a)o(y")e(and)h(discourage)h(trying)f(out)g(alternativ)o(e)h(designs.)30 b -(Ideally)l(,)21 b(a)d(refactoring)f(should)37 1435 y(execute)i(instan)o(taneo\ -usly)l(.)28 b(Also,)18 b(since)h(a)f(ma)s(jor)e(purp)q(ose)i(of)f(refactoring) -h(is)g(to)f(mak)o(e)g(the)h(design)h(on)37 1491 y(the)14 b(system)f(clearer,) -h(and)g(since)h(clarit)o(y)e(is)h(in)h(part)e(sub)s(jectiv)o(e,)h(it)f(is)h -(imp)q(ortan)o(t)f(that)g(a)g(refactoring)g(to)q(ol)37 1548 y(mak)o(e)19 b -(clear)g(to)f(the)g(user)h(the)g(e\013ects)f(of)h(an)f(op)q(eration.)31 b(Sin\ -ce)20 b(alternativ)o(es)e(are)h(sometime)f(explored)37 1604 y(and)f(then)g -(discarded,)g(it)f(is)h(also)f(useful)i(to)d(pro)o(vide)i(a)f(mec)o(hanism)h -(that)f(is)g(\015exible)j(and)d(can)h(undo)f(the)37 1660 y(e\013ects)f(of)g -(a)g(refactoring.)108 1717 y(Refactoring)k(a)e(large)i(program)e(could)i(b)q -(e)g(v)o(ery)f(slo)o(w)g(if)g(it)h(required)g(rep)q(eatedly)h(generating)e -(cross)37 1773 y(reference)f(information)e(that)g(in)o(v)o(olv)o(ed)h(exhaust\ -iv)o(e)g(tree)f(tra)o(v)o(ersals.)20 b(As)15 b(noted)g(ab)q(o)o(v)o(e,)g(ther\ -e)g(are)h(w)o(a)o(ys)37 1830 y(that)k(a)g(system)g(could)h(b)q(e)g(engineered) -h(to)e(reduce)h(the)f(cost)g(of)g(these)g(queries.)36 b(F)l(ortunately)l(,)21 -b(due)g(to)37 1886 y(tec)o(hnology)13 b(adv)m(ances,)h(issues)g(of)e(pro)q -(cessing)i(sp)q(eed)f(and)g(memory)g(size)g(are)g(b)q(ecoming)h(less)f(of)f -(a)h(concern)37 1943 y(than)h(in)h(the)f(past.)19 b(P)o(erformance)13 b(issue\ -s)i(will)h(b)q(e)f(b)q(etter)f(understo)q(o)q(d)g(as)g(practical)g(refactorin\ -g)g(systems)37 1999 y(are)h(implemen)o(ted)i(and)f(used.)108 2056 y(Clarit)o -(y)k(in)g(the)g(user)f(in)o(terface)h(is)g(imp)q(ortan)o(t)f(b)q(ecause,)i -(as)f(discussed)h(earlier,)g(man)o(y)e(refactoring)37 2112 y(tasks)13 b(\(esp) -q(ecially)j(the)e(more)f(complex)h(refactorings\))f(require)h(some)f(user)h -(in)o(teraction)g(for)f(the)g(results)h(to)37 2169 y(b)q(e)g(useful.)20 b(Rak) -13 b([93])f(describ)q(es)j(an)e(in)o(terface)g(for)f(refactoring)h(Smalltalk) -h(metho)q(ds)f(and)g(migrating)g(co)q(de)37 2225 y(to)i(a)g(common)g(sup)q -(erclass;)h(his)g(approac)o(h)e(is)i(describ)q(ed)h(and)e(extended)i(in)f(c)o -(hapter)f(six.)20 b(User)15 b(in)o(terface)37 2281 y(issues)i(regarding)e(ref\ -actoring)g(pro)q(cess)g(is)h(an)f(area)f(for)h(future)g(researc)o(h.)108 2338 -y(Sev)o(eral)k(approac)o(hes)f(can)h(b)q(e)g(applied)h(to)e(\\undo")g(the)g -(e\013ects)g(of)g(a)h(refactoring.)29 b(Chec)o(kp)q(oin)o(ting,)37 2394 y(log\ -ging)17 b(and)g(traditional)h(c)o(hange)e(managemen)o(t)g(tec)o(hniques)i(can) -f(b)q(e)g(applied)h(to)e(roll)i(bac)o(k)e(the)h(e\013ects)37 2451 y(of)h(c)o -(hanges.)28 b(In)19 b(some)e(cases)h(a)g(refactoring)f(\(or)g(short)h(sequenc\ -e)h(of)e(refactorings\))h(can)g(b)q(e)g(applied)i(to)37 2507 y(undo)c(the)f -(e\013ects)g(of)g(an)g(immediately)i(prior)e(refactoring.)941 2760 y(129)g eop -bop 108 42 a fl(In)20 b(summary)l(,)f(a)g(practical)g(refactoring)g(system)g -(that)f(supp)q(orts)h(design)h(exploration)g(needs)f(to)g(b)q(e)37 98 y(fast,) -c(clear)g(and)h(\015exible.)37 220 y fe(11.3.5)56 b(Other)18 b(considerations) -37 305 y fl(The)i(v)m(alue)g(of)e(a)h(refactoring)f(to)q(ol)h(to)f(an)h(organ\ -ization)g(will)h(b)q(e)g(measured)f(b)o(y)g(ho)o(w)f(w)o(ell)i(it)f(can)g(hel\ -p)37 362 y(that)c(organization)f(dev)o(elop)i(soft)o(w)o(are)d(in)j(the)f(rel\ -ev)m(an)o(t)g(application)i(domains.)j(While)c(the)f(refactorings)37 418 y -(describ)q(ed)f(in)e(this)g(thesis)g(are)f(domain)h(indep)q(enden)o(t,)i(the) -e(c)o(hoice)g(of)f(refactorings)g(to)g(apply)i(to)d(a)i(program)37 475 y(will) -22 b(b)q(e)e(motiv)m(ated)g(b)o(y)g(the)g(user's)f(understanding)i(of)e(the)h -(domain)g(and)g(the)g(state)f(of)g(the)h(program.)37 531 y(There)j(are)e(sev) -o(eral)h(implications)i(that)d(an)h(application)h(domain)f(can)g(ha)o(v)o(e)f -(on)h(refactoring.)39 b(If)22 b(the)37 588 y(application)15 b(has)d(a)g(w)o -(ell)i(de\014ned)f(v)o(o)q(cabulary)g(of)f(synon)o(yms,)h(this)f(can)h(mak)o -(e)f(similarit)o(y)i(detection)f(easier)37 644 y(when)k(creating)e(a)h(common) -f(sup)q(erclass.)22 b(On)16 b(the)g(other)f(hand,)h(naming)f(con)o(v)o(en)o -(tions)h(ma)o(y)f(restrict)g(the)37 701 y(allo)o(w)o(able)c(renamings.)19 b -(Higher)11 b(lev)o(el)g(refactorings)f(ma)o(y)f(b)q(e)i(de\014nable)h(that)e -(incorp)q(orate)g(domain)h(sp)q(eci\014c)37 757 y(concepts.)21 b(This)16 b -(implies)h(that)d(a)h(refactoring)g(system)g(should)h(b)q(e)g(extensible.)108 -814 y(As)11 b(with)h(an)o(y)f(soft)o(w)o(are)f(dev)o(elopmen)o(t)i(to)q(ol,)f -(it)h(m)o(ust)f(in)o(tegrate)g(w)o(ell)h(with)g(the)f(soft)o(w)o(are)f(dev)o -(elopmen)o(t)37 870 y(pro)q(cess)18 b(of)e(the)i(organization)f(that)f(is)i -(targeted)e(to)g(use)i(it.)26 b(The)17 b(set)g(of)f(refactorings)h(ma)o(y)f -(need)i(to)f(b)q(e)37 927 y(extended)i(to)e(handle)i(programming)e(st)o(yles) -h(that,)g(while)h(un)o(usual)g(or)e(non-standard,)h(are)f(nonetheless)37 983 y -(used)g(in)g(the)f(organization.)22 b(A)16 b(refactoring)g(to)q(ol)g(m)o(ust) -f(in)o(tegrate)g(w)o(ell)i(with)g(other)e(to)q(ols)h(that)f(supp)q(ort)37 1039 -y(c)o(hange)h(managemen)o(t)e(and)i(other)e(soft)o(w)o(are)g(dev)o(elopmen)o -(t)i(tasks)e(in)i(an)f(organization)g([31,)f(85].)108 1096 y(Large)j(soft)o -(w)o(are)f(organizations)h(are)g(often)g(resistan)o(t)f(to)h(c)o(hange;)h(c)o -(hanging)g(the)f(names,)g(b)q(eha)o(vior,)37 1152 y(in)o(terrelationships)g -(and)e(resp)q(onsibiliti)q(es)j(of)c(ob)s(jects)g(can)h(ha)o(v)o(e)g(p)q(olit\ -ical)i(as)e(w)o(ell)h(as)e(tec)o(hnical)i(implica-)37 1209 y(tions.)21 b(Refa\ -ctorings)15 b(need)h(to)f(b)q(e)g(pruden)o(tly)i(applied)g(in)f(these)f(cases\ -.)37 1330 y fe(11.3.6)56 b(Some)17 b(Promising)g(Approac)n(hes)37 1416 y fl -(There)e(has)f(b)q(een)h(researc)o(h)g(on)f(automating)f(the)i(pro)q(duction) -g(of)f(program)f(dev)o(elopmen)o(t)i(en)o(vironmen)o(ts,)37 1473 y(and)c(the) -g(systems)f(that)f(are)i(pro)q(duced)g(include)i(the)e(same)f(parts)g(\(ie)h -(parsers,)f(program)g(transformers,)f(and)37 1529 y(prett)o(y)16 b(prin)o(ter\ -s\))g(as)g(a)g(refactory)l(.)22 b(The)17 b(most)e(w)o(ell-kno)o(wn)i(of)f(the\ -se)h(systems)f(for)f(generating)i(program)37 1586 y(dev)o(elopmen)o(t)i(en)o -(vironmen)o(ts)f(are)f(the)h(\(Cornell\))g(Syn)o(thesizer)h(Generator)d([95)o -(],)i(GAND)o(ALF)f([84)o(])g(and)37 1642 y(CENT)l(A)o(UR)f([22)o(].)j(Ideally) -l(,)e(these)e(systems)f(could)i(b)q(e)g(used)f(to)f(generate)h(the)g(soft)o -(w)o(are)e(refactory)l(.)19 b(They)37 1699 y(ha)o(v)o(e)i(built)i(in)f(facili\ -ties)h(for)d(generating)i(parsers)e(that)h(con)o(v)o(ert)f(source)h(in)o(to)g -(abstract)f(syn)o(tax)h(trees)37 1755 y(and)d(prett)o(y)e(prin)o(ters)h(that) -g(con)o(v)o(ert)f(abstract)g(syn)o(tax)h(trees)f(in)o(to)h(source,)h(and)f -(pro)o(vide)h(other)e(supp)q(ort)37 1811 y(suc)o(h)k(as)e(language)h(directed) -h(editing)g(and)f(v)o(ersion)g(managemen)o(t.)29 b(The)19 b(refactorings)f -(themselv)o(es)i(are)37 1868 y(transformations)10 b(of)g(the)h(parse)g(tree)g -(that)f(are)h(m)o(uc)o(h)g(more)f(complex)i(than)f(the)g(simple)h(tree)f(mani\ -pulation)37 1924 y(primitiv)o(es)24 b(supp)q(orted)e(b)o(y)g(these)g(systems,) -g(but)g(eac)o(h)g(system)g(has)f(facilities)j(\(e.g.,)e(action)g(routines)37 -1981 y(in)g(GAND)o(ALF)f(and)g(LeLisp)i(functions)f(in)f(CENT)l(A)o(UR\))g -(for)g(building)i(up)q(on)f(the)f(system)g(pro)o(vided)37 2037 y(primitiv)o -(es.)108 2094 y(Early)d(in)i(our)e(researc)o(h)g(w)o(e)g(analyzed)h(CENT)l -(A)o(UR,)g(whic)o(h)g(is)g(one)f(of)g(the)h(most)e(adv)m(anced)i(of)f(the)37 -2150 y(program)13 b(dev)o(elopmen)o(t)h(en)o(vironmen)o(ts.)20 b(The)14 b(lan\ -guage)g(for)f(writing)h(complex)h(tree)e(manipulations)i(w)o(as)37 2207 y(a)d -(form)f(of)g(Lisp,)i(so)f(is)g(su\016cien)o(tly)h(p)q(o)o(w)o(erful)f(to)f -(write)h(an)o(y)f(kind)i(of)e(program)f(transformation.)18 b(Ho)o(w)o(ev)o -(er,)37 2263 y(the)c(o)o(v)o(erhead)e(of)h(learning)h(to)e(use)i(CENT)l(A)o -(UR,)e(and)i(of)e(con)o(v)o(erting)h(our)g(grammar)e(in)o(to)i(a)g(form)f(it) -h(could)37 2320 y(handle,)k(did)f(not)f(seem)g(to)g(b)q(e)g(w)o(orth)g(the)g -(b)q(ene\014ts)h(it)g(migh)o(t)f(pro)o(vide)g(for)g(our)g(researc)o(h.)108 -2376 y(It)h(seems)g(lik)o(ely)i(that)d(these)h(or)g(other)g(program)e(dev)o -(elopmen)o(t)j(en)o(vironmen)o(t)f(generators)f(w)o(ould)i(b)q(e)37 2432 y -(suitable)f(for)d(building)k(a)d(pro)q(duction)h(v)o(ersion)f(of)g(the)g(refa\ -ctory)l(.)19 b(The)14 b(time)g(to)g(learn)g(to)g(use)g(suc)o(h)h(a)e(to)q(ol) -37 2489 y(w)o(ould)18 b(b)q(e)f(amortized)g(o)o(v)o(er)f(a)g(m)o(uc)o(h)h(lon\ -ger)g(pro)s(ject)f(life-time,)j(so)e(if)g(it)g(made)g(the)g(rest)f(of)g(the)h -(pro)s(ject)37 2545 y(easier)f(then)g(it)f(w)o(ould)h(pa)o(y)f(o\013)f(to)h -(use)g(it.)941 2760 y(130)g eop bop 37 42 a fd(11.4)70 b(Other)23 b(Areas)g -(for)h(F)-6 b(uture)23 b(Researc)n(h)37 143 y fl(There)16 b(are)f(sev)o(eral) -g(other)g(researc)o(h)g(areas)g(that)f(need)i(further)f(in)o(v)o(estigation:) -93 237 y(1.)22 b(A)17 b(more)g(rigorous)f(/)h(complete)h(mo)q(del)g(of)e(ob)s -(jects)h(and)g(their)h(relationships,)g(with)g(more)e(precise)151 293 y(descr\ -iptions)21 b(of)d(the)h(t)o(yp)q(e)g(sp)q(eci\014cations)i(of)d(classes)i(and) -f(a)g(more)f(rigorous)h(pro)q(of)f(of)h(b)q(eha)o(vior)151 350 y(preserv)m -(ation,)d(w)o(ould)f(b)q(e)h(a)f(v)m(aluable)i(con)o(tribution.)93 444 y(2.) -22 b(Program)14 b(analysis)h(tec)o(hniques)i(more)d(p)q(o)o(w)o(erful)i(than) -e(data)h(\015o)o(w)f(could)i(b)q(e)g(studied)g(for)f(c)o(hec)o(king)151 500 y -(program)i(prop)q(erties)h(suc)o(h)h(as)e(class)h(in)o(v)m(arian)o(ts)h(and)f -(exclusiv)o(e)h(comp)q(onen)o(ts.)28 b(Class)18 b(in)o(v)m(arian)o(ts)151 556 -y(with)f(more)f(complicated)i(prop)q(erties)f(could)h(b)q(e)f(studied)h(\(for) -d(example,)i fi(length\(x\))p fl(,)e(where)i fi(x)g fl(is)g(a)151 613 y(mem)o -(b)q(er)f(v)m(ariable)g(represen)o(ting)g(a)f(list\).)93 707 y(3.)22 b(The)d -(set)g(of)f(refactorings)g(could)i(b)q(e)g(extended)f(to)g(handle)h(additiona\ -l)g(features)e(of)h(some)f(ob)s(ject)151 763 y(orien)o(ted)e(languages,)e(suc) -o(h)i(as)e(m)o(ultiple)j(inheritance)g(and)e(parameterized)h(t)o(yp)q(es.)k -(The)15 b(approac)o(h)151 820 y(could)i(also)e(b)q(e)h(extended)g(to)f(handle) -i(additional)f(features)f(more)g(sp)q(eci\014c)i(to)e(C++,)h(suc)o(h)f(as)g -(t)o(yp)q(e)151 876 y(casts,)d(o)o(v)o(erloaded)g(function)h(names)f(within)h -(a)f(class,)g(and)g(a)g(more)g(p)q(o)o(w)o(erful)g(handling)i(of)d(p)q(oin)o -(ters.)93 970 y(4.)22 b(User)g(in)o(terface)g(approac)o(hes)g(could)h(b)q(e)g -(studied)g(for)f(assisting)g(a)g(user)g(in)h(making)f(refactoring)151 1026 y -(related)16 b(design)g(decisions,)g(and)g(re\015ecting)g(the)f(e\013ects)g -(of)g(a)g(refactoring)g(op)q(eration.)93 1120 y(5.)22 b(Refactoring)16 b(and) -g(v)o(ersion)f(managemen)o(t)g(are)h(t)o(w)o(o)e(mec)o(hanisms)i(of)f(supp)q -(orting)h(c)o(hange)g(that)f(are)151 1177 y(probably)i(closely)g(related.)22 b -(Refactorings)16 b(migh)o(t)g(serv)o(e)f(as)h(atomic)g(elemen)o(ts)g(for)f -(logging,)h(undo,)151 1233 y(and)i(reco)o(v)o(ery)l(.)26 b(Also,)18 b(refacto\ -ring)f(is)h(made)g(more)f(complicated)i(if)f(op)q(erations)g(m)o(ust)e(b)q -(e)j(consis-)151 1290 y(ten)o(tly)c(applied)j(to)c(m)o(ultiple)j(v)o(ersions) -e(of)g(a)g(system.)93 1383 y(6.)22 b(Researc)o(h)16 b(is)g(needed)g(in)o(to)f -(dynamic)h(program)e(analysis)i(\(re\015ection\))g(and)f(refactoring.)151 1458 -y(Some)21 b(program)f(prop)q(erties)i(cannot)f(alw)o(a)o(ys)f(b)q(e)i(pro)o -(v)o(en)f(in)o(v)m(arian)o(t)g(using)h(con)o(v)o(en)o(tional)g(static)151 1515 -y(analysis)15 b(tec)o(hniques,)h(but)f(can)f(more)h(easily)g(b)q(e)h(preserv) -o(ed)e(dynamically)l(.)22 b(F)l(or)14 b(example,)h(con)o(v)o(en-)151 1571 y -(tional)f(static)f(analysis)g(tec)o(hniques)i(ma)o(y)d(not)h(correctly)g(dete\ -rmine)h(that)e(a)h(v)m(ariable)h(can)f(safely)h(b)q(e)151 1628 y(designated)k -(as)e(an)h(exclusiv)o(e)h(comp)q(onen)o(t;)f(this)g(limits)h(the)f(use)g(of)g -(some)f(refactorings)g(requiring)151 1684 y(this)g(as)f(a)h(precondition.)23 b -(Dynamically)l(,)17 b(ho)o(w)o(ev)o(er,)d(there)i(is)g(a)f(w)o(a)o(y)g(to)g -(ensure)h(that)f(all)i(instances)151 1741 y(assigned)c(to)e(a)h(particular)g -(v)m(ariable)h(are)f(not)g(already)g(assigned)g(to)g(another)f(comp)q(onen)o -(t:)18 b(asso)q(ciate)151 1797 y(with)h(eac)o(h)g(instance)h(a)f(tag)f(listin\ -g)i(its)f(aggregate\(s\),)e(and)i(c)o(hec)o(k)g(this)h(tag)e(when)h(assigning) -h(an)151 1854 y(instance)f(as)g(a)f(comp)q(onen)o(t.)30 b(If)19 b(the)f(insta\ -nce)h(cannot)g(b)q(e)g(assigned)g(as)f(a)g(comp)q(onen)o(t,)h(create)g(a)151 -1910 y(replacemen)o(t)h(or)f(request)h(it)f(from)g(a)g(clien)o(t/serv)o(er.) -33 b(Other)20 b(program)f(prop)q(erties)h(ma)o(y)e(also)i(b)q(e)151 1967 y -(easier)e(to)f(preserv)o(e)h(dynamically)h(than)e(to)g(pro)o(v)o(e)g(statical\ -ly)l(.)28 b(Refactoring)18 b(an)g(already)f(running)151 2023 y(system)i(adds) -h(complications)h(ho)o(w)o(ev)o(er;)g(for)e(example,)i(what)e(should)h(b)q -(e)h(done)f(to)f(instances)h(of)151 2079 y(classes)c(that)e(w)o(ere)h(created) -g(b)q(efore)h(the)f(classes)h(w)o(ere)f(refactored?)37 2223 y fd(11.5)70 b -(Summary)37 2324 y fl(This)18 b(thesis)f(has)f(describ)q(ed)j(one)d(t)o(yp)q -(e)h(of)f(step)h(in)g(the)g(ev)o(olution)g(of)f(a)g(program:)22 b(refactoring) -16 b(to)g(mak)o(e)37 2381 y(the)e(program)f(easier)h(to)f(understand,)h(c)o -(hange)g(and)f(reuse.)20 b(It)14 b(has)f(describ)q(ed)j(a)d(set)h(of)f(refact\ -orings,)g(ho)o(w)37 2437 y(to)k(c)o(hec)o(k)h(that)e(refactorings)h(are)g(leg\ -al,)i(and)e(ho)o(w)g(to)g(decomp)q(ose)h(complex)g(refactorings)f(in)o(to)g -(simpler)37 2494 y(refactorings.)40 b(It)21 b(could)i(serv)o(e)f(as)f(the)h -(basis)g(for)f(a)h fi(softwar)n(e)g(r)n(efactory)p fl(,)h(whic)o(h)g(is)f(a)g -(program)e(that)37 2550 y(can)i(refactor)e(another)g(program.)37 b(While)22 b -(this)g(thesis)f(has)g(fo)q(cused)h(on)f(refactoring)f(ob)s(ject-orien)o(ted) -941 2760 y(131)g eop bop 37 42 a fl(application)22 b(framew)o(orks,)c(it)i -(is)g(lik)o(ely)h(that)e(the)g(refactorings)g(it)h(has)f(describ)q(ed)i(are)e -(more)g(generally)37 98 y(applicable.)108 154 y(Program)9 b(ev)o(olution)i -(and)f(soft)o(w)o(are)f(reuse)h(are)g(imp)q(ortan)o(t)g(topics)h(that)e(deser\ -v)o(e)i(m)o(uc)o(h)f(more)g(atten)o(tion)37 211 y(than)15 b(they)f(ha)o(v)o -(e)g(receiv)o(ed)i(th)o(us)e(far.)19 b(While)c(there)g(are)f(still)h(man)o -(y)f(problems)h(to)f(solv)o(e)g(b)q(efore)h(to)q(ols)f(lik)o(e)37 267 y(a)g -(soft)o(w)o(are)f(refactory)g(b)q(ecome)i(a)e(realit)o(y)l(,)i(they)f(need)h -(to)f(b)q(e)g(solv)o(ed)h(to)e(mak)o(e)h(soft)o(w)o(are)e(easier)j(to)e(c)o -(hange)37 324 y(and)j(reuse.)k(This)c(thesis)g(is)f(a)g(step)g(in)h(their)g -(solution.)941 2760 y(132)g eop bop 17 301 a - 30259609 29536011 4933632 11840716 35193241 41376727 startTexFig - -%!PS-Adobe-2.0 EPSF-1.2 -%%DocumentFonts: Times-Roman Times-Bold -%%Pages: 1 -%%BoundingBox: 75 180 535 629 -%%EndComments - -50 dict begin - -/arrowHeight 8 def -/arrowWidth 4 def -/none null def -/numGraphicParameters 17 def -/stringLimit 65535 def - -/Begin { -save -numGraphicParameters dict begin -} def - -/End { -end -restore -} def - -/SetB { -dup type /nulltype eq { -pop -false /brushRightArrow idef -false /brushLeftArrow idef -true /brushNone idef -} { -/brushDashOffset idef -/brushDashArray idef -0 ne /brushRightArrow idef -0 ne /brushLeftArrow idef -/brushWidth idef -false /brushNone idef -} ifelse -} def - -/SetCFg { -/fgblue idef -/fggreen idef -/fgred idef -} def - -/SetCBg { -/bgblue idef -/bggreen idef -/bgred idef -} def - -/SetF { -/printSize idef -/printFont idef -} def - -/SetP { -dup type /nulltype eq { -pop true /patternNone idef -} { -dup -1 eq { -/patternGrayLevel idef -/patternString idef -} { -/patternGrayLevel idef -} ifelse -false /patternNone idef -} ifelse -} def - -/BSpl { -0 begin -storexyn -newpath -n 1 gt { -0 0 0 0 0 0 1 1 true subspline -n 2 gt { -0 0 0 0 1 1 2 2 false subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline -} if -n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Circ { -newpath -0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/CBSpl { -0 begin -dup 2 gt { -storexyn -newpath -n 1 sub dup 0 0 1 1 2 2 true subspline -1 1 n 3 sub { -/i exch def -i 1 sub dup i dup i 1 add dup i 2 add dup false subspline -} for -n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline -n 2 sub dup n 1 sub dup 0 0 1 1 false subspline -patternNone not { ifill } if -brushNone not { istroke } if -} { -Poly -} ifelse -end -} dup 0 4 dict put def - -/Elli { -0 begin -newpath -4 2 roll -translate -scale -0 0 1 0 360 arc -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 1 dict put def - -/Line { -0 begin -2 storexyn -newpath -x 0 get y 0 get moveto -x 1 get y 1 get lineto -brushNone not { istroke } if -0 0 1 1 leftarrow -0 0 1 1 rightarrow -end -} dup 0 4 dict put def - -/MLine { -0 begin -storexyn -newpath -n 1 gt { -x 0 get y 0 get moveto -1 1 n 1 sub { -/i exch def -x i get y i get lineto -} for -patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if -brushNone not { istroke } if -0 0 1 1 leftarrow -n 2 sub dup n 1 sub dup rightarrow -} if -end -} dup 0 4 dict put def - -/Poly { -3 1 roll -newpath -moveto --1 add -{ lineto } repeat -closepath -patternNone not { ifill } if -brushNone not { istroke } if -} def - -/Rect { -0 begin -/t exch def -/r exch def -/b exch def -/l exch def -newpath -l b moveto -l t lineto -r t lineto -r b lineto -closepath -patternNone not { ifill } if -brushNone not { istroke } if -end -} dup 0 4 dict put def - -/Text { -ishow -} def - -/idef { -dup where { pop pop pop } { exch def } ifelse -} def - -/ifill { -0 begin -gsave -patternGrayLevel -1 ne { -fgred bgred fgred sub patternGrayLevel mul add -fggreen bggreen fggreen sub patternGrayLevel mul add -fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor -eofill -} { -eoclip -originalCTM setmatrix -pathbbox /t exch def /r exch def /b exch def /l exch def -/w r l sub ceiling cvi def -/h t b sub ceiling cvi def -/imageByteWidth w 8 div ceiling cvi def -/imageHeight h def -bgred bggreen bgblue setrgbcolor -eofill -fgred fggreen fgblue setrgbcolor -w 0 gt h 0 gt and { -l b translate w h scale -w h true [w 0 0 h neg 0 h] { patternproc } imagemask -} if -} ifelse -grestore -end -} dup 0 8 dict put def - -/istroke { -gsave -brushDashOffset -1 eq { -[] 0 setdash -1 setgray -} { -brushDashArray brushDashOffset setdash -fgred fggreen fgblue setrgbcolor -} ifelse -brushWidth setlinewidth -originalCTM setmatrix -stroke -grestore -} def - -/ishow { -0 begin -gsave -fgred fggreen fgblue setrgbcolor -/fontDict printFont findfont printSize scalefont dup setfont def -/descender fontDict begin 0 [FontBBox] 1 get FontMatrix end -transform exch pop def -/vertoffset 0 descender sub printSize sub printFont /Courier ne -printFont /Courier-Bold ne and { 1 add } if def { -0 vertoffset moveto show -/vertoffset vertoffset printSize sub def -} forall -grestore -end -} dup 0 3 dict put def - -/patternproc { -0 begin -/patternByteLength patternString length def -/patternHeight patternByteLength 8 mul sqrt cvi def -/patternWidth patternHeight def -/patternByteWidth patternWidth 8 idiv def -/imageByteMaxLength imageByteWidth imageHeight mul -stringLimit patternByteWidth sub min def -/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv -patternHeight mul patternHeight max def -/imageHeight imageHeight imageMaxHeight sub store -/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def -0 1 imageMaxHeight 1 sub { -/y exch def -/patternRow y patternByteWidth mul patternByteLength mod def -/patternRowString patternString patternRow patternByteWidth getinterval def -/imageRow y imageByteWidth mul def -0 patternByteWidth imageByteWidth 1 sub { -/x exch def -imageString imageRow x add patternRowString putinterval -} for -} for -imageString -end -} dup 0 12 dict put def - -/min { -dup 3 2 roll dup 4 3 roll lt { exch } if pop -} def - -/max { -dup 3 2 roll dup 4 3 roll gt { exch } if pop -} def - -/arrowhead { -0 begin -transform originalCTM itransform -/taily exch def -/tailx exch def -transform originalCTM itransform -/tipy exch def -/tipx exch def -/dy tipy taily sub def -/dx tipx tailx sub def -/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def -gsave -originalCTM setmatrix -tipx tipy translate -angle rotate -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -patternNone not { -originalCTM setmatrix -/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul -arrowWidth div def -/padtail brushWidth 2 div def -tipx tipy translate -angle rotate -padtip 0 translate -arrowHeight padtip add padtail add arrowHeight div dup scale -arrowheadpath -ifill -} if -brushNone not { -originalCTM setmatrix -tipx tipy translate -angle rotate -arrowheadpath -istroke -} if -grestore -end -} dup 0 9 dict put def - -/arrowheadpath { -newpath -0 0 moveto -arrowHeight neg arrowWidth 2 div lineto -arrowHeight neg arrowWidth 2 div neg lineto -closepath -} def - -/leftarrow { -0 begin -y exch get /taily exch def -x exch get /tailx exch def -y exch get /tipy exch def -x exch get /tipx exch def -brushLeftArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/rightarrow { -0 begin -y exch get /tipy exch def -x exch get /tipx exch def -y exch get /taily exch def -x exch get /tailx exch def -brushRightArrow { tipx tipy tailx taily arrowhead } if -end -} dup 0 4 dict put def - -/midpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 x1 add 2 div -y0 y1 add 2 div -end -} dup 0 4 dict put def - -/thirdpoint { -0 begin -/y1 exch def -/x1 exch def -/y0 exch def -/x0 exch def -x0 2 mul x1 add 3 div -y0 2 mul y1 add 3 div -end -} dup 0 4 dict put def - -/subspline { -0 begin -/movetoNeeded exch def -y exch get /y3 exch def -x exch get /x3 exch def -y exch get /y2 exch def -x exch get /x2 exch def -y exch get /y1 exch def -x exch get /x1 exch def -y exch get /y0 exch def -x exch get /x0 exch def -x1 y1 x2 y2 thirdpoint -/p1y exch def -/p1x exch def -x2 y2 x1 y1 thirdpoint -/p2y exch def -/p2x exch def -x1 y1 x0 y0 thirdpoint -p1x p1y midpoint -/p0y exch def -/p0x exch def -x2 y2 x3 y3 thirdpoint -p2x p2y midpoint -/p3y exch def -/p3x exch def -movetoNeeded { p0x p0y moveto } if -p1x p1y p2x p2y p3x p3y curveto -end -} dup 0 17 dict put def - -/storexyn { -/n exch def -/y n array def -/x n array def -n 1 sub -1 0 { -/i exch def -y i 3 2 roll put -x i 3 2 roll put -} for -} def - -%%EndProlog - -%I Idraw 7 Grid 8 - -%%Page: 1 1 - -Begin -%I b u -%I cfg u -%I cbg u -%I f u -%I p u -%I t -[ 0.86747 0 0 0.86747 0 0 ] concat -/originalCTM matrix currentmatrix def - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 0 116 ] concat -%I -90 251 192 384 Rect -End - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -4 -348 ] concat -%I -458 560 589 609 Rect -End - -Begin %I Rect -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -11 29 ] concat -%I -433 280 625 586 Rect -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -513 243 49 27 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -517 349 75 40 Elli -End - -Begin %I Elli -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -513 448 42 25 Elli -End - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -458 560 589 609 Rect -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 469 710 ] concat -%I -[ -(PROGRAM TO BE) -(REFACTORED) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 473 247 ] concat -%I -[ -(REFACTORED) -(PROGRAM) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 484 566 ] concat -%I -[ -(PARSER) -] Text -End - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -11 29 ] concat -%I -524 503 524 481 Line -End - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -0 SetP -%I t -[ 1 0 0 1 -12 -85.9999 ] concat -%I -524 503 524 481 Line -End - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -17 67 ] concat -%I -538 589 538 559 Line -End - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 -23 -287 ] concat -%I -538 589 538 559 Line -End - -Begin %I Rect -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 93 4.0001 ] concat -%I -85 496 86 496 Rect -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-bold-r-*-140-* -/Times-Bold 14 SetF -%I t -[ 1 0 0 1 124 438 ] concat -%I -[ -(USER) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 213 496 ] concat -%I -[ -(REFACTORING COMMANDS) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 239 432 ] concat -%I -[ -(UPDATES DISPLAYED) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 213 390 ] concat -%I -[ -(PRINT COMMANDS) -] Text -End - -Begin %I Line -%I b 65535 -1 0 1 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 32 -29 ] concat -%I -183 404 379 404 Line -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 470 467 ] concat -%I -[ -(REFACTORER) -] Text -End - -Begin %I Text -%I cfg Black -0 0 0 SetCFg -%I f *-times-medium-r-*-140-* -/Times-Roman 14 SetF -%I t -[ 1 0 0 1 485 368 ] concat -%I -[ -(PRETTY) -(PRINTER) -] Text -End - -Begin %I Rect -%I b 65535 -1 0 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I -126 192 128 192 Rect -End - -Begin %I BSpl -%I b 65535 -1 1 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1 113 ] concat -%I 4 -404 355 -303 367 -211 357 -211 357 -4 BSpl -End - -Begin %I BSpl -%I b 65535 -1 1 0 [] 0 SetB -%I cfg Black -0 0 0 SetCFg -%I cbg White -1 1 1 SetCBg -%I p -1 SetP -%I t -[ 1 0 0 1 1.99998 108 ] concat -%I 3 -211 338 -312 328 -405 338 -3 BSpl -End - -End %I eop - -showpage - -%%Trailer - -end - endTexFig - 540 2300 a fh(Figure)17 b(11.1)p fl(:)j(Soft)o(w)o(are)14 b -(Refactoring)h(Pro)q(cess)941 2760 y(133)g eop bop 37 374 a fb(Bibli)q(og)q -(raph)m(y)83 596 y fl([1])22 b(Alfred)d(V.)e(Aho,)i(Ra)o(vi)g(Sethi,)g(and)f -(Je\013rey)g(D.)g(Ullman.)30 b fi(Compilers:)25 b(Principles,)19 b(T)m(e)n -(chniques,)154 653 y(and)d(T)m(o)n(ols)p fl(.)i(Addison-W)l(esley)l(,)f(1986.) -83 746 y([2])22 b(E.)e(Allman)j(and)e(M.)g(Stonebrak)o(er.)37 b(Observ)m(atio\ -ns)22 b(on)g(the)f(ev)o(olution)h(of)f(a)g(soft)o(w)o(are)e(system.)154 803 y -fi(Computer)p fl(,)c(15\(6\):27{32,)d(June)k(1982.)83 897 y([3])22 b(Rob)q -(ert)h(S.)g(Arnold.)45 b(An)24 b(in)o(tro)q(duction)g(to)f(soft)o(w)o(are)e -(restructuring.)45 b fi(T)m(utorial)23 b(on)g(Softwar)n(e)154 953 y(R)n(estru\ -cturing)16 b(\(R)n(ob)n(ert)g(S.)f(A)o(rnold,)h(e)n(d.\))p fl(,)e(1986.)83 -1047 y([4])22 b(E.)15 b(Ashcroft)f(and)i(Z.)f(Manna.)20 b(The)15 b(translatio\ -n)h(of)e(\\goto")g(programs)g(in)i(\\while")h(programs.)i(In)154 1103 y fi -(Pr)n(o)n(c)n(e)n(e)n(dings)13 b(of)k(the)f(1971)i(IFIP)c(Congr)n(ess)p fl -(,)f(pages)i(250{260.)e(North-Holland,)j(1971.)83 1197 y([5])22 b(A)l(T&T.)e -fi(UNIX)15 b(System)h(V)g(User)f(R)n(efer)n(enc)n(e)g(Manual)p fl(.)20 b(A)l -(T&T,)15 b(1984.)83 1291 y([6])22 b(Maurice)15 b(J.)g(Bac)o(h.)20 b fi(The)c -(Design)g(of)g(the)h(UNIX)e(Op)n(er)n(ating)g(System)p fl(.)k(Pren)o(tice)d -(Hall,)g(1986.)83 1385 y([7])22 b(B.)15 b(S.)h(Bak)o(er.)22 b(An)17 b(algorit\ -hm)f(for)f(structured)h(programs.)21 b fi(Journal)c(of)h(the)f(A)o(CM)p fl -(,)d(24\(1\):98{120,)154 1441 y(1977.)83 1535 y([8])22 b(Rob)q(ert)j(Balzer.) -48 b(A)25 b(\014fteen-y)o(ear)f(p)q(ersp)q(ectiv)o(e)j(on)d(automatic)g(progr\ -amming.)47 b(In)25 b fi(Softwar)n(e)154 1592 y(R)n(eusability)15 b(-)i(V)m -(olume)f(II:)f(Applic)n(ations)g(and)i(Exp)n(erienc)n(e)p fl(,)c(pages)i(289{\ -311,)e(1989.)83 1685 y([9])22 b(Ja)o(y)11 b(Banerjee)g(and)h(W)l(on)f(Kim.)j -(Seman)o(tics)e(and)f(implemen)o(tation)i(of)e(sc)o(hema)g(ev)o(olution)h(in) -g(ob)s(ject-)154 1742 y(orien)o(ted)j(databases.)k(In)d fi(Pr)n(o)n(c)n(e)n -(e)n(dings)e(of)j(the)f(A)o(CM)f(SIGMOD)h(Confer)n(enc)n(e)p fl(,)c(1987.)60 -1836 y([10])22 b(D.)13 b(R.)h(Barsto)o(w,)e(H.)i(E.)f(Shrob)q(e,)i(and)f(E.)f -(Sandew)o(all.)19 b fi(Inter)n(active)14 b(Pr)n(o)n(gr)n(amming)h(Envir)n(onm\ -ents)p fl(.)154 1892 y(McGra)o(w-Hill,)g(1984.)60 1986 y([11])22 b(V.)c(Basil\ -i.)32 b fi(T)m(utorial)19 b(on)g(Mo)n(dels)f(and)i(Metrics)f(for)g(Softwar)n -(e)h(Management)f(and)g(Engine)n(ering)p fl(.)154 2042 y(IEEE)c(Computer)g -(So)q(ciet)o(y)h(Press,)e(1980.)60 2136 y([12])22 b(Carol)13 b(Sue)h(Bec)o -(kman-Da)o(vies.)k fi(Finding)13 b(Pr)n(o)n(gr)n(am)i(Di\013er)n(enc)n(es)e -(Base)n(d)h(on)h(Syntactic)f(T)m(r)n(e)n(e)f(Struc-)154 2193 y(tur)n(e)p fl -(.)20 b(PhD)15 b(thesis,)g(Univ)o(ersit)o(y)h(of)f(Illinois)j(at)c(Urbana-Cha\ -mpaign,)h(1989.)60 2286 y([13])22 b(Boris)15 b(Beizer.)21 b fi(Softwar)n(e)16 -b(T)m(esting)f(T)m(e)n(chniques)p fl(.)j(V)l(an)d(Nostrand)g(Reinhold,)i(1983\ -.)60 2380 y([14])22 b(G.)10 b(D.)g(Bergland.)k(A)e(guided)g(tour)e(of)h(progr\ -am)f(design)i(metho)q(dologies.)i fi(Computer)p fl(,)e(14\(10\):18{37,)154 -2437 y(Octob)q(er)j(1981.)60 2531 y([15])22 b(P)o(aul)16 b(L.)h(Bergstein.)24 -b(Ob)s(ject-preserving)17 b(class)g(transformations.)22 b(In)17 b fi(Pr)n(o)n -(c)n(e)n(e)n(dings)e(of)i(OOPSLA)154 2587 y(`91)p fl(,)e(1991.)941 2760 y(134) -g eop bop 60 42 a fl([16])22 b(T)l(ed)15 b(Biggersta\013)g(and)g(Charles)h -(Ric)o(h)o(ter.)k(Reusabilit)o(y)e(framew)o(ork,)13 b(assessmen)o(t,)h(and)i -(directions.)154 98 y fi(T)m(utorial:)k(Softwar)n(e)d(R)n(euse)e(-)i(Emer)n -(ging)e(T)m(e)n(chnolo)n(gy)g(\(Wil)r(l)g(T)m(r)n(acz,)g(e)n(d.\))p fl(,)f -(1988.)60 189 y([17])22 b(T)l(ed)17 b(J.)g(Biggersta\013.)25 b(Design)18 b -(reco)o(v)o(ery)e(for)h(main)o(tenance)g(and)h(reuse.)26 b fi(IEEE)17 b(Compu\ -ter)p fl(,)h(pages)154 246 y(36{49,)13 b(July)j(1989.)60 337 y([18])22 b(T)l -(ed)c(J.)g(Biggersta\013)g(and)g(Alan)h(J.)f(P)o(erlis)h(\(eds\).)29 b fi(Sof\ -twar)n(e)19 b(R)n(eusability)f(-)i(V)m(olume)e(I:)h(Conc)n(epts)154 393 y(and) -d(Mo)n(dels)p fl(.)j(Addison-W)l(esley)e(Publishing)h(Compan)o(y)l(,)c(Inc.,) -h(1989.)60 485 y([19])22 b(T)l(ed)10 b(J.)h(Biggersta\013)e(and)h(Charles)h -(Ric)o(h)o(ter.)h(Reusabilit)o(y)h(framew)o(ork,)c(assessmen)o(t,)h(and)h(dir\ -ections.)154 541 y(In)k fi(Softwar)n(e)i(R)n(eusability)f(-)g(V)m(olume)g(I:) -g(Conc)n(epts)f(and)h(Mo)n(dels)p fl(,)e(pages)h(1{19,)e(1989.)60 633 y([20]) -22 b(C.)13 b(Bohm)h(and)g(G.)f(Jacopini.)19 b(Flo)o(w)13 b(diagrams,)h(turing) -g(mac)o(hines,)g(and)g(languages)g(with)g(only)h(t)o(w)o(o)154 689 y(formatio\ -n)f(rules.)21 b fi(Communic)n(ations)15 b(of)i(the)f(A)o(CM)p fl(,)e(9\(5\):3\ -66{371)o(,)e(Ma)o(y)i(1966.)60 780 y([21])22 b(Grady)14 b(Bo)q(o)q(c)o(h.)20 b -fi(Obje)n(ct-Oriente)n(d)c(Design)p fl(.)j(Benjamin/Cummings,)c(1990.)60 872 y -([22])22 b(P)l(.)g(Borras)f(and)h(D.)g(Clemen)o(t.)41 b(Cen)o(taur:)33 b(the) -22 b(system.)41 b(In)22 b fi(Pr)n(o)n(c)n(e)n(e)n(dings)f(of)h(the)h(A)o(CM)f -(SIG-)154 928 y(SOFT/SIGPLAN)16 b(Softwar)n(e)j(Engine)n(ering)e(Symp)n(osium) -i(on)g(Pr)n(actic)n(al)f(Softwar)n(e)i(Development)154 985 y(Envir)n(onments) -p fl(,)13 b(pages)i(14{24,)e(1988.)60 1076 y([23])22 b(James)17 b(M.)g(Bo)o -(yle.)27 b(Abstract)17 b(programming)g(and)g(program)g(transformation)f(-)i -(an)f(approac)o(h)g(to)154 1132 y(reusing)f(programs.)k(In)c fi(Softwar)n(e)h -(R)n(eusability)f(-)h(V)m(olume)f(I:)g(Conc)n(epts)f(and)i(Mo)n(dels)p fl(,)d -(pages)i(361{)154 1189 y(414,)e(1989.)60 1280 y([24])22 b(F)l(rederic)o(k)f -(P)l(.)f(Bro)q(oks.)36 b(No)20 b(silv)o(er)i(bullet)g(-)e(essence)i(and)f(acc\ -iden)o(ts)g(of)f(soft)o(w)o(are)f(engineering.)154 1337 y fi(IEEE)c(Computer) -p fl(,)g(pages)g(10{19,)f(April)i(1987.)60 1428 y([25])22 b(P)l(.)14 b(J.)h -(Bro)o(wn.)k(Wh)o(y)c(do)q(es)g(soft)o(w)o(are)e(die?)26 b fi(Infote)n(ch)15 b -(State)h(of)h(the)f(A)o(rt)g(R)n(ep)n(ort)p fl(,)e(8\(7\):32{45,)e(1980.)60 -1519 y([26])22 b(K.)10 b(Burns.)j(Using)e(automated)f(tec)o(hniques)i(to)e -(impro)o(v)o(e)h(the)f(main)o(tainabilit)o(y)j(of)d(existing)i(soft)o(w)o(are\ -.)154 1576 y(In)j fi(DSSD)h(User's)g(Confer)n(enc)n(e/6)e(-)j(Maintenanc)n -(e)p fl(,)c(pages)i(33{39,)e(1981.)60 1667 y([27])22 b(R.)g(M.)f(Burstall)i -(and)f(J.)g(Darlington.)40 b(A)22 b(transformation)f(system)h(for)f(dev)o(elo\ -ping)j(recursiv)o(e)154 1723 y(programs.)18 b fi(Journal)f(of)f(the)h(A)o(CM) -p fl(,)c(24\(1\):44{67,)f(1977.)60 1815 y([28])22 b(M.)15 b(H.)h(Burstein.)23 -b(Concept)16 b(formation)g(b)o(y)g(incremen)o(tal)h(analogical)g(reasoning)g -(and)f(debugging.)154 1871 y fi(Machine)g(L)n(e)n(arning:)21 b(A)o(n)16 b(A)o -(rti\014cial)g(Intel)r(ligenc)n(e)f(Appr)n(o)n(ach)i(\(R.S.)f(Michalski,)h -(J.)g(G.)g(Carb)n(onel)r(l)154 1928 y(and)f(T.)g(M.)g(Mitchel)r(l,)f(e)n(ds\)) -p fl(,)f(2:351{370,)e(1986.)60 2019 y([29])22 b(R.)15 b(Canning.)20 b(Rejuv)o -(enate)c(y)o(our)f(old)h(systems.)j fi(EDP)d(A)o(nalyzer)p fl(,)e(22\(3\):1{1\ -6,)d(Marc)o(h)k(1984.)60 2110 y([30])22 b(Eduardo)f(Casais.)36 b fi(R)n(e)n -(or)n(ganizing)20 b(an)h(Obje)n(ct)g(System)p fl(,)h(pages)f(161{189.)35 b -(Cen)o(tre)20 b(Univ)o(ersitair)154 2167 y(d'Informatique,)15 b(Univ)o(ersite) -h(de)g(Genev)o(e,)f(1989.)60 2258 y([31])22 b(Eduardo)15 b(Casais.)k fi(Manag\ -ing)c(Evolution)h(in)g(Obje)n(ct)g(Oriente)n(d)f(Envir)n(onments:)k(A)o(n)d -(A)o(lgorithmic)154 2314 y(Appr)n(o)n(ach)p fl(.)k(PhD)15 b(thesis,)g(Univ)o -(ersit)o(y)h(of)f(Genev)m(a,)g(1991.)60 2406 y([32])22 b(Mic)o(hael)h(J.)g -(Ca)o(v)m(aliere.)44 b(Reusable)24 b(co)q(de)f(at)g(the)f(Hartford)g(Insuranc\ -e)i(Group.)42 b(In)23 b fi(Softwar)n(e)154 2462 y(R)n(eusability)15 b(-)i(V)m -(olume)f(II:)f(Applic)n(ations)g(and)i(Exp)n(erienc)n(e)p fl(,)c(pages)i(131{\ -142,)e(1989.)60 2554 y([33])22 b(Thomas)j(E.)g(Cheatham.)50 b(Reusabilit)o -(y)28 b(through)d(program)g(transformations.)49 b(In)26 b fi(Softwar)n(e)154 -2610 y(R)n(eusability)15 b(-)i(V)m(olume)f(I:)g(Conc)n(epts)f(and)h(Mo)n(dels) -p fl(,)e(pages)h(321{336,)e(1989.)941 2760 y(135)g eop bop 60 42 a fl([34])22 -b(Elliot)11 b(J.)g(Chik)o(ofsky)l(.)h(Rev)o(erse)f(engineering)h(and)e(design) -i(reco)o(v)o(ery:)17 b(A)10 b(taxonom)o(y)l(.)h fi(IEEE)g(Softwar)n(e)p fl -(,)154 98 y(pages)k(13{17,)e(Jan)o(uary)i(1990.)60 192 y([35])22 b(Song)12 b -(C.)g(Choi)h(and)g(W)l(alt)g(Scacc)o(hi.)k(Extracting)12 b(and)h(restructurin\ -g)g(the)g(design)g(of)g(large)f(systems.)154 248 y fi(IEEE)j(Softwar)n(e)p fl -(,)g(pages)g(66{71,)e(Jan)o(uary)i(1990.)60 342 y([36])22 b(P)o(eter)14 b(Coa\ -d)h(and)g(Ed)h(Y)l(ourdon.)k fi(OO)o(A)15 b(-)i(Obje)n(ct-Oriente)n(d)e(A)o -(nalysis)p fl(.)j(Pren)o(tice-Hall,)f(1990.)60 436 y([37])22 b(Departmen)o -(t)13 b(of)g(Electrical)j(Engineering)f(Computer)f(Science)i(Division)f(and)f -(Computer)g(Science.)154 492 y fi(UNIX)j(Pr)n(o)n(gr)n(ammer's)g(Manual,)h -(4.2)h(Berkeley)e(Softwar)n(e)h(Distribution,)h(Virtual)f(V)-5 b(AX-11)19 b -(V)m(er-)154 549 y(sion)p fl(.)g(Univ)o(ersit)o(y)d(of)e(California)i(at)f -(Berk)o(eley)l(,)h(August)f(1983.)60 643 y([38])22 b(Curtis,)13 b(Krasner,)h -(and)f(Isco)q(e.)18 b(A)c(\014eld)h(study)e(of)g(the)h(soft)o(w)o(are)e(desig\ -n)i(pro)q(cess)g(for)f(large)g(systems.)154 699 y(Comm)o(unications)i(of)g -(the)g(A)o(CM)g(31:11,)e(pages)i(1268{1287,)d(1988.)60 793 y([39])22 b(N.)17 b -(Dersho)o(witz.)25 b(Programming)16 b(b)o(y)h(analogy)l(.)26 b fi(Machine)18 b -(L)n(e)n(arning:)23 b(A)o(n)17 b(A)o(rti\014cial)g(Intel)r(ligenc)n(e)154 849 -y(Appr)n(o)n(ach)f(\(R.S.)g(Michalski,)f(J.)h(G.)g(Carb)n(onel)r(l)g(and)g -(T.)g(M.)f(Mitchel)r(l,)h(e)n(ds\))p fl(,)e(2:395{424,)e(1986.)60 943 y([40]) -22 b(L.)15 b(P)o(eter)g(Deutsc)o(h.)21 b(Design)16 b(reuse)f(and)h(framew)o -(orks)e(in)i(the)g(Smalltalk-80)g(system.)k(In)c fi(Softwar)n(e)154 1000 y -(R)n(eusability)f(-)i(V)m(olume)f(II:)f(Applic)n(ations)g(and)i(Exp)n(erienc) -n(e)p fl(,)c(pages)i(57{72,)f(1989.)60 1093 y([41])22 b(Margaret)h(A.)i(Ellis) -i(and)f(Bjarne)f(Stroustrup.)50 b fi(The)25 b(A)o(nnotate)n(d)g(C++)g(R)n(efe\ -r)n(enc)n(e)f(Manual)p fl(.)154 1150 y(Addison-W)l(esley)17 b(Publishing)h -(Co.,)c(Reading,)i(MA,)e(1990.)60 1244 y([42])22 b(M.)17 b(F)l(agan.)27 b(Des\ -ign)18 b(and)g(co)q(de)h(insp)q(ection)h(to)d(reduce)i(errors)e(in)i(program) -e(dev)o(elopmen)o(t.)28 b fi(IBM)154 1300 y(Systems)15 b(Journal)p fl(,)g(15\ -\(3\):182{21)o(2,)d(1976.)60 1394 y([43])22 b(Martin)f(S.)g(F)l(eather.)38 b -(Reuse)23 b(in)f(the)g(con)o(text)e(of)h(a)h(transformation-based)e(metho)q -(dology)l(.)39 b(In)154 1450 y fi(Softwar)n(e)16 b(R)n(eusability)g(-)g(V)m -(olume)g(I:)g(Conc)n(epts)f(and)h(Mo)n(dels)p fl(,)e(pages)h(337{360,)e(1989.) -60 1544 y([44])22 b(Charles)10 b(N.)h(Fisc)o(her)f(and)h(Jr.)f(Ric)o(hard)i -(J.)e(LeBlanc.)k fi(Cr)n(afting)d(a)h(Compiler)p fl(.)g(Benjamin)f(Cummings,) -154 1601 y(1988.)60 1694 y([45])22 b(Gerhard)13 b(Fisc)o(her.)18 b(Cognitiv)o -(e)c(view)g(of)f(reuse)h(and)g(redesign.)k fi(IEEE)c(Softwar)n(e)p fl(,)f(4\(\ -4\):60{72,)e(1987.)60 1788 y([46])22 b(Brian)h(F)l(o)q(ote.)42 b fi(A)o(n)22 b -(Obje)n(ct-Oriente)n(d)g(F)m(r)n(amework)h(for)h(R)n(e\015e)n(ctive)e(Meta-L) -n(evel)g(A)o(r)n(chite)n(ctur)n(es)p fl(.)154 1845 y(Ph.D.)14 b(thesis)i(in)g -(preparation,)f(Univ)o(ersit)o(y)g(of)g(Illinois)j(at)d(Urbana-Champaign.)60 -1939 y([47])22 b(D.)c(F)l(reedman)i(and)g(G.)e(W)l(ein)o(b)q(erg.)34 b fi(Han\ -db)n(o)n(ok)20 b(of)g(Walkthr)n(oughs,)i(Insp)n(e)n(ctions)c(and)i(T)m(e)n -(chnic)n(al)154 1995 y(R)n(eviews)15 b(\(3r)n(d)h(Edition\))p fl(.)k(Little)c -(Bro)o(wn,)e(1982.)60 2089 y([48])22 b(Adele)g(Goldb)q(erg.)38 b fi(Smal)r -(ltalk-80:)32 b(The)21 b(Inter)n(active)f(Pr)n(o)n(gr)n(amming)h(Envir)n(onme\ -nt)p fl(.)36 b(Addison-)154 2145 y(W)l(esley)l(,)16 b(Reading,)g(Massac)o(h)o -(usetts,)d(1984.)60 2239 y([49])22 b(Adele)14 b(Goldb)q(erg)g(and)g(Da)o(vid) -f(Robson.)k fi(Smal)r(ltalk-80:)j(The)14 b(L)n(anguage)g(and)g(its)h(Implemen\ -tation)p fl(.)154 2296 y(Addison-W)l(esley)l(,)i(Reading,)f(Massac)o(h)o(uset\ -ts,)d(1983.)60 2389 y([50])22 b(J.)10 b(E.)g(Grass)f(and)h(Y.)g(F.)f(Chen.)k -(The)d(C++)h(Information)f(Abstractor.)g(In)h fi(Usenix)g(C++)g(Confer)n(enc) -n(e)154 2446 y(Pr)n(o)n(c)n(e)n(e)n(dings)p fl(,)h(pages)j(265{278,)e(San)i -(F)l(rancisco,)g(CA,)g(April)i(1990.)60 2540 y([51])22 b(R.)13 b(Greiner.)k -(Learning)d(b)o(y)f(understanding)h(analogies.)j fi(A)o(rti\014cial)d(Intel)r -(ligenc)n(e)p fl(,)c(35:81{125,)h(1988.)941 2760 y(136)g eop bop 60 42 a fl -([52])22 b(William)c(G.)e(Grisw)o(old.)23 b fi(Pr)n(o)n(gr)n(am)17 b(R)n(estr\ -ucturing)h(as)f(an)g(A)o(id)g(in)g(Softwar)n(e)h(Maintenanc)n(e)p fl(.)k(PhD) -154 98 y(thesis,)15 b(Univ)o(ersit)o(y)h(of)f(W)l(ashington,)g(1991.)60 192 y -([53])22 b(Daniel)13 b(C.)f(Halb)q(ert)i(and)e(P)o(atric)o(k)g(D.)g(O'Brien.) -17 b(Using)c(t)o(yp)q(es)g(and)g(inheritance)h(in)f(ob)s(ject-orien)o(ted)154 -248 y(programs.)18 b fi(IEEE)e(Softwar)n(e)p fl(,)e(pages)h(71{79,)f(Septem)o -(b)q(er)i(1987.)60 342 y([54])22 b(P)o(atric)o(k)e(A.)g(V.)g(Hall)h(and)g(Geo\ -\013)f(R.)g(Do)o(wling.)36 b(Appro)o(ximate)20 b(string)h(matc)o(hing.)35 b fi -(Computing)154 399 y(Surveys)p fl(,)14 b(12\(4\):381{402)o(,)e(Decem)o(b)q -(er)k(1980.)60 492 y([55])22 b(Mehdi)14 b(T.)f(Harandi)h(and)f(Jim)i(Q.)e(Nin\ -g.)k(Kno)o(wledge-based)e(program)e(analysis.)k fi(IEEE)d(Softwar)n(e)p fl -(,)154 549 y(pages)h(74{81,)e(Jan)o(uary)i(1990.)60 643 y([56])22 b(M.)13 b -(S.)h(Hec)o(h)o(t)f(and)i(J.)f(D.)f(Ullman.)19 b(Flo)o(w)13 b(graph)h(reducab\ -ilit)o(y)l(.)20 b fi(SIAM)14 b(J.)h(Computing)p fl(,)e(1:188{202,)154 699 y -(1972.)60 793 y([57])22 b(Apple)16 b(Computer)f(Inc.)21 b fi(Lisa)15 b(T)m -(o)n(olkit)g(3.0)p fl(.)20 b(Apple)d(Computer,)d(1984.)60 887 y([58])22 b(Wil\ -liam)d(A.)e(Jindric)o(h.)28 b(F)l(oible:)d(A)17 b(framew)o(ork)f(for)h(visual) -h(programming)f(languages.)26 b(Master's)154 943 y(thesis,)15 b(Univ)o(ersit) -o(y)h(of)f(Illinois)j(at)c(Urbana-Champaign,)h(1990.)60 1037 y([59])22 b(Ralp\ -h)12 b(E.)e(Johnson)i(and)f(Brian)h(F)l(o)q(ote.)g(Designing)g(reusable)g(cla\ -sses.)i fi(Journal)e(of)h(Obje)n(ct-Oriente)n(d)154 1093 y(Pr)n(o)n(gr)n(ammi\ -ng)p fl(,)h(1\(2\):22{35,)e(1988.)60 1187 y([60])22 b(Ralph)f(E.)e(Johnson,)i -(Justin)f(O.)g(Gra)o(v)o(er,)f(and)h(La)o(wrence)g(W.)f(Zura)o(wski.)33 b(TS:) -19 b(An)h(optimizing)154 1244 y(compiler)g(for)f(Smalltalk.)33 b(In)20 b fi -(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)i(OOPSLA)e(`88)p fl(,)i(pages)g(18{26,)e(No) -o(v)o(em)o(b)q(er)h(1988.)154 1300 y(prin)o(ted)d(as)e(SIGPLAN)i(Notices,)g -(23\(11\).)60 1394 y([61])22 b(W.)14 b(Lewis)i(Johnson)g(and)f(Martin)g(F)l -(eather.)k(Building)f(an)d(ev)o(olution)g(transformation)f(library)l(.)21 b -(In)154 1450 y fi(Pr)n(o)n(c)n(e)n(e)n(dings)10 b(of)j(the)g(12th)g(Internati\ -onal)f(Confer)n(enc)n(e)f(on)h(Softwar)n(e)h(Engine)n(ering)p fl(,)d(pages)h -(238{247,)154 1507 y(1990.)60 1601 y([62])22 b(Guy)16 b(L.)h(Steele)h(Jr.)25 b -fi(Common)18 b(LISP:)e(The)h(L)n(anguage)h(\(2r)n(d)f(Edition\))p fl(.)24 b -(Digital)18 b(Press,)f(Bedford,)154 1657 y(MA,)d(1990.)60 1751 y([63])22 b -(Simon)c(M.)f(Kaplan.)27 b(Co)q(ed:)e(Con)o(v)o(ersation-orien)o(ted)17 b(sof\ -t)o(w)o(are)f(en)o(vironmen)o(ts.)27 b(In)18 b fi(Pr)n(o)n(c)n(e)n(e)n(dings) -154 1807 y(of)e(IFIP)g(Confer)n(enc)n(e)e(on)i(Human)h(F)m(ac)n(ors)f(in)g -(Information)g(Systems)p fl(,)e(Sc)o(harding,)i(Austia.,)f(June)154 1864 y -(1990.)60 1958 y([64])22 b(S.)10 b(T.)h(Kedar-Cab)q(elli.)k(Purp)q(ose-direct\ -ed)e(analogy)l(.)f(In)g fi(Pr)n(o)n(c)n(e)n(e)n(dings)e(Seventh)h(A)o(nnual)h -(Confer)n(enc)n(e)154 2014 y(of)k(the)h(Co)n(gnitive)e(Scienc)n(e)f(So)n(ciet\ -y)p fl(,)g(Irvine,)i(CA,)f(August)g(1985.)60 2108 y([65])22 b(B.)13 b(W.)f -(Kernighan)j(and)e(P)l(.)g(J.)g(Plauger.)k fi(Elements)d(of)g(Pr)n(o)n(gr)n -(amming)g(Style)p fl(.)i(McGra)o(w-Hill,)e(1974.)60 2202 y([66])22 b(W)l(on) -15 b(Kim.)20 b fi(Intr)n(o)n(duction)c(to)h(Obje)n(ct-Oriente)n(d)e(Datab)n -(ases)p fl(.)k(MIT)c(Press,)g(1990.)60 2296 y([67])22 b(S.)f(R.)h(Kosara)s -(ju.)39 b(Analysis)23 b(of)f(structured)g(programs.)38 b fi(Journal)23 b(of)f -(Computer)i(and)e(System)154 2352 y(Scienc)n(es)p fl(,)12 b(9\(3\):232{255,)g -(1974.)60 2446 y([68])22 b(Rob)q(ert)16 b(G.)f(Lanergan)h(and)h(Charles)f(A.) -g(Grasso.)21 b(Soft)o(w)o(are)14 b(engineering)k(with)f(reusable)g(designs) -154 2502 y(and)f(co)q(de.)22 b(In)16 b fi(Softwar)n(e)h(R)n(eusability)g(-)g -(V)m(olume)f(II:)g(Applic)n(ations)g(and)h(Exp)n(erienc)n(e)p fl(,)d(pages)i -(187{)154 2559 y(196,)e(1989.)941 2760 y(137)g eop bop 60 42 a fl([69])22 b -(Karl)c(Lieb)q(erherr.)28 b fi(Conc)n(epts)17 b(of)i(Obje)n(ct-Oriente)n(d)e -(Data)i(Mo)n(deling)e(and)i(Pr)n(o)n(gr)n(amming)p fl(.)26 b(A)o(CM,)154 98 y -(1991.)18 b(Presen)o(ted)e(as)f(T)l(utorial)g(No.)g(16)f(at)h(OOPSLA)h('91.) -60 188 y([70])22 b(Karl)12 b(Lieb)q(erherr,)i(W)l(alter)d(J.)h(Hursc)o(h,)g -(and)g(Cun)g(Xiao.)i(Ob)s(ject-extending)f(class)f(transformations)154 244 y -(\(draft\).)37 b(T)l(ec)o(hnical)23 b(rep)q(ort,)f(College)h(of)e(Computer)g -(Science,)j(Northeastern)d(Univ)o(ersit)o(y)l(,)i(360)154 301 y(Hun)o(tington) -15 b(Av)o(e.,)g(Boston)f(MA)h(02115,)e(1991.)60 391 y([71])22 b(Karl)13 b(J.) -g(Lieb)q(erherr)h(and)f(Ian)h(M.)e(Holland.)17 b(Assuring)c(go)q(o)q(d)g(st)o -(yle)g(for)f(ob)s(ject-orien)o(ted)h(programs.)154 447 y fi(IEEE)i(Softwar)n -(e)p fl(,)g(pages)g(38{48,)e(Septem)o(b)q(er)j(1989.)60 537 y([72])22 b(Karl) -g(J.)f(Lieb)q(erherr,)k(Ian)d(M.)e(Holland,)k(and)e(A.)f(Riel.)41 b(Ob)s(ject\ --orien)o(ted)22 b(programming:)32 b(An)154 594 y(ob)s(jectiv)o(e)14 b(sense)h -(of)e(st)o(yle.)19 b(In)14 b fi(Pr)n(o)n(c)n(e)n(e)n(dings)f(of)j(OOPSLA)e -(`88)p fl(,)g(pages)g(323{334,)e(Septem)o(b)q(er)j(1988.)60 684 y([73])22 b -(R.)13 b(C.)f(Linger,)i(H.)e(D.)h(Mills,)h(and)f(R.)g(J.)g(Witt.)j fi(Structu\ -r)n(e)n(d)e(Pr)n(o)n(gr)n(amming:)19 b(The)n(ory)14 b(and)h(Pr)n(actic)n(e)p -fl(.)154 740 y(Addison-W)l(esley)l(,)i(1979.)60 830 y([74])22 b(Barbara)d(Lis\ -k)o(o)o(v.)36 b(Data)20 b(abstraction)g(and)h(hierarc)o(h)o(y)l(.)36 b(In)21 b -fi(A)n(ddendum)h(to)f(the)h(Pr)n(o)n(c)n(e)n(e)n(dings)c(of)154 887 y(OOPSLA) -c(`87)p fl(,)h(1987.)60 976 y([75])22 b(M.)14 b(J.)h(Ly)o(ons.)20 b(Salv)m -(aging)c(y)o(our)e(soft)o(w)o(are)g(asset)g(\(to)q(ols)h(based)g(main)o(tanan\ -ce\).)20 b(In)c fi(Pr)n(o)n(c)n(e)n(e)n(dings)d(of)154 1033 y(the)j(National) -g(Computer)h(Confer)n(enc)n(e)d(1981)p fl(,)i(pages)f(337{341.)e(AFIPS)i(Pres\ -s,)g(1981.)60 1123 y([76])22 b(P)o(eter)g(W.)f(Madan)o(y)l(.)41 b fi(A)o(n)22 -b(Obje)n(ct-Oriente)n(d)g(F)m(r)n(amework)g(for)i(File)e(System)p fl(.)40 b -(Ph.D.)22 b(thesis)h(in)154 1179 y(preparation,)14 b(Univ)o(ersit)o(y)i(of)f -(Illinois)j(at)d(Urbana-Champaign.)60 1269 y([77])22 b(P)o(eter)14 b(W.)g(Mad\ -an)o(y)l(,)g(Ro)o(y)g(H.)g(Campb)q(ell,)i(Vincen)o(t)g(F.)e(Russo,)g(and)h -(Douglas)f(E.)g(Ley)o(ens.)20 b(A)14 b(Class)154 1326 y(Hierarc)o(h)o(y)c(for) -g(Building)j(Stream-Orien)o(ted)f(File)g(Systems.)g(In)f fi(Pr)n(o)n(c)n(e)n -(e)n(dings)e(of)k(the)f(1989)h(Eur)n(op)n(e)n(an)154 1382 y(Confer)n(enc)n -(e)h(on)i(Obje)n(ct-Oriente)n(d)f(Pr)n(o)n(gr)n(amming)p fl(,)f(Nottingham,)h -(UK,)g(July)h(1989.)60 1472 y([78])22 b(J.)i(Martin)h(and)g(C.)f(McClure.)48 b -fi(Softwar)n(e)25 b(Maintenanc)n(e:)37 b(The)25 b(Pr)n(oblem)f(and)h(Its)f -(Solution)p fl(.)154 1529 y(Pren)o(tice-Hall,)16 b(1983.)60 1619 y([79])22 b -(Bertrand)15 b(Mey)o(er.)k fi(Obje)n(ct-oriente)n(d)d(Softwar)n(e)g(Construct\ -ion)p fl(.)j(Pren)o(tice)d(Hall,)g(1988.)60 1709 y([80])22 b(W)l(are)14 b(Mey) -o(ers.)20 b(In)o(terview)c(with)f(Wilma)h(Osb)q(orne.)k fi(IEEE)c(Softwar)n -(e)p fl(,)f(5\(3\):104{10)o(5,)d(1988.)60 1799 y([81])22 b(Scott)10 b(Mey)o -(ers)h(Moises)h(Lejter)f(and)g(Stev)o(en)h(P)l(.)f(Reiss.)k(Supp)q(ort)c(for) -g(Main)o(taining)h(Ob)s(ject-Orien)o(ted)154 1855 y(Programs.)22 b(In)17 b fi -(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)i(the)h(1991)h(Confer)n(enc)n(e)c(on)i(Softw\ -ar)n(e)h(Maintenanc)n(e)p fl(,)c(pages)j(171{)154 1911 y(178,)d(Sorren)o(to,) -g(Italy)l(,)h(Octob)q(er)h(1991.)60 2001 y([82])22 b(H.)e(W.)f(Morgan.)35 b -(Ev)o(olution)20 b(of)g(a)g(soft)o(w)o(are)f(main)o(tenance)i(to)q(ol.)35 b -(In)21 b fi(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)i(the)g(2nd)154 2058 y(National) -14 b(Confer)n(enc)n(e)f(on)i(EDP)g(Softwar)n(e)g(Maintenanc)n(e)p fl(,)c(page\ -s)j(268{278.)d(US)j(Professional)g(De-)154 2114 y(v)o(elopmen)o(t)h(Institute\ -,)h(1984.)60 2204 y([83])22 b(James)d(M.)f(Neigh)o(b)q(ors.)32 b(Draco:)27 b -(A)19 b(metho)q(d)g(for)g(engineering)i(reusable)f(soft)o(w)o(are)d(systems.) -31 b(In)154 2261 y fi(Softwar)n(e)16 b(R)n(eusability)g(-)g(V)m(olume)g(I:)g -(Conc)n(epts)f(and)h(Mo)n(dels)p fl(,)e(pages)h(275{294,)e(1989.)60 2351 y -([84])22 b(Da)o(vid)13 b(et)f(al.)h(Notkin.)k fi(The)d(Journal)g(of)g(Systems) -g(and)g(Softwar)n(e)g(Sp)n(e)n(cial)f(Issue:)19 b(The)14 b(GAND)o(ALF)154 2407 -y(Pr)n(oje)n(ct)p fl(.)19 b(Elsevier)d(Science)h(Publishing)h(Co.,)c(Ma)o(y)g -(1985.)60 2497 y([85])22 b(William)16 b(F.)f(Op)q(dyk)o(e)h(and)f(Ralph)h(E.) -f(Johnson.)20 b(Refactoring:)g(An)15 b(aid)g(in)h(designing)h(application)154 -2554 y(framew)o(orks)9 b(and)i(ev)o(olving)g(ob)s(ject-orien)o(ted)g(systems.) -h(In)f fi(Pr)n(o)n(c)n(e)n(e)n(dings)f(of)i(Symp)n(osium)g(on)g(Obje)n(ct-) -154 2610 y(Oriente)n(d)i(Pr)n(o)n(gr)n(amming)h(Emphasizing)g(Pr)n(actic)n -(al)f(Applic)n(ations)h(\(SOOPP)m(A\))p fl(,)c(Septem)o(b)q(er)k(1990.)941 -2760 y(138)g eop bop 60 42 a fl([86])22 b(Tim)12 b(O'Shea,)g(Ken)o(t)h(Bec)o -(k,)f(Dan)g(Halb)q(ert,)g(and)h(Kurt)f(J.)f(Sc)o(hm)o(uc)o(k)o(er.)k(P)o(anel) -d(on:)18 b(The)13 b(learnabilit)o(y)154 98 y(of)g(ob)s(ject-orien)o(ted)h(pro\ -gramming)f(systems.)k(In)d fi(Pr)n(o)n(c)n(e)n(e)n(dings)f(of)i(OOPSLA)e(`86) -p fl(,)h(pages)g(502{504,)154 154 y(No)o(v)o(em)o(b)q(er)g(1986.)19 b(prin)o -(ted)d(as)f(SIGPLAN)h(Notices,)f(21\(11\).)60 248 y([87])22 b(D.)13 b(L.)h -(P)o(arnas.)k(Designing)d(soft)o(w)o(are)d(for)i(ease)g(of)g(extension)h(and) -f(con)o(traction.)k fi(Communic)n(ations)154 305 y(of)e(the)h(A)o(CM)p fl(,)c -(15\(12\):1053{10)o(58,)e(Decem)o(b)q(er)16 b(1972.)60 399 y([88])22 b(D.)10 b -(L.)g(P)o(arnas.)i(Designing)f(soft)o(w)o(are)e(for)h(ease)h(of)f(extension)i -(and)f(con)o(traction.)h fi(IEEE)f(T)m(r)n(ansactions)154 455 y(on)16 b(Softw\ -ar)n(e)g(Engine)n(ering)p fl(,)d(5\(2\):128{13)o(8,)f(Marc)o(h)i(1979.)60 549 -y([89])22 b(Da)o(vid)14 b(L.)g(P)o(arnas)f(and)i(P)l(.)e(C.)h(Clemen)o(ts.)k -(A)d(rational)f(design)h(pro)q(cess:)20 b(Ho)o(w)13 b(and)h(wh)o(y)g(to)g(fak) -o(e)g(it.)154 605 y(In)f fi(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)j(International)e -(Joint)i(Confer)n(enc)n(e)e(on)h(The)n(ory)h(and)g(Pr)n(actic)n(e)f(on)g(Soft\ -war)n(e)h(De-)154 662 y(velopment)h(\(T)m(APSOFT\))o fl(,)c(1985.)17 b(Reprin) -o(ted)f(in)f fi(IEEE)g(T)m(r)n(ansactions)e(on)i(Softwar)n(e)h(Engine)n(ering) -154 718 y fl(SE-12:2,)e(F)l(ebruary)l(,)g(1986.)60 812 y([90])22 b(D.)16 b -(L.)g(P)o(arnass,)g(P)l(.C.)g(Clemen)o(ts,)h(and)g(D.M.)e(W)l(eiss.)25 b(The) -17 b(mo)q(dular)g(structure)g(of)f(complex)i(sys-)154 868 y(tems.)g(In)d fi -(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)j(the)g(7th)g(International)e(Confer)n(enc)n -(e)g(on)h(Softwar)n(e)h(Engine)n(ering)p fl(,)c(pages)154 925 y(408{417,)h -(1984.)60 1019 y([91])22 b(H.)15 b(P)o(artsc)o(h)g(and)h(R.)g(Stein)o(bruggen\ -.)23 b(Program)15 b(transformation)g(systems.)21 b fi(Computing)c(Surveys)p fl -(,)154 1075 y(15\(3\):199{2)o(36,)12 b(Septem)o(b)q(er)k(1983.)60 1169 y([92]) -22 b(D.)16 b(Jason)i(P)o(enney)f(and)h(Jacob)g(Stein.)27 b(Class)17 b(mo)q -(di\014cation)i(in)f(the)f(GemStone)g(ob)s(ject-orien)o(ted)154 1225 y(dbms.) -j(In)c fi(Pr)n(o)n(c)n(e)n(e)n(dings)d(of)k(OOPSLA)d(`87)p fl(,)i(1987.)60 -1319 y([93])22 b(Edw)o(ard)16 b(J.)g(Rak.)23 b(Tw)o(o)16 b(redesign)h(to)q -(ols)g(for)e(Smalltalk.)25 b(Master's)15 b(thesis,)i(Univ)o(ersit)o(y)g(of)f -(Illinois)154 1376 y(at)e(Urbana-Champaign,)h(1990.)60 1469 y([94])22 b(Thoma\ -s)11 b(W.)g(Reps.)k(Incremen)o(tal)d(ev)m(aluation)h(for)f(attribute)f(gramma\ -rs)f(with)i(unrestricted)h(mo)o(v)o(e-)154 1526 y(men)o(t)i(b)q(et)o(w)o(een) -g(tree)g(mo)q(di\014cation.)21 b fi(A)n(cta)16 b(Informatic)n(a)p fl(,)f(25\(\ -2\):155{1)o(78,)d(1988.)60 1620 y([95])22 b(Thomas)15 b(W.)g(Reps)i(and)f(Tim) -g(T)l(eitelbaum.)24 b fi(The)17 b(Synthesizer)e(Gener)n(ator:)22 b(A)17 b(Sys\ -tem)g(for)g(Con-)154 1676 y(structing)f(L)n(anguage-Base)n(d)f(Editors)p fl -(.)20 b(Springer-V)l(erlag,)c(1989.)60 1770 y([96])22 b(John)14 b(R.)h(Rice)g -(and)f(Herb)q(ert)h(D.)e(Sc)o(h)o(w)o(etman.)18 b(In)o(terface)c(issues)h(in) -g(a)f(soft)o(w)o(are)e(parts)i(tec)o(hnology)l(.)154 1826 y(In)h fi(Softwar)n -(e)i(R)n(eusability)f(-)g(V)m(olume)g(I:)g(Conc)n(epts)f(and)h(Mo)n(dels)p fl -(,)e(pages)h(125{140,)e(1989.)60 1920 y([97])22 b(Charles)f(Ric)o(h)i(and)e -(Linda)h(M.)f(Wills.)39 b(Recognizing)23 b(a)e(program's)e(design:)33 b(A)21 b -(graph-parsing)154 1977 y(approac)o(h.)e fi(IEEE)c(Softwar)n(e)p fl(,)g(pages) -g(82{89,)f(Jan)o(uary)h(1990.)60 2071 y([98])22 b(Ro)o(xanna)f(Ro)q(c)o(hat.) -39 b(In)22 b(searc)o(h)f(of)g(go)q(o)q(d)h(Smalltalk)g(programming)f(st)o(yle\ -.)39 b(T)l(ec)o(hnical)23 b(Rep)q(ort)154 2127 y(CR-86-19,)14 b(T)l(ektronix,) -h(1986.)60 2221 y([99])22 b(Marc)e(J.)g(Ro)q(c)o(hkind.)38 b(The)21 b(source) -f(co)q(de)h(con)o(trol)g(system.)35 b fi(IEEE)20 b(T)m(r)n(ansactions)f(on)i -(Softwar)n(e)154 2277 y(Engine)n(ering)p fl(,)12 b(SE-1\(4\):364{370,)g(Decem) -o(b)q(er)k(1975.)37 2371 y([100])22 b(James)17 b(A.)g(Roskind.)27 b fi(Y)m -(A)o(CC)16 b(c)n(omp)n(atible)i(C++)g(gr)n(ammar)g(\(and)g(R)n(elate)n(d)g -(T)m(o)n(ols\))p fl(.)24 b(516)16 b(Latania)154 2428 y(P)o(alm)d(Driv)o(e;)h -(Indialan)o(tic)h(FL)e(32903)f(USA.)18 b(Author)13 b(can)g(b)q(e)h(reac)o(hed) -g(b)o(y)f(email)i(at)d(jar@ileaf.com)154 2484 y(or)i(uunet!leafusa!jar.)h(Sof\ -t)o(w)o(are)f(a)o(v)m(ailable)i(via)g(ftp)f(from)f(sev)o(eral)i(sites.)37 2578 -y([101])22 b(James)15 b(et)g(al)g(Rum)o(baugh.)21 b fi(Obje)n(ct-Oriente)n -(d)15 b(Mo)n(deling)g(and)h(Design)p fl(.)j(Pren)o(tice)d(Hall,)g(1991.)941 -2760 y(139)g eop bop 37 42 a fl([102])22 b(Vince)17 b(Russo,)g(Gary)f(Johnsto\ -n,)g(and)h(Ro)o(y)f(H.)g(Campb)q(ell.)26 b(Pro)q(cess)16 b(Managemen)o(t)f -(in)j(Multipro-)154 98 y(cessor)g(Op)q(erating)h(Systems)f(using)h(Class)f -(Hierarc)o(hical)i(Design.)29 b(In)19 b fi(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)i -(OOPSLA)154 154 y('88)p fl(,)c(San)g(Diego,)g(Ca.,)f(Septem)o(b)q(er)i(1988.) -37 248 y([103])22 b(Vincen)o(t)13 b(Russo)g(and)g(Ro)o(y)g(H.)f(Campb)q(ell.) -17 b(Virtual)d(Memory)e(and)h(Bac)o(king)g(Storage)e(Managemen)o(t)154 305 y -(in)19 b(Multipro)q(cessor)h(Op)q(erating)f(Systems)g(using)g(Class)g(Hierarc) -o(hical)h(Design.)31 b(In)20 b fi(Submitte)n(d)f(to)154 361 y(OOPSLA)14 b('89) -p fl(,)h(1989.)k(Also)d(a)o(v)m(ailable)h(as)d(Univ)o(ersit)o(y)i(of)f(Illino\ -is)j(T)l(ec)o(hnical)f(Rep)q(ort.)37 455 y([104])22 b(Vincen)o(t)12 b(F.)e -(Russo.)j fi(A)o(n)f(Obje)n(ct-Oriente)n(d)f(Op)n(er)n(ating)g(System)p fl -(.)i(PhD)e(thesis,)h(Univ)o(ersit)o(y)f(of)g(Illinois)154 511 y(at)j(Urbana-C\ -hampaign,)h(1991.)37 605 y([105])22 b(Vincen)o(t)e(F.)e(Russo)i(and)f(Simon)h -(M.)f(Kaplan.)33 b(A)19 b(C++)h(in)o(terpreter)f(for)g(sc)o(heme.)32 b(In)20 b -fi(Pr)n(o)n(c)n(e)n(e)n(d-)154 662 y(ings)j(of)i(the)g(USENIX)e(C++)49 b(Work\ -shop)p fl(,)27 b(pages)d(95{108,)h(1988.)46 b(Also)25 b(T)l(ec)o(hnical)h(Rep) -q(ort)154 718 y(No.)19 b(UIUCDCS{R{88{1461,)h(Departmen)o(t)f(of)h(Computer)f -(Science,)k(Univ)o(ersit)o(y)e(of)f(Illinois)j(at)154 775 y(Urbana-Champaign.) -37 868 y([106])f(Barbara)16 b(Ryder.)28 b(P)o(ap)q(er)17 b(on)h(incremen)o -(tal)g(data)f(\015o)o(w)g(anan)o(ysis.)27 b(In)19 b fi(Confer)n(enc)n(e)d(R)n -(e)n(c)n(or)n(d)i(of)g(the)154 925 y(Sevente)n(enth)c(A)o(nnual)h(A)o(CM)h -(Symp)n(osium)g(on)g(Principles)f(of)h(Pr)n(o)n(gr)n(amming)g(L)n(anguages)p -fl(,)e(1990.)37 1019 y([107])22 b(Barbara)16 b(G.)h(Ryder)h(and)f(Marvin)h -(C.)e(P)o(aull.)27 b(Elimination)20 b(algorithms)d(for)g(data)f(\015o)o(w)h -(analysis.)154 1075 y fi(A)o(CM)e(Computing)h(Surveys)p fl(,)f(18\(3\):231{2) -o(76,)d(Septem)o(b)q(er)j(1986.)37 1169 y([108])22 b(Markku)12 b(Sakkinen.)18 -b(Commen)o(ts)12 b(in)i(the)g(la)o(w)f(of)f(Demeter)h(and)h(C++.)j fi(SIGPLAN) -12 b(Notic)n(es)p fl(,)h(pages)154 1225 y(38{44,)g(Decem)o(b)q(er)j(1988.)37 -1319 y([109])22 b(Da)o(vid)g(Sank)o(o\013)g(and)h(Joseph)g(B.)g(Krusk)m(al.) -43 b(Macromolecular)23 b(sequences.)43 b(In)23 b fi(Time)g(Warps,)154 1376 y -(String)13 b(Edits,)h(and)g(Macr)n(omole)n(cules:)19 b(The)13 b(The)n(ory)h -(and)g(Pr)n(actic)n(e)g(of)g(Se)n(quenc)n(e)e(Comp)n(arison)i(\(D.)154 1432 y -(Sanko\013)h(and)i(J.)f(Kruskal,)g(e)n(ds\))p fl(,)d(pages)i(45{53,)f(1983.) -37 1526 y([110])22 b(W)l(alt)17 b(Scacc)o(hi.)28 b(The)17 b(USC)h(system)f -(factory)f(pro)s(ject.)26 b fi(A)o(CM)17 b(SIGSOFT)f(Softwar)n(e)j(Engine)n -(ering)154 1582 y(Notes)p fl(,)14 b(14\(1\):61{82,)e(Jan)o(uary)j(1989.)37 -1676 y([111])22 b(Stanley)e(M.)f(Selk)o(o)o(w.)33 b(The)20 b(tree-to-tree)f -(editing)i(problem.)34 b fi(Information)20 b(Pr)n(o)n(c)n(essing)e(L)n(etters) -p fl(,)154 1733 y(6\(6\):184{18)o(6,)12 b(Decem)o(b)q(er)k(1977.)37 1826 y -([112])22 b(B.)12 b(Shneiderman)i(and)e(G.)g(Thomas.)j(An)d(arc)o(hitecture)h -(for)f(utomatic)g(relational)h(database)f(system)154 1883 y(con)o(v)o(ersion.) -20 b(In)15 b fi(A)o(CM)h(T)m(r)n(ansactions)e(on)i(Datab)n(ase)g(Systems)p fl -(,)e(pages)h(235{257,)e(June)j(1982.)37 1977 y([113])22 b(M.)d(J.)h(Spier.)37 -b(Soft)o(w)o(are)18 b(malpractice)j(-)g(a)f(distasteful)h(exp)q(erience.)37 b -fi(Softwar)n(e)21 b(-)g(Pr)n(actic)n(e)f(and)154 2033 y(Exp)n(erienc)n(e)p fl -(,)13 b(6:293{299,)f(1976.)37 2127 y([114])22 b(Bjarne)14 b(Stroustrup.)k fi -(The)d(C++)f(Pr)n(o)n(gr)n(amming)h(L)n(anguage)p fl(.)i(Addison-W)l(esley)f -(Publishing)h(Com-)154 2183 y(pan)o(y)l(,)e(1986.)37 2277 y([115])22 b(Kuo-Ch) -o(ung)12 b(T)l(ai.)i(The)f(tree-to-tree)e(correction)h(problem.)j fi(Journal) -e(of)g(the)g(A)o(CM)p fl(,)e(26\(3\):422{4)o(33,)154 2334 y(July)16 b(1979.) -37 2428 y([116])22 b(W)l(alter)14 b(F.)g(Tic)o(h)o(y)l(.)20 b(T)l(o)q(ols)15 b -(for)f(soft)o(w)o(are)f(con\014guration)i(managemen)o(t.)j(In)e fi(Pr)n(o)n -(c)n(e)n(e)n(dings)d(of)j(the)g(In-)154 2484 y(ternational)e(Workshop)j(on)d -(Softwar)n(e)i(V)m(ersion)d(and)j(Con\014gur)n(ation)e(Contr)n(ol)g(\(J.)g -(F.)h(H.)g(Winkler,)154 2540 y(e)n(d\))p fl(,)f(pages)h(1{20,)f(1988.)941 2760 -y(140)g eop bop 37 42 a fl([117])22 b(Will)c(T)l(racz.)26 b fi(T)m(utorial:)e -(Softwar)n(e)19 b(R)n(euse)e(-)i(Emer)n(ging)e(T)m(e)n(chnolo)n(gy)p fl(.)24 b -(IEEE)17 b(Computer)g(So)q(ciet)o(y)l(,)154 98 y(1988.)37 192 y([118])22 b -(V.)g(Vyssotsky)f(and)i(P)l(.)f(W)l(egner.)41 b(A)23 b(graph)f(theoretical)h -(fortran)e(source)i(language)f(analyzer.)154 248 y(Man)o(uscript,)15 b(A)l -(T&T)g(Bell)i(Lab)q(oratories,)d(Murra)o(y)h(Hill,)h(NJ,)g(1963.)37 342 y([11\ -9])22 b(Rob)q(ert)e(A.)f(W)l(agner.)34 b(Order-n)20 b(correction)h(for)e(regu\ -lar)h(languages.)34 b fi(Communic)n(ations)20 b(of)g(the)154 399 y(A)o(CM)p fl -(,)13 b(17\(5\):265{268,)e(1974.)37 492 y([120])22 b(Rob)q(ert)11 b(A.)f(W)l -(agner)h(and)g(Mic)o(hael)h(J.)e(Fisher.)j(The)f(string-to-string)e(correctio\ -n)h(problem.)i fi(Journal)154 549 y(of)j(the)h(A)o(CM)p fl(,)c(21\(1\):168{17\ -3,)e(Jan)o(uary)k(1974.)37 643 y([121])22 b(S.)10 b(W)l(arren.)h(Map:)17 b -(A)10 b(to)q(ol)g(for)g(understanding)h(soft)o(w)o(are.)f(In)h fi(Pr)n(o)n -(c)n(e)n(e)n(dings)e(of)j(the)g(6th)g(International)154 699 y(Confer)n(enc)n -(e)i(on)i(Softwar)n(e)g(Engine)n(ering)p fl(,)d(pages)i(28{37.)e(IEEE)j(Compu\ -ter)e(So)q(ciet)o(y)l(,)i(1982.)37 793 y([122])22 b(A.)15 b(I.)g(W)l(asserman\ -.)k fi(T)m(utorial:)i(Softwar)n(e)16 b(Development)h(Envir)n(onments)p fl(.)h -(IEEE)d(Computer)g(So)q(ci-)154 849 y(et)o(y)l(,)f(1981.)37 943 y([123])22 b -(G.)14 b(M.)h(W)l(ein)o(b)q(erg.)20 b(Kill)e(that)c(co)q(de!)26 b fi(Infosyst\ -ems)p fl(,)13 b(pages)i(48{49,)e(August)i(1983.)37 1037 y([124])22 b(Reinhard) -c(Wilhelm.)27 b(A)17 b(mo)q(di\014ed)i(tree-to-tree)d(correction)h(problem.) -26 b fi(Information)18 b(Pr)n(o)n(c)n(essing)154 1093 y(L)n(etters)p fl(,)13 b -(12\(3\):127{132,)e(June)17 b(13)d(1981.)37 1187 y([125])22 b(Reb)q(ecca)g -(Wirfs-Bro)q(c)o(k)g(and)f(Brian)h(Wilk)o(erson.)39 b(Ob)s(ject-orien)o(ted) -22 b(design:)33 b(A)21 b(resp)q(onsibilit)o(y-)154 1244 y(driv)o(en)16 b(appr\ -oac)o(h.)j(In)d fi(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)i(OOPSLA)f(`89)p fl(,)g -(pages)g(71{75,)e(Octob)q(er)j(1989.)37 1337 y([126])22 b(Reb)q(ecca)c(Wirfs-\ -Bro)q(c)o(k,)f(Brian)g(Wilk)o(erson,)h(and)f(Lauren)h(Wiener.)25 b fi(Designi\ -ng)17 b(Obje)n(ct-Oriente)n(d)154 1394 y(Softwar)n(e)p fl(.)i(Pren)o(tice-Hal\ -l,)e(1990.)37 1488 y([127])22 b(Reb)q(ecca)c(J.)f(Wirfs-Bro)q(c)o(k)g(and)g -(Ralph)i(E.)d(Johnson.)26 b(A)17 b(surv)o(ey)g(of)f(curren)o(t)h(researc)o -(h)g(in)h(ob)s(ject-)154 1544 y(orien)o(ted)d(design.)21 b fi(Communic)n(atio\ -ns)16 b(of)g(the)g(A)o(CM)p fl(,)e(Septem)o(b)q(er)i(1990.)37 1638 y([128])22 -b(E.)14 b(Y)l(ourdon.)20 b fi(T)m(e)n(chniques)15 b(of)h(Pr)n(o)n(gr)n(am)g -(Structur)n(e)h(and)f(Design)p fl(.)j(Pren)o(tice-Hall,)e(1975.)37 1732 y([12\ -9])22 b(Jonathan)17 b(Zw)o(eig)g(and)g(Ralph)h(Johnson.)26 b(Conduits:)f(A)17 -b(comm)o(unication)h(abstraction)e(in)i(C++.)154 1788 y(In)d fi(Pr)n(o)n(c)n -(e)n(e)n(dings)f(of)j(the)f(USENIX)f(C++)32 b(Workshop)p fl(,)15 b(pages)g -(191{203,)e(1990.)941 2760 y(141)g eop bop 37 374 a fb(Vita)37 596 y fl(Willi\ -am)13 b(F.)d(Op)q(dyk)o(e)i(attended)f(Drexel)h(Univ)o(ersit)o(y)f(in)h(Phila\ -delphi)q(a,)i(P)o(ennsylv)m(ania,)f(where)e(he)g(receiv)o(ed)37 653 y(bac)o -(helor)22 b(of)f(science)i(degrees)f(in)h(computer)e(science)i(and)f(in)g(com\ -merce)f(and)h(engineering)h(sciences,)37 709 y(b)q(oth)18 b(in)h(1979.)26 b -(While)19 b(attending)f(Drexel)g(Univ)o(ersit)o(y)g(he)g(completed)g(computer) -g(related)g(co)q(op)q(erativ)o(e)37 765 y(education)13 b(w)o(ork)d(assignmen) -o(ts)h(at)g(IBM)g(and)h(Sun)g(\(Oil\))g(Co.)18 b(After)11 b(graduating)g(from) -f(Drexel)i(Univ)o(ersit)o(y)l(,)37 822 y(he)k(w)o(ork)o(ed)f(for)f(t)o(w)o -(o)g(y)o(ears)h(in)h(a)e(soft)o(w)o(are)g(qualit)o(y)i(assurance)f(organizati\ -on)g(at)g(Sp)q(erry)g(Univ)m(ac.)108 878 y(Dr.)26 b(Op)q(dyk)o(e)19 b(joined) -f(A)l(T&T)g(Bell)h(Lab)q(oratories)e(in)i(1981.)25 b(He)18 b(receiv)o(ed)h -(an)e(MS)h(degree)g(in)g(Com-)37 935 y(puter)f(Sciences)h(from)d(the)i(Univ)o -(ersit)o(y)g(of)f(Wisconsin)h(-)f(Madison)h(in)g(1982,)e(supp)q(orted)i(under) -g(A)l(T&T's)37 991 y(graduate)g(study)f(program.)24 b(Then,)17 b(at)f(Bell)j -(Labs)e(he)g(help)q(ed)i(plan)e(the)g(ev)o(olution)g(of)g(switc)o(hed)g(digit\ -al)37 1048 y(telecomm)o(unications)22 b(services,)g(and)e(in)o(v)o(estigated) -g(the)h(application)g(of)f(kno)o(wledge-based)h(and)f(relat-)37 1104 y(ed)f -(tec)o(hnologies)g(to)e(assist)h(in)h(v)o(ery)f(large)g(scale)h(soft)o(w)o -(are)d(dev)o(elopmen)o(ts.)29 b(He)19 b(w)o(as)e(appro)o(v)o(ed)h(for)f(the) -37 1161 y(do)q(ctoral)f(supp)q(ort)f(program)f(in)i(1988.)108 1217 y(Dr.)j -(Op)q(dyk)o(e)13 b(pursued)h(his)f(do)q(ctoral)f(researc)o(h)h(under)g(the)g -(sup)q(ervision)h(of)e(Prof.)18 b(Ralph)c(E.)e(Johnson.)37 1274 y(He)k(receiv) -o(ed)g(his)g(PhD)f(from)g(the)g(Univ)o(ersit)o(y)h(of)f(Illinois)j(at)c(Urban\ -a-Champaign)i(in)g(1992.)108 1330 y(Dr.)35 b(Op)q(dyk)o(e)22 b(is)f(curren)o -(tly)g(a)f(Mem)o(b)q(er)g(of)h(T)l(ec)o(hnical)h(Sta\013)e(at)f(A)l(T&T)i(Bel\ -l)h(Lab)q(oratories.)36 b(His)37 1386 y(researc)o(h)16 b(in)o(terests)f(inclu\ -de)j(ob)s(ject-orien)o(ted)e(programming)e(and)i(design,)g(soft)o(w)o(are)e -(restructuring)h(and)37 1443 y(application)i(mo)q(deling)g(using)f(ob)s(ject-\ -orien)o(ted)f(framew)o(orks.)941 2760 y(142)g eop eos @end diff --git a/doc/memo/00modlist.long.txt b/doc/memo/00modlist.long.txt deleted file mode 100644 index 6ea23334..00000000 --- a/doc/memo/00modlist.long.txt +++ /dev/null @@ -1,3481 +0,0 @@ -The Perl 5 Module List - -Maintained by Tim Bunce and Andreas König <modules@perl.org>; -$Revision$ $Date$ -*- coding:utf-8 -*- - -Contents - -Introduction -Where Are The Modules Kept? -Playing Your Part -How To Get a More Recent Copy of the List -Editorial Information and Copyright - -Part 1 - Modules: Creation, Use and Abuse - -1) Perl 5 Module Terminology -2) Guidelines for Module Creation -3) Guidelines for Converting Perl 4 Library Scripts into Modules -4) Guidelines for Reusing Application Code -5) Namespace Coordination - -Part 2 - The Perl 5 Module List - -1) Module Listing Format -2) Perl Core Modules, Perl Language Extensions and Documentation Tools -3) Development Support -4) Operating System Interfaces, Hardware Drivers -5) Networking, Device Control (modems) and InterProcess Communication -6) Data Types and Data Type Utilities -7) Database Interfaces -8) User Interfaces -9) Interfaces to or Emulations of Other Programming Languages -10) File Names, File Systems and File Locking (see also File Handles) -11) String Processing, Language Text Processing, Parsing and Searching -12) Option, Argument, Parameter and Configuration File Processing -13) Internationalization and Locale -14) Authentication, Security and Encryption -15) World Wide Web, HTML, HTTP, CGI, MIME -16) Server and Daemon Utilities -17) Archiving, Compression and Conversion -18) Images, Pixmap and Bitmap Manipulation, Drawing and Graphing -19) Mail and Usenet News -20) Control Flow Utilities (callbacks and exceptions etc) -21) File Handle, Directory Handle and Input/Output Stream Utilities -22) Microsoft Windows Modules -23) Miscellaneous Modules -24) Interface Modules to Commercial Software - -Part 3 - Big Projects Registry - -1) Items in the Todo File -2) Multi-threading -3) Object Management Group CORBA & IDL -4) Expand Tied Array Interface -5) Extend Yacc To Write XS Code -6) Approximate Matching Regular Expressions - -Part 4 - Standards Cross-reference - -4.1) IETF - Internet Engineering Task Force (RFCs) -4.2) ITU - International Telegraph Union (X.*) -4.3) ISO - International Standards Organization (ISO*) - -Part 5 - Who's Who and What's Where - -5.1) Information / Contact Reference Details -5.2) Perl Frequently Asked Questions (FAQ) Files - - ------------------------------------------------------------------------ - -Introduction - -This document is a semi-formal list of Perl 5 Modules. The Perl 4 concept of -packages has been extended in Perl 5 and a new standardised form of reusable -software component has been defined: the Module. - -Perl 5 Modules typically conform to certain guidelines which make them -easier to use, reuse, integrate and extend. - -This list has two key aims: - - * FOR DEVELOPERS: To change duplication of effort into cooperation. - * FOR USERS: To quickly locate existing software which can be reused. - -This list includes the Perl 5 standard modules, other completed modules, -work-in-progress modules and would-be-nice-to-have ideas for modules. It -also includes guidelines for those wishing to create new modules including -how to name them. - -Where Are The Modules Kept? - -Most, but not all, of the modules can be found within CPAN, the -Comprehensive Perl Archive Network of mirrored FTP sites. Within the CPAN -scheme the modules described in this list can be found in the modules/ -directory below the CPAN root directory. CPAN is a worlswide network of -mirrors and you can find your closest mirror in the file -http://www.cpan.org/SITES.html - -NOTE: If you can't find what you want, or wish to check that what you've -found is the latest version, or wonder why a module mentioned in this list -is not on CPAN, you should contact the person associated with the module -(and not the maintainers of the archives or this list). Contact details are -given at the start of Part 5. - -Playing Your Part - -Perl is a huge collaborative effort. Everyone who uses perl is benefiting -from the contributions of many hundreds, maybe thousands, of people. How -much time has perl saved you since you started using it? - -Do you have any modules you could share with others? For example, you may -have some perl4 scripts from which generally useful, and reusable, modules -could be extracted. There may be many people who would find your work very -useful. Please play your part and contribute to the Perl community where you -can. [ end of sermon :-] - -Help save the world! Please submit new entries and updates to us so we can -keep this list up-to-date. Send the new or corrected entry by email to -modules@perl.org . Please do not send code to this address. Instead upload -your module, once registered, to the PAUSE site for forwarding on to CPAN. -See section 2, especially 2.6 and 2.11. - -How To Get a More Recent Copy of the List - -This Module List is fed into CPAN on a semi-regular basis. Its relative path -within a CPAN mirror is in modules/00modlist.long.html . - -Editorial Information and Copyright - -This document is Copyright (c) 1997-2000 by Tim Bunce and Andreas König. -All rights reserved. Permission to distribute this document, in full or -part, via electronic means (emailed, posted or archived) or printed copy is -granted providing that no charges are involved, reasonable attempt is made -to use the most current version, and all credits and copyright notices are -retained. Requests for other distribution rights, including incorporation in -commercial products, such as books, magazine articles, or CD-ROMs should be -made to Tim.Bunce@ig.co.uk and Andreas.Koenig@mind.de . - -Disclaimer: The content of this document is simply a collection of -information gathered from many sources with little or no checking. There are -NO warranties with regard to this information or its use. - -A little background information... I (Tim) created the Module List in August -1994 and maintained it manually till April 1996. By that time Andreas had -implemented the Perl Authors Upload Server (PAUSE) and it was happily -feeding modules through to the CPAN archive sites (see -http://www.cpan.org/modules/04pause.html for details). Since PAUSE held a -database of module information which could be maintained by module authors -it made sense for the module listing part of the Module List to be built -from that database. In April 1996 Andreas took over the automatic posting of -the Module List and I now maintain the other parts of the text. We plan to -add value to the automation over time. - -Part 1 - Modules: Creation, Use and Abuse - -1) Perl 5 Module Terminology - -Perl 5 implements a class using a package, but the presence of a package -doesn't imply the presence of a class. A package is just a namespace. A -class is a package that provides subroutines that can be used as methods. A -method is just a subroutine that expects, as its first argument, either the -name of a package (for "static" methods), or a reference to something (for -"virtual" methods). - -A module is a file that (by convention) provides a class of the same name -(sans the .pm), plus an import method in that class that can be called to -fetch exported symbols. This module may implement some of its methods by -loading dynamic C or C++ objects, but that should be totally transparent to -the user of the module. Likewise, the module might set up an AUTOLOAD -function to slurp in subroutine definitions on demand, but this is also -transparent. Only the .pm file is required to exist. - -2) Guidelines for Module Creation - -2.1 Do similar modules already exist in some form? - -If so, please try to reuse the existing modules either in whole or by -inheriting useful features into a new class. If this is not practical try to -get together with the module authors to work on extending or enhancing the -functionality of the existing modules. A perfect example is the plethora of -packages in perl4 for dealing with command line options. - -If you are writing a module to expand an already existing set of modules, -please coordinate with the author of the package. It helps if you follow the -same naming scheme and module interaction scheme as the original author. - -2.2 Try to design the new module to be easy to extend and reuse. - -Use blessed references. Use the two argument form of bless to bless into the -class name given as the first parameter of the constructor, e.g.: - - sub new { my $class = shift; return bless {}, $class; } - -or even this if you'd like it to be used as either a static or a virtual -method. - - sub new { my $self = shift; my $class = ref($self) || $self; - return bless {}, $class; } - -Pass arrays as references so more parameters can be added later (it's also -faster). Convert functions into methods where appropriate. Split large -methods into smaller more flexible ones. Inherit methods from other modules -if appropriate. - -Avoid class name tests like: die "Invalid" unless ref $ref eq 'FOO'. -Generally you can delete the "eq 'FOO'" part with no harm at all. Let the -objects look after themselves! If it's vital then you can use the UNIVERSAL -methods isa and can. Generally, avoid hardwired class names as far as -possible. - -Avoid $r->Class::func() where using @ISA=qw(... Class ...) and $r->func() -would work (see perlbot man page for more details). - -Use autosplit or the SelfLoader module so little used or newly added -functions won't be a burden to programs which don't use them. Add test -functions to the module after __END__ either using autosplit or by saying: - - eval join('',<main::DATA>) || die $@ unless caller(); - -Does your module pass the 'empty sub-class' test? If you say "@SUBCLASS::ISA -= qw(YOURCLASS);" your applications should be able to use SUBCLASS in -exactly the same way as YOURCLASS. For example, does your application still -work if you change: $obj = new YOURCLASS; into: $obj = new SUBCLASS; ? - -Avoid keeping any state information in your packages. It makes it difficult -for multiple other packages to use yours. Keep state information in objects. - -Always use -w. Try to "use strict;" (or "use strict qw(...);"). Remember -that you can add "no strict qw(...);" to individual blocks of code which -need less strictness. Always use -w. Always use -w! Follow the guidelines in -the perlstyle(1) manual. - -2.3 Some simple style guidelines - -The perlstyle manual supplied with perl has many helpful points. - -Coding style is a matter of personal taste. Many people evolve their style -over several years as they learn what helps them write and maintain good -code. Here's one set of assorted suggestions that seem to be widely used by -experienced developers: - -Use underscores to separate words. It is generally easier to read -$var_names_like_this than $VarNamesLikeThis, especially for non-native -speakers of English. It's also a simple rule that works consistently with -VAR_NAMES_LIKE_THIS. - -Package/Module names are an exception to this rule. Perl informally reserves -lowercase module names for 'pragma' modules like integer and strict. Other -modules normally begin with a capital letter and use mixed case with no -underscores (need to be short and portable). - -You may find it helpful to use letter case to indicate the scope or nature -of a variable. For example: - - $ALL_CAPS_HERE constants only (beware clashes with perl vars) - $Some_Caps_Here package-wide global/static $no_caps_here function - scope my() or local() variables - -Function and method names seem to work best as all lowercase. E.g., -$obj->as_string(). - -You can use a leading underscore to indicate that a variable or function -should not be used outside the package that defined it. - -For method calls use either - - $foo = new Foo $arg1, $arg2; # no parentheses $foo = - Foo->new($arg1, $arg2); - -but avoid the ambiguous form - - $foo = new Foo($arg1, $arg2); # Foo() looks like function call - -It can be very helpful if the names of the classes that your module uses can -be specified as parameters. Consider: - - $dog_class = $args{dog_class} || 'Dog'; $spot = - $dog_class->new(...); - -This allows the user of your module to specify an alternative class -(typically a subclass of the one you would normally have used). - -On how to report constructor failure, Larry said: - -I tend to see it as exceptional enough that I'll throw a real Perl exception -(die) if I can't construct an object. This has a couple of advantages right -off the bat. First, you don't have to check the return value of every -constructor. Just say "$fido = new Doggie;" and presume it succeeded. This -leads to clearer code in most cases. - -Second, if it does fail, you get a better diagnostic than just the -undefinedness of the return value. In fact, the exception it throws may be -quite rich in "stacked" error messages, if it's rethrowing an exception -caught further in. - -And you can always catch the exception if it does happen using eval {}. - -If, on the other hand, you expect your constructor to fail a goodly part of -the time, then you shouldn't use exceptions, but you should document the -interface so that people will know to check the return value. You don't need -to use defined(), since a constructor would only return a true reference or -a false undef. So good Perl style for checking a return value would simply -say - - $conn = new Connection $addr or die "Couldn't create Connection"; - -In general, make as many things meaningful in a Boolean context as you can. -This leads to straightforward code. Never write anything like - - if (do_your_thing() == OK) - -in Perl. That's just asking for logic errors and domain errors. Just write - - if (do_your_thing()) - -Perl is designed to help you eschew obfuscation, if that's your thing. - -2.4 Select what to export. - -Do NOT export method names! Do NOT export anything else by default without a -good reason! - -Exports pollute the namespace of the module user. If you must export try to -use @EXPORT_OK in preference to @EXPORT and avoid short or common names to -reduce the risk of name clashes. - -Generally anything not exported is still accessible from outside the module -using the ModuleName::item_name (or $blessed_ref->method) syntax. By -convention you can use a leading underscore on names to informally indicate -that they are 'internal' and not for public use. - -(It is actually possible to get private functions by saying: my $subref = -sub { ... }; &$subref; But there's no way to call that directly as a method, -since a method must have a name in the symbol table.) - -As a general rule, if the module is trying to be object oriented then export -nothing. If it's just a collection of functions then @EXPORT_OK anything but -use @EXPORT with caution. - -2.5 Select a name for the module. - -This name should be as descriptive, accurate and complete as possible. Avoid -any risk of ambiguity. Always try to use two or more whole words. Generally -the name should reflect what is special about what the module does rather -than how it does it. - -Having 57 modules all called Sort will not make life easy for anyone (though -having 23 called Sort::Quick is only marginally better :-). Imagine someone -trying to install your module alongside many others. If in any doubt ask for -suggestions in comp.lang.perl.modules or modules@perl.org . - -Please use a nested module name to informally group or categorise a module, -e.g., placing a sorting module into a Sort:: category. A module should have -a very good reason not to have a nested name. Please avoid using more than -one level of nesting for module names (packages or classes within modules -can, of course, use any number). - -Module names should begin with a capital letter. Lowercase names are -reserved for special modules such as pragmas (e.g., lib and strict). - -Note that module names are not related to class hierarchies. A module name -Foo::Bar does not in any way imply that Foo::Bar inherits from Foo. Nested -names are simply used to provide some useful categorisation for humans. The -same is generally true for all package names. - -Since the CPAN is huge and growing daily, it's essential that module authors -choose names which lend themselves to browsing. That means minimizing -acronyms, cute names, and jargon. Also, don't make up a new top level -category unless you have a good reason; please choose an already-existing -category when possible. Send mail to modules@perl.org before you upload, so -we can help you select a name. - -If you insist on a name that we consider inappropriate, we won't prevent you -from uploading your module -- but it'll remain in your "author" directory -and won't be directly visible from CPAN/modules/by-module. - -We appreciate the efforts of the contributors who have helped make the CPAN -the world's largest reusable code repository. Please help us enhance it by -working with us to choose the best name possible. - -If you are developing a suite of related modules/classes it's good practice -to use nested classes with a common prefix as this will avoid namespace -clashes. For example: Xyz::Control, Xyz::View, Xyz::Model etc. Use the -modules in this list as a naming guide. - -If adding a new module to a set, follow the original author's standards for -naming modules and the interface to methods in those modules. - -If developing modules for private internal or project specific use, that -will never be released to the public, then you should ensure that their -names will not clash with any future public module. You can do this either -by using the reserved Local::* category or by using an underscore in the top -level name like Foo_Corp::*. - -To be portable each component of a module name should be limited to 11 -characters. If it might be used on DOS then try to ensure each is unique in -the first 8 characters. Nested modules make this easier. - -2.6 Have you got it right? - -How do you know that you've made the right decisions? Have you picked an -interface design that will cause problems later? Have you picked the most -appropriate name? Do you have any questions? - -The best way to know for sure, and pick up many helpful suggestions, is to -ask someone who knows. The comp.lang.perl.modules Usenet newsgroup is read -by just about all the people who develop modules and it's generally the best -place to ask first. If you need more help then try modules@perl.org . - -All you need to do is post a short summary of the module, its purpose and -interfaces. A few lines on each of the main methods is probably enough. (If -you post the whole module it might be ignored by busy people - generally the -very people you want to read it!) - -Don't worry about posting if you can't say when the module will be ready - -just say so in the message. It might be worth inviting others to help you, -they may be able to complete it for you! - -2.7 README and other Additional Files. - -It's well known that software developers usually fully document the software -they write. If, however, the world is in urgent need of your software and -there is not enough time to write the full documentation please at least -provide a README file containing: - - * A description of the module/package/extension etc. - * A copyright notice - see below. - * Prerequisites - what else you may need to have. - * How to build it - possible changes to Makefile.PL etc. - * How to install it. - * Recent changes in this release, especially incompatibilities - * Changes / enhancements you plan to make in the future. - -If the README file seems to be getting too large you may wish to split out -some of the sections into separate files: INSTALL, Copying, ToDo etc. - -2.8 Adding a Copyright Notice. - -How you choose to licence your work is a personal decision. The general -mechanism is to assert your Copyright and then make a declaration of how -others may copy/use/modify your work. - -Perl, for example, is supplied with two types of licence: The GNU GPL and -The Artistic License (see the files README, Copying and Artistic). Larry has -good reasons for NOT just using the GNU GPL. - -My personal recommendation, out of respect for Larry, Perl and the perl -community at large is to simply state something like: - - Copyright (c) 1997 Your Name. All rights reserved. This program is - free software; you can redistribute it and/or modify it under the - same terms as Perl itself. - -This statement should at least appear in the README file. You may also wish -to include it in a Copying file and your source files. Remember to include -the other words in addition to the Copyright. - -2.9 Give the module a version/issue/release number. - -To be fully compatible with the Exporter and MakeMaker modules you should -store your module's version number in a non-my package variable called -$VERSION. This should be a valid floating point number with at least two -digits after the decimal (ie hundredths, e.g, $VERSION = "0.01"). See -Exporter.pm for details. - -Don't use a "1.3.2" style version directly. If you use RCS or a similar -system which supports multilevel versions/branches you can use this (but put -it all on one line for MakeMaker VERSION_FROM): - -$VERSION = do { my @r=(q$Revision$=~/\d+/g); sprintf -"%d."."%02d"x$#r,@r }; - -It may be handy to add a function or method to retrieve the number. Use the -number in announcements and archive file names when releasing the module -(ModuleName-1.02.tar.gz). See perldoc ExtUtils::MakeMaker.pm for details. - -2.10 Listing Prerequisites in a Bundle module - -If your module needs some others that are available on CPAN, you might -consider creating a 'bundle' module that lists all the prerequisites in a -standardized way. Automatic installation software such as the CPAN.pm module -can take advantage of such a listing and enable your users to install all -prerequisites and your own module with one single command. See the CPAN.pm -module for details. - -2.11 How to release and distribute a module. - -By far the best way to release modules is to register yourself with the Perl -Authors Upload Server (PAUSE). By registering with PAUSE you will be able to -easily upload (or mirror) your modules to the PAUSE server from where they -will be mirrored to CPAN sites across the planet. - -It's good idea to post an announcement of the availability of your module to -the comp.lang.perl.announce Usenet newsgroup. This will at least ensure very -wide once-off distribution. - -If not using PAUSE you should place the module into a major ftp archive and -include details of it's location in your announcement. Some notes about ftp -archives: Please use a long descriptive file name which includes the version -number. Most incoming directories will not be readable/listable, i.e., you -won't be able to see your file after uploading it. Remember to send your -email notification message as soon as possible after uploading else your -file may get deleted automatically. Allow time for the file to be processed -and/or check the file has been processed before announcing its location. - -FTP Archives for Perl Modules: - -Follow the instructions and links on - -http://www.cpan.org/modules/04pause.html - -or upload to: - -ftp://pause.kbx.de/incoming - -and notify upload@pause.kbx.de . - -By using the PAUSE WWW interface you can ask the Upload Server to mirror -your modules from your ftp or WWW site into your own directory on CPAN. -Please remember to send us an updated entry for the Module list! - -2.12 Take care when changing a released module. - -Always strive to remain compatible with previous released versions (see 2.2 -above) Otherwise try to add a mechanism to revert to the old behaviour if -people rely on it. Document incompatible changes. - -3) Guidelines for Converting Perl 4 Library Scripts into Modules - -3.1 There is no requirement to convert anything. - -If it ain't broke, don't fix it! Perl 4 library scripts should continue to -work with no problems. You may need to make some minor changes (like -escaping non-array @'s in double quoted strings) but there is no need to -convert a .pl file into a Module for just that. See perltrap.pod for details -of all known perl4-to-perl5 issues. - -3.2 Consider the implications. - -All the perl applications which make use of the script will need to be -changed (slightly) if the script is converted into a module. Is it worth it -unless you plan to make other changes at the same time? - -3.3 Make the most of the opportunity. - -If you are going to convert the script to a module you can use the -opportunity to redesign the interface. The 'Guidelines for Module Creation' -above include many of the issues you should consider. - -3.4 The pl2pm utility will get you started. - -This utility will read *.pl files (given as parameters) and write -corresponding *.pm files. The pl2pm utilities does the following: - - * Adds the standard Module prologue lines - * Converts package specifiers from ' to :: - * Converts die(...) to croak(...) - * Several other minor changes - -Being a mechanical process pl2pm is not bullet proof. The converted code -will need careful checking, especially any package statements. Don't delete -the original .pl file till the new .pm one works! - -4) Guidelines for Reusing Application Code - -4.1 Complete applications rarely belong in the Perl Module Library. - -4.2 Many applications contain some perl code which could be reused. Help -save the world! Share your code in a form that makes it easy to reuse. - -4.3 Break-out the reusable code into one or more separate module files. - -4.4 Take the opportunity to reconsider and redesign the interfaces. - -4.5 In some cases the 'application' can then be reduced to a small fragment -of code built on top of the reusable modules. In these cases the application -could invoked as: - -5) Namespace Coordination - -The maintainers of the module list are not the Internic for perl namespaces. -They do neither sell namespaces nor can they establish property rights. What -they try to do is to minimize namespace clashes and maximize usablility of -the CPAN archive by setting up a catalogue of modules and control the -indexers. Time permitting, they will also try to give advice for what they -think is a proper usage of the namespace. - -It is an important part of the namespace concept that the module list -maintainers do not guarantee to you that somebody else won't use the, say, -Foo::Bar namespace. The upload area is not censored except for abuse. People -are free to upload any modules they like. Instead, there are several levels -of protection for your namespaces: - -a) The most important is the module list which actually lists and proclaims -your namespace. - -b) The second is the indexing mechanism of the CPAN. Modules are indexed on -a first-come-first-serve basis. The module namespace that is uploaded for -the first time ever gets indexed, but not the module of the second one who -tries to use the same namespace. - -c) As the whole process is trying to benefit the community, all parties are -subject to a wider monitoring within the community. This is sometimes -referred to as security by visibility. - -d) So the next level of namespace protection is the common sense. Your own -common sense. Help to save the world. If you get the impression that -something goes wrong with regard to namespaces, please write to -modules@perl.org and let them know. - -e) The perhaps most interesting namespace protection is provided by the perl -symbol table itself. A namespace Foo:: is just a package name and its -relationship to a namespace Foo::Bar:: is not predetermined whatsoever. The -two namespaces can be closely or loosely related or not related at all, but -what's most important, they can be writen by different authors who may work -rather independently from each other. So if you have registered any -namespace, it does not mean that you own the whole namespace tree that -starts there. If you are registered as the contact for Foo::Bar, you are not -necessarily also associated with Foo::Bar::Baz. - -f) In a few rare cases the module list people restrict indexing of certain -categories. For example: DBI::* under the control of Tim Bunce Sun::* under -the control of Sun Microsystems - -Part 2 - The Perl 5 Module List - -The remainder of this document is divided up into sections. Each section -deals with a particular topic and lists all known modules related to that -topic. Modules are only listed in one section so check all sections that -might related to your particular needs. - -All the information corresponds to the latest updates we have received. We -don't record the version number or release dates of the listed Modules. Nor -do we record the locations of these Modules. Consult the contact, try the -usual perl CPAN sites or ask in comp.lang.perl.modules. Please do *not* ask -us directly, we simply don't have the time. Sorry. - -1) Module Listing Format - -Each Module listing is very short. The main goal is to simply publish the -existence of the modules, or ideas for modules, and enough contact -information for you to find out more. Each listing includes some characters -which convey (approximate) basic status information. - -For example: - -Name DSLI Description Info -------------- ---- -------------------------------------------- ----- -Fcntl Sdcf Defines fcntl() constants (see File::Lock) JHI - -Where the 'DSLI' characters have the following meanings: - - * D - Development Stage (Note: *NO IMPLIED TIMESCALES*): - * - o i - Idea, listed to gain consensus or as a placeholder - o c - under construction but pre-alpha (not yet released) - o a/b - Alpha/Beta testing - o R - Released - o M - Mature (no rigorous definition) - o S - Standard, supplied with Perl 5 - - * S - Support Level: - * - o m - Mailing-list - o d - Developer - o u - Usenet newsgroup comp.lang.perl.modules - o n - None known, try comp.lang.perl.modules - - * L - Language Used: - * - o p - Perl-only, no compiler needed, should be platform independent - o c - C and perl, a C compiler will be needed - o h - Hybrid, written in perl with optional C code, no compiler - needed - o + - C++ and perl, a C++ compiler will be needed - o o - perl and another language other than C or C++ - - * I - Interface Style - * - o f - plain Functions, no references used - o h - hybrid, object and function interfaces available - o n - no interface at all (huh?) - o r - some use of unblessed References or ties - o O - Object oriented using blessed references and/or inheritance - -Where letters are missing they can usually be inferred from the others. For -example 'i' implies 'id', 'S' implies 'Su'. - -The Info column gives a contact reference 'tag'. Lookup this tag in the -"Information / Contact Reference Details" section in Pert 3 of this -document. If no contact is given always try asking in -comp.lang.perl.modules. - -Most Modules are nested in categories such as IPC::Open2 and IPC::Open3. -These are shown as 'IPC::' on one line then each module listed below with a -'::' prefix. - -Ideas For Adoption - -Modules listed as in the 'i' Development Stage with no contact reference are -ideas without an owner. Feel free to 'adopt' these but please let me know so -that we can update the list and thus inform anyone else who might be -interested. Adoption simply means that you either hope to implement the -module one day or would like to cooperate with anyone else who might be -interested in implementing it. - -Cooperation - -Similarly, if an idea that interests you has been adopted by someone please -contact them so you can share ideas. Just because an idea has been adopted -does NOT imply that it's going to be implemented. Just because a module is -listed and being implemented does NOT mean it'll get finished. Waiting -silently in the hope that the Module will appear one day is unlikely to be -fruitful! Offer to help. Cooperate. Pool your efforts. Go on, try it! - -The same applies to modules in all states. Most modules are developed in -limited spare time. If you're interested in a module don't just wait for it -to happen, offer to help. - -Module developers should feel free to announce incomplete work early. If -you're not going to be able to spend much time on something then say so. If -you invite cooperation maybe someone will implement it for you! - -2) Perl Core Modules, Perl Language Extensions and Documentation Tools - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -CORE Sucf Internal package for perl native functions P5P -UNIVERSAL SucO Internal universal base-class JACKS -SUPER SucO Internal class to access superclass methods P5P -DynaLoader SucO Dynamic loader for shared libraries P5P -AutoLoader SupO Automatic function loader (using AutoSplit) P5P -SelfLoader SdpO Automatic function loader (using __DATA__) JACKS -Exporter SupO Implements default import method for modules P5P -Carp Supf Throw exceptions outside current package P5P -Config Supf Stores details of perl build configuration P5P -English Supf Defines English names for special variables P5P -Symbol SupO Create 'anonymous' symbol (typeglobs) refs CHIPS -Opcode Supf Disable named opcodes when compiling code TIMB -Taint bdpf Utilities related to tainting PHOENIX - -Perl Pragmatic Modules - -constant Supf Define compile-time constants P5P -diagnostics Sdpf For reporting perl diagnostics in full form TOMC -enum cdpf resemble enumerated types in C ZENIN -integer Supf Controls float vs. integer arithmetic P5P -less Supf Controls optimisations (yet unimplemented) P5P -lib Supf Simple way to add/delete directories in @INC P5P -overload SdpO Overload perl operators for new data types ILYAZ -sigtrap Supf For trapping an abort and giving a traceback P5P -strict Supf Controls averments (similar to pragmas) P5P -subs Supf use subs qw(x y); is short for sub x; sub y; P5P -vars Supf predeclare variable names P5P - -Experimental pragmatic modules live in the ex:: namespace - -ex:: -::implements RdpO Study in Polymorphism PDCAWLEY -::interface RdpO Another study in polymorphism PDCAWLEY -::override Rdpf perl pragma to override core functions CTWETEN - -ex::constant:: -::vars Rdph Perl pragma to create readonly variables CTWETEN - -Perl Language Extensions - -Alias bdcf Convenient access to data/code via aliases GSAR -End RdpO Generalized END {}. ABIGAIL -Error adpO Error/exception handling in an OO-ish way GBARR -Perl adcO Create Perl interpreters from within Perl GSAR -Protect bdpf declare subs private or member JDUNCAN -Regexp adcO An OO interface to regular expressions GBARR -Safe SdcO Restrict eval'd code to safe subset of ops MICB -Softref bdcf Extension for weak/soft referenced SVs ILYAZ - -Inline adp? Easy way to use other languages in Perl INGY -Inline:: -::CPR adpn C Perl Run - Embed Perl in C, ala Inline INGY -::C bdpn Write C extensions in Perl the easy way INGY -::CPP adpO Easy implementation of C++ extensions NEILW -::Python adpO Easy implementation of Python extensions NEILW - -Exporter:: -::Import Rdpn Alternate symbol exporter GARROW -::Options adpO Extends Exporter to handle use-line options YSTH -::PkgAlias adpf Load a module into multiple namespaces JDPORTER - -Safe:: -::Hole bdcO Exec subs in the original package from Safe SEYN - -Symbol:: -::Table RdpO OO interface to package symbols GARROW - -Test Sdpf Utilities for writing test scripts JPRIT -Test:: -::Cmd RdpO Portable test infrastructure for commands KNIGHT -::Harness Supf Executes perl-style tests P5P -::Unit adpO simple framework for unit testing CLEMBURG -::Suite cdpO tbs HENKE -::Case cdpO tbs HENKE - -The Perl Compiler - -B aucO The Perl Compiler MICB -O aucO Perl Compiler frontends MICB - -B:: -::Fathom bdpO Estimate the readability of Perl code KSTAR -::Graph bdpr Perl Compiler backend to diagram OP trees SMCCAM -::LexInfo bdcO Show info about subroutine lexical variables DOUGM -::Size bdcO Measure size of Perl OPs and SVs DOUGM -::TerseSize bdpO Info about ops and their (estimated) size DOUGM - -Source Code Filters - -Filter::Util:: -::Exec bdcf Interface for creation of coprocess Filters PMQS -::Call bdcf Interface for creation of Perl Filters PMQS - -Filter:: -::exec bdcf Filters script through an external command PMQS -::sh bdcf Filters script through a shell command PMQS -::cpp bdcf Filters script through C preprocessor PMQS -::tee bdcf Copies to file perl source being compiled PMQS -::decrypt bdcf Template for a perl source decryption filter PMQS - -Thread support (note that these are experimental, i.e. pre-alpha) - -Thread cuhO Manipulate threads in Perl (EXPERIMENTAL) P5P - -Thread:: -::Group bdph Wait()-like and grouping functions DSUGAL -::IO i IO routines DSUGAL -::Object i OO routines DSUGAL -::Pool bdpO Worker pools to run Perl code asynchronously MICB -::Queue cuph Thread-safe queues P5P -::Semaphore cuph Thread-safe semaphores P5P -::Signal cuhh A thread which runs signal handlers reliably P5P -::Specific cuhh Thread-specific keys P5P - -Module Support - -Module:: -::Reload Rdpf Reloads files in %INC based on timestamps JPRIT - -Documentation Tools: - -Pod:: -::Diff cdpf compare two POD files and report diff IANC -::HTML cdpr converter to HTML KJALB -::Index cdpr index generator KJALB -::Latex cdpr converter to LaTeX KJALB -::LaTeX bdpO Converts pod to latex with Pod::Parser TJENNESS -::Lint cdpO Lint-style validator for pod NEILB -::Lyx adpO A pod to LyX format conversion class RICHARDJ -::Man cdpr converter to man page KJALB -::MIF adpO converter to FrameMaker MIF JNH -::Parser bdpO Base class for parsing pod syntax BRADAPP -::Pdf bdpf Converter to PDF AJFRY -::Pod cdpr converter to canonical pod KJALB -::RTF cdpr converter to RTF KJALB -::Sdf cdpf converter to SDF IANC -::Select bdpf Print only selected sections of pod docs BRADAPP -::Simplify cdpr Common pod parsing code KJALB -::Texinfo cdpr converter to texinfo KJALB -::Text Supf convert POD data to formatted ASCII text TOMC -::Usage bdpf Print Usage messages based on your own pod BRADAPP -::Rtf RdpO Converter from POD to Rich Text Format PVHP -::Hlp RdpO Convert POD to formatted VMS Help text PVHP -::XML RdpO Generate XML from POD MSERGEANT -::PP idpO A Pod pre-processor RAM - -3) Development Support - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -AutoSplit Supf Splits modules into files for AutoLoader P5P -Benchmark Supf Easy way to time fragments of perl code P5P -Conjury Rdp? Generic software construction toolset JWOODYATT -Coy Rdpn Like Carp - only prettier DCONWAY -FindBin adpf Locate current script bin directory GBARR -Include adpO Parse C header files for use in XS GBARR -Make adpO Makefile parsing, and 'make' replacement NI-S -Usage bupr Type and range checking on subroutine args JACKS - -ExtUtils:: -::DynaGlue adcr Methods for generating Perl extension files DOUGM -::MakeMaker SupO Writes Makefiles for extensions MMML -::Manifest Supf Utilities for managing MANIFEST files MMML -::Typemap i xsubpp typemap handling WPS -::Embed Sdpf Utilities for embedding Perl in C/C++ apps DOUGM -::F77 RdpO Facilitate use of FORTRAN from Perl/XS code KGB - -Carp:: -::Assert adpf Stating the obvious to let the computer know MSCHWERN -::CheckArgs Rdpf Check subroutine argument types GARROW - -Devel:: -::CallerItem RupO 'caller()' Object wrapper + useful methods JACKS -::CoreStack adpf generate a stack dump from a core file ADESC -::Coverage adpf Coverage analysis for Perl code RJRAY -::Datum cdpf Debugging And Tracing Ultimate Module CDE -::DebugAPI bdpf Interface to the Perl debug environment JHA -::DebugInit i Create a .gdbinit or similar file JASONS -::DProf Rdcf Execution profiler DMR -::DumpStack Rupf Dumping of the current function stack JACKS -::Leak Rdcf Find perl objects that are not reclaimed NI-S -::PPPort bdcn Portability aid for your XS code KJALB -::Peek adcf Peek at internal representation of Perl data ILYAZ -::RegExp adcO Access perl internal regex functions ILYAZ -::SmallProf Rdpf Line-by-line profiler ASHTED -::StackTrace RdpO Stacktrace object w/ info like Carp::confess DROLSKY -::Symdump RdpO Perl symbol table access and dumping ANDK -::TraceFuncs adpO Trace funcs by using object destructions JOEHIL -::TraceLoad Rdpf Traces the loading of perl source code JPRIT -::Modlist Rdpf Collect module use information RJRAY - -Exception:: -::Class bdpO Declare exception class hierarchies DROLSKY -::Cxx Rd+f Cause perl to longjmp using C++ exceptions JPRIT - -Perf:: Performance measurement other than benchmarks -::ARM adcf Application Response Measurement BBACKER - -Rcs adcf Alternate RCS interface (see VCS::RCS) CFRETER -VCS ampO Generic interface to Version Control Systems LBROCARD - -VCS:: -::CVS RdpO Interface to GNU's CVS RSAVAGE -::PVCS i PVCS Version Manager (intersolv.com) BMIDD -::RCS idpf Interface layer over RCS (See also Rcs) RJRAY -::RCE idcf Perl layer over RCE C API RJRAY - -ClearCase idcf Environment for ClearCase revision control BRADAPP -ClearCase:: -::Ct Mnpf Generic cleartool wrapper DSB - -Sub:: -::Curry Rdpf Perl module to curry functions ((á la Lisp)) DAVIDH - -Perlbug RdpO Database driven bug tracking system RFOLEY - -Continuus adpO Interface to Continuus Code Management tool HENKE - -4) Operating System Interfaces, Hardware Drivers - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Env Supf Alias environment variables as perl vars P5P -Errno cdpf Constants from errno.h EACCES, ENOENT etc GBARR -Fcntl Sdcf Defines fcntl() constants (see File::Lock) JHI -Ioctl adcf ioctl(2) constants JPRIT -POSIX SupO An interface to most (all?) of POSIX.1 P5P -Shell Supf Run shell commands transparently within perl P5P - -Async:: -::Group adpO Deal with simultaneous asynchronous calls DDUMONT -::Process i class to run sub-processes DDUMONT - -BSD:: -::HostIdent i s/gethostname(), s/gethostid() JHI -::Ipfwgen bdpf Generate ipfw(8) filters MUIR -::Resource Rdcf getrusage(), s/getrlimit(), s/getpriority() JHI - -Env:: -::Path adpO Advanced operations on path variables DSB - -Proc:: -::Background RdpO OS independent background process objects BZAJAC -::ExitStatus Rdpf Interpret and act on wait() status values ROSCH -::Forkfunc Rdpf Simple lwall-style fork wrapper MUIR -::ProcessTable adcO Unix process table information DURIST -::SafePipe bdpf popen() and `` without calling the shell ROSCH -::Short adpO System calls with timeout option JHKIM -::Simple adpO Fork wrapper with objects MSCHILLI -::Spawn Rdpf Run external programs GARROW -::SyncExec Rdpf Spawn processes but report exec() errors ROSCH -::times adpf By-name interface to process times function TOMC - -GTop bdcO Perl interface to libgtop DOUGM - -Schedule:: See also Schedule:: in chapter 23 -::At Rd OS independent interface to the at command JOSERODR -::ByClock adpO Return at given times SCHAFFTER -::Cron adpO cron-like scheduler for perl subroutines ROLAND -::Load RdpO Remote system load, processes, scheduling WSNYDER - -Quota Rdcf Disk quota system functions, local & remote TOMZO - -Sys:: -::AlarmCall Rupf Timeout on any sub. Allows nested alarms JACKS -::Hostname Supf Implements a portable hostname function P5P -::Sysconf bdpf Defines constants for POSIX::sysconf() NI-S -::Syslog Supf Provides same functionality as BSD syslog P5P - - Note: The Sys:: namespace is considered harmful as it is giving no - clue about which system. Placing additional modules into this - namespace is discouraged. - -Platform Specific Modules - -Be:: -::Attribute Rd+f Manipulate BeOS BFS MIME file attributes TSPIN -::Query Rd+f Query a BeOS file system TSPIN - -FreeBSD:: -::SysCalls cdcf FreeBSD-specific system calls GARY - -Mac:: Macintosh specific modules -::AppleEvents bmcO AppleEvent manager and AEGizmos MCPL -::AssistantFrames RdpO Easy creation of assistant dialogs GBAUER -::Components bmcO (QuickTime) Component manager MCPL -::Files bmcO File manager MCPL -::Gestalt bmcO Gestalt manager: Environment enquiries MCPL -::Glue bdpO Control apps with AppleScript terminology CNANDOR -::Macbinary bdpO Decodes MacBinary files. MIYAGAWA -::Memory bmcO Memory manager MCPL -::MoreFiles bmcO Further file management routines MCPL -::OSA bmcO Open Scripting Architecture MCPL -::Processes bmcO Process manager MCPL -::Resources bmcO Resource manager MCPL -::Serial bdpO Interface to Macintosh serial ports DIVERDI -::Types bmcO (Un-)Packing of Macintosh specific types MCPL - -Mac::AppleEvents:: -::Simple Rdph Simple access to Mac::AppleEvents CNANDOR - -Mac::Apps:: -::Anarchie RdpO Control Anarchie 2.01+ CNANDOR -::Launch Rdpf MacPerl module to launch / quit apps CNANDOR -::MacPGP RdpO Control MacPGP 2.6.3 CNANDOR -::PBar RdpO Control Progress Bar 1.0.1 CNANDOR - -Mac::Comm:: -::OT_PPP RdpO Control Open Transport PPP / Remote Access CNANDOR - -Mac::FileSpec:: -::Unixish Mdpf Unixish-compatability in filespecs SBURKE - -Mac::OSA:: -::Simple Rdph Simple access to Mac::OSA CNANDOR - -MSDOS:: -::Attrib bdcf Get/set DOS file attributes in OS/2 or Win32 CJM -::Descript bdpO Manage 4DOS style DESCRIPT.ION files CJM -::SysCalls adcf MSDOS interface (interrupts, port I/O) DMO - -MVS:: -::VBFile bdpf Read MVS VB (variable-length) files GROMMEL - -NeXTStep:: -::NetInfo idcO NeXTStep's NetInfo (like ONC NIS) PGUEN - -Netware:: -::NDS cd+O Interface to Novell Directory Services KTHOMAS -::Bindery cd+O Interface to Novell Bindery mode calls KTHOMAS - -OS2:: -::ExtAttr RdcO (Tied) access to extended attributes ILYAZ -::FTP bncf Access to ftplib interface ILYAZ -::PrfDB RdcO (Tied) access to .INI-style databases ILYAZ -::REXX RdcO Access to REXX DLLs and REXX runtime ILYAZ -::UPM bncf User Profile Management ILYAZ - -Riscos i Namespace for Risc-OS (Acorn et.al.) RISCOSML - -SGI:: -::SysCalls cdcf SGI-specific system calls AMOSS -::GL adcr SGI's Iris GL library AMOSS -::FM adcr SGI's Font Management library AMOSS -::FAM RdcO Interface to SGI/Irix File Access Monitor JGLICK - -Solaris:: -::ACL adch Provides access to ACLs in Solaris IROBERTS -::Kmem idcf Read values from the running kernel ABURLISON -::Kstat adcO Access kernel performance statistics ABURLISON -::MIB idcO Access STREAMS network statistics ABURLISON -::MapDev bdpf Maps sdNN disk names to cNtNdN disk names ABURLISON -::NDD idcO Access network device statistics ABURLISON -::Procfs adhh Access to the Solaris /proc filesystem JNOLAN -::InstallDB bdp? Searches for Solaris package/system info CHRISJ -::Package bdpO Access a Solaris package pkginfo file CHRISJ -::Contents bdp? Access a Solaris contents file CHRISJ - -Unix:: -::ConfigFile adpO Abstract interfaces to Unix config files SSNODGRA -::Processors RdcO Interface to per-processor information WSNYDER -::Syslog i Interface to syslog functions in a C-library MHARNISCH -::UserAdmin Rdpf Interface to Unix Account Information JZAWODNY - -VMS:: -::Device Rdcr Access info about any device on a VMS system DSUGAL -::Filespec Sdcf VMS and Unix file name syntax CBAIL -::ICC bdcr Interface to the ICC facilities in VMS 7.2+ DSUGAL -::Lock cncO Object interface to $ENQ (VMS lock mgr) BHUGHES -::Misc Rdcr Miscellaneous VMS utility routines DSUGAL -::Monitor Rdcr Access VMS system performance info DSUGAL -::Persona Rdcf Interface to the VMS Persona services DSUGAL -::Priv Rdcf Access VMS Privileges for processes DSUGAL -::Process Rdcf Process management on VMS DSUGAL -::Queue bdcf Manage queues and entries DSUGAL -::SysCalls i VMS-specific system calls CBAIL -::System Rdcf VMS-specific system calls DSUGAL -::User bdcr Read access to system UAF data DSUGAL - -Portable Digital Assistants - -PDA:: -::Pilot amcO Interface to pilot-link library KJALB -::PilotDesktop i Managing Pilot Desktop databases software JWIEGLEY - -Hardware related modules - -Hardware:: -::Simulator adpf Simulate different pieces of hardware GSLONDON - -Device:: -::SerialPort bdpO POSIX clone of Win32::SerialPort BBIRTH -::SVGA c SVGA Graphic card driver SCOTTVR - -Device::ISDN:: -::OCLM bd?? Perl interface to the 3com OCLM ISDN TA MERLIN - -5) Networking, Device Control (modems) and InterProcess Communication - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Socket Smcf Defines socket-related constants GNAT -Socket6 adcf getaddrinfo/getnameinfo support module UMEMOTO -Ptty adcf Pseudo terminal interface functions NI-S - -Socket:: -::PassAccessRights adcf Pass file descriptor via Unix domain socket SAMPO - -Net:: -::ACAP adpO Interface to ACAP Protocol (Internet-Draft) KJOHNSON -::AIM adpO AOL Instant Messenger TOC protocol ARYEH -::AOLIM bdpO AOL Instant Messenger OO Interface (TOC) RWAHBY -::Bind adpO Interface to bind daemon files KJOHNSON -::CDDB cdpr Interface to the CDDB (CD Database) DSTALDER -::Cmd cdpO For command based protocols (FTP, SMTP etc) GBARR -::DLookup adpO Lookup domains on Internic and 2-letter TLDs DJASMINE -::DNS bdpO Interface to the DNS resolver MFUHR -::Daemon adpO Abstract base class for portable servers JWIED -::Dict cdpO Client of Dictionary Server Protocol (DICT) ABIGAIL -::Dnet cdcO DECnet-specific socket usage SPIDB -::Domain adpf Try to determine TCP domain name of system GBARR -::DummyInetd RdpO A dummy Inetd server GBARR -::FTP adpf Interface to File Transfer Protocol GBARR -::Gen RdcO Generic support for socket usage SPIDB -::Goofey RdpO Communicate with a Goofey server GOSSAMER -::Hotline RdpO Interface to the Hotline protocol JSIRACUSA -::ICAP adpO Interface to ICAP Protocol (Internet-Draft) KJOHNSON -::ICB bdpO ICB style chat server interface JMV -::IMAP adpO Interface to IMAP Protocol (RFC2060) KJOHNSON -::IRC cdpO Internet Relay Chat interface DSHEPP -::Ident RdpO Performs ident (rfc1413) lookups JPC -::Inet RdcO Internet (IP) socket usage SPIDB -::Interface adcO ifconfig(1) implementation SRZ -::Jabber ampO Access to the Jabber protocol REATMON -::LDAP adpO Interface to LDAP Protocol (RFC1777) PLDAP -::LDAPapi Rdcf Interface to UMICH and Netscape LDAP C API CDONLEY -::MsgLink cdpO Abstraction of "user" part for message link RAM -::NIS adcO Interface to Sun's NIS RIK -::NISPlus adcO Interface to Sun's NIS+ RIK -::NNTP adpO Client interface to NNTP protocol GBARR -::Netmask RdpO Understand and manipulate network blocks MUIR -::Netrc adpO Support for .netrc files GBARR -::PH RdpO CCSO Nameserver Client class GBARR -::POP3 adpO Client interface to POP3 protocol GBARR -::Patricia RdcO Patricia Trie perl module for fast IP addres PLONKA -::Pcap adcr An interface for LBL's packet capture lib PLISTER -::Ping SupO TCP and ICMP ping RMOSE -::Printer RdpO Direct to lpd printing CFUHRMAN -::SMTP adpf Interface to Simple Mail Transfer Protocol GBARR -::SNMP adpO Interface to SNMP Protocol (RFC1157) GBARR -::SNPP cdpO Client interface to SNPP protocol GBARR -::SOCKS cdcf TCP/IP access through firewalls using SOCKS SCOOPER -::SSLeay bmhf Secure Socket Layer (based on OpenSSL) SAMPO -::Syslog RdpO Forwarded syslog protocol LHOWARD -::TCP RdcO TCP-specific socket usage SPIDB -::TFTP cdpf Interface to Trivial File Transfer Protocol GSM -::Telnet RdpO Interact with TELNET port or other TCP ports JROGERS -::Time adpf Obtain time from remote machines GBARR -::Traceroute bdpO Trace routes HAG -::UDP RdcO UDP-specific socket usage SPIDB -::VNC i??? Interface VNC remote frame buffer protocol BRONG -::hostent adpf A by-name interface for hosts functions TOMC -::netent adpf A by-name interface for networks functions TOMC -::protoent adpf A by-name interface for protocols functions TOMC -::servent adpf A by-name interface for services functions TOMC -::xAP adpO Interface to IMAP,ACAP,ICAP substrate KJOHNSON -::Z3950 adcO OO interface to the Yaz Z39.50 toolkit MIRK -::SSL RdcO Glue that enables LWP to access https URIs CHAMAS -::Pager RdpO Send Numeric/AlphaNumeric Pages to any pager ROOTLEVEL -::Whois RdpO Get+parse "whois" domain data from InterNIC DHUDES -::XWhois RdpO Whois Client Interface for Perl5. VIPUL -::ICQ bmpO Client interface to ICQ messaging JMUHLICH - -Net::Daemon:: -::SSL RdpO SSL extension for Net::Daemon MKUL - -Net::IMAP:: -::Simple bdpO Only implements the basic IMAP features JPAF - -Net::SNMP:: -::Interfaces RdpO Obtain network interface info via SNMP JSTOWE - -Net::Telnet:: -::Cisco RdpO Net::Telnet wrapper for Cisco devices JOSHUA - -NetAddr:: -::IP RdpO Manipulation and operations on IP addresses LUISMUNOZ - -IPC:: -::Cache adpO Shared-memory object cache DCLINTON -::Chat2 ? Out-of-service during refit! GBARR -::ChildSafe RdcO Control child process w/o risk of deadlock DSB -::Globalspace cdpO Multi-process shared hash and shared events JACKS -::LDT Rdpf Implements a length based IPC protocol JSTENZEL -::Locker RdpO Shared semaphore locks across a network WSNYDER -::Mmap i Interface to Unix's mmap() shared memory MICB -::Open2 Supf Open a process for both reading and writing P5P -::Open3 Supf Like IPC::Open2 but with error handling P5P -::Run bdph Child procs w/ piping, redir and psuedo-ttys RBS -::Session anpO remote shell session mgr; wraps open3() STEVEGT -::Shareable bdpr Tie a variable to shared memory BSUGARS -::SharedCache Rmpr Manage a cache in SysV IPC shared memory SAMTREGAR -::Signal Rdpf Translate signal names to/from numbers ROSCH -::SysV adcr shared memory, semaphores, messages etc JACKS -::XPA adch Interface to SAO XPA messaging system DJERIUS - -RPC:: Remote Procedure Calls (see also DCE::RPC) -::PlServer RdpO Interface for building Perl Servers JWIED -::PlClient RdpO Interface for building pServer Clients JWIED -::ONC adcO ONC RPC interface (works with perlrpcgen) JAKE -::Simple adpO Simple OO async remote procedure calls DDUMONT - -DCE:: Distributed Computing Environment (OSF) -::ACL bdcO Interface to Access Control List protocol PHENSON -::DFS bdcO DCE Distributed File System interface PHENSON -::Login bdcO Interface to login functions PHENSON -::RPC c Remote Procedure Calls PHENSON -::Registry bdcO DCE registry functions PHENSON -::Status bdpr Make sense of DCE status codes PHENSON -::UUID bdcf Misc uuid functions PHENSON - -NetPacket:: -::ARP adpO Address Resolution Protocol TIMPOTTER -::Ethernet adpO Ethernet framed data TIMPOTTER -::IGMP adpO Internet Group Management Protocol TIMPOTTER -::IP adpO Internet Protocol TIMPOTTER -::TCP adpO Transmission Control Protocol TIMPOTTER -::UDP adpO User Datagram Protocol TIMPOTTER - -Proxy i Transport-independent remote processing MICB -Proxy:: -::Tk ? Tk transport class for Proxy (part of Tk) MICB - -Fwctl bmpO Interface to Linux packet filtering firewall FRAJULAC -LSF cdcO Interface to the Load Sharing Facility API PFRANCEUS -TFTP bdpO Interface to TFTP (rfc1350) GSM -ToolTalk adcr Interface to the ToolTalk messaging service MARCP - -SOAP cmpO SOAP/Perl language mapping KBROWN - -IPChains RdcO Create and Manipulate ipchains JESSICAQ -IPChains:: -::PortFW bdpO Interface to ipmasqadm portfw command FRAJULAC - -SNMP RdcO Interface to the UCD SNMP toolkit GSM -SNMP:: -::Monitor adpO Accounting and graphical display JWIED -::Util RdpO Perform SNMP set,get,walk,next,walk_hash,... WMARQ - -Mon:: -::Client RdpO Network monitoring client TROCKIJ -::SNMP RdpO Network monitoring suite TROCKIJ - -Parallel:: -::ForkManager RdpO A simple parallel processing fork manager DLUX -::Pvm bdcf Interface to the PVM messaging service DLECONTE - -CORBA:: -::IOP::IOR adpO Decode, munge, and re-encode CORBA IORs PHILIPA -::IDLtree adpf IDL to symbol tree translator OMKELLOGG - -Modem:: -::VBox RdpO Perl module for creation of voiceboxes MLEHMANN -::Vgetty bdpO Interface to voice modems using vgetty YENYA - -ControlX10:: -::CM10 RmpO Control unit for X10 modules BBIRTH -::CM17 RmpO inexpensive RF transmit-only X10 BBIRTH - -RAS:: -::PortMaster RdpO Interface to Livingston PortMaster STIGMATA -::AS5200 RdpO Interface to Cisco AS5200 dialup server STIGMATA -::HiPerARC RdpO Interface to 3Com TotalControl HiPerARC STIGMATA - -6) Data Types and Data Type Utilities (see also Database Interfaces) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Math:: -::Amoeba Rdpr Multidimensional Function Minimisation JARW -::Approx adpO Approximate x,y-values by a function ULPFR -::BaseCalc RdpO Convert numbers between various bases KWILLIAMS -::BigFloat SupO Arbitrary size floating point math package MARKB -::BigInt SupO Arbitrary size integer math package MARKB -::BigInteger adc Arbitrary size integer as XS extension GARY -::BigRat ? Arbitrary size rational numbers (fractions) MARKB -::Brent Rdpr One-dimensional Function Minimisation JARW -::CDF bdch Cumulative Distribution Functions CALLAHAN -::Cephes adcf Interface to St. Moshier's Cephes library RKOBES -::Complex SdpO Complex number data type RAM -::Derivative Rdpr 1st and 2nd order differentiation of data JARW -::Expr adpO Parses agebraic expressions HAKANARDO -::Fortran Rdpf Implements Fortran log10 & sign functions JARW -::Fourier i Fast Fourier Transforms AQUMSIEH -::Fraction bdpO Fraction Manipulation KEVINA -::Geometry adpf 2D and 3D algorithms GMCCAR -::Integral i Integration of data AQUMSIEH -::Interpolate Rdpr Polynomial interpolation of data MATKIN -::LinearProg idp Linear programming utilities JONO -::Logic RdpO Provides pure 2, 3 or multi-value logic SUMMER -::Matrix adpO Matrix data type (transpose, multiply etc) ULPFR -::MatrixBool RdcO Matrix of booleans (Boolean Algebra) STBEY -::MatrixCplx idpO Matrix data type for Complex Numbers STBEY -::MatrixReal RdpO Everything you ever wanted to do with Matr. STBEY -::Pari adcf Interface to the powerful PARI library ILYAZ -::Polynomial RdpO Polynomials as objects MATKIN -::Prime i Prime number testing GARY -::RandomPrime i Generates random primes of x bits GARY -::Round RdpO Perl extension for rounding numbers GROMMEL -::SigFigs Rdpf Math using scientific significant figures SBECK -::Spline RdpO Cubic Spline Interpolation of data JARW -::Trig bdpf tan asin acos sinh cosh tanh sech cosech JARW -::TrulyRandom i based on interrupt timing discrepancies GARY -::VecStat Rdpr Some basic numeric stats on vectors ASPINELLI -::ematica adcO Interface to the powerful Mathematica system ULPFR -::Libm RdcO Perl extension for the C math library, libm DSLEWART - -Math::Business:: -::EMA adcO An Exponential Moving Average Calculator JETTERO - -Statistics:: -::ChiSquare Rdpf Chi Square test - how random is your data? JONO -::ConwayLife RdpO Simulates life using Conway's algorithm DANB -::Descriptive RdpO Descriptive statistical methods COLINK -::LTU RdpO Implements Linear Threshold Units TOMFA -::MaxEntropy Rdpf Maximum Entropy Modeling TERDOEST -::OLS bdpO ordinary least squares (curve fitting) SMORTON -::ROC bdpf ROC curves with nonparametric conf. bounds HAKESTLER -::Distributions RdpO Perl module for calculating critical values MIKEK - -Algorithm:: -::Diff Rdpf Diff (also Longest Common Subsequence) NEDKONZ -::Permute bdcO Handy and fast permutation with OO interface EDPRATOMO - -Algorithm::Graphs:: -::TransitiveClosure RdpO Calculates the transitive closure ABIGAIL - -Algorithm::Numerical:: -::Shuffle Rdph Knuth's shuffle algorithm ABIGAIL -::Sample RDph Knuth's sample algorithm ABIGAIL - -PDL amcf Perl Data Language - numeric analysis env PERLDL - -PDL:: -::Audio adch Sound synthesis and editing with PDL MLEHMANN -::Meschach amcf Links PDL to meschach matrix library EGROSS -::NetCDF bdhO Reads/Writes NetCDF files from/to PDL objs DHUNT -::Options Rdph Provides hash options handling for PDL TJENNESS -::PP amcf Automatically generate C code for PDL PERLDL -::Slatec amof Interface to slatec (linpack+eispack) lib. PERLDL - -Quantum:: -::Superpositions RdpO QM-like superpositions in Perl DCONWAY - -Array:: -::Compare RdpO Class to compare two arrays DAVECROSS -::Heap cdpf Manipulate array elements as a heap JMM -::IntSpan RdpO Handling arrays using IntSpan techniques TEVERETT -::PrintCols adpf Print elements in vertically sorted columns AKSTE -::Substr idp Implement array using substr() LWALL -::Vec idp Implement array using vec() LWALL -::Virtual idp Implement array using a file LWALL -::Reform RdpO Convert an array into N-sized array of array TBONE - -Hash:: -::NoVivify Rdcf Provide non-autovivifying hash functions BPOWERS - -Heap bdpO Define Heap interface JMM -Heap:: -::Binary bdpO Implement Binary Heap JMM -::Binomial bdpO Implement Binomial Heap JMM -::Fibonacci bdpO Implement Fibonacci Heap JMM -::Elem bdpO Heap Element interface, ISA JMM -Heap::Elem:: -::Num bdpO Numeric heap element container JMM -::NumRev bdpO Numeric element reversed order JMM -::Str bdpO String heap element container JMM -::StrRev bdpO String element reversed order JMM -::Ref bdpO Obj ref heap element container JMM -::RefRev bdpO Obj ref element reversed order JMM - -Scalar:: -::Util bdcf Scalar utilities (dualvar reftype etc) GBARR - -List:: -::Util bdcf List utilities (eg min, max, reduce) GBARR - -Bit:: -::Vector RdcO Virtual (arbitrary machineword size) CPU STBEY - -Set:: -::Bag RdpO Bag (multiset) class JHI -::IntRange RdcO Set of integers (arbitrary intervals, fast) STBEY -::IntSpan adpO Set of integers newsrc style '1,5-9,11' etc SWMCD -::NestedGroups RdpO Grouped data eg ACL's, city/state/country ABARCLAY -::Object bdcO Set of Objects (smalltalkish: IdentitySet) JLLEROY -::Scalar adpO Set of scalars (inc references) JHI -::Window bdpO Manages an interval on the integer line SWMCD - -Graph:: -::Element RdpO Base class for element of directed graph NEILB -::Node RdpO A node in a directed graph NEILB -::Edge RdpO An edge in a directed graph NEILB -::Kruskal Rdpf Kruskal Algorithm for Minimal Spanning Trees STBEY - -Decision:: -::Markov bdpO Build/evaluate Markov models for decisions ALANSZ - -Date:: -::Calc Rdcf Gregorian calendar date calculations STBEY -::Convert cdpO Conversion between Gregorian, Hebrew, more? MORTY -::CTime adpf Updated ctime.pl with mods for timezones GBARR -::Format Rdpf Date formatter ala strftime GBARR -::Interval idpO Lightweight normalised interval data type KTORP -::Language adpO Multi-language date support GBARR -::Manip Rdpf Complete date/time manipulation package SBECK -::Parse Rdpf ASCII Date parser using regexp's GBARR -::Time idpO Lightweight normalised datetime data type TOBIX - -Time:: -::Avail Rdpf Calculate min. remaining in time interval PSANTORO -::CTime Rdpf Format Times ala ctime(3) with many formats MUIR -::DaysInMonth Rdpf Returns the number of days in a month MUIR -::HiRes Rdcf High resolution time, sleep, and alarm DEWEG -::JulianDay Rdpf Converts y/m/d into seconds MUIR -::Local Supf Implements timelocal() and timegm() P5P -::Object adpO Object Oriented time objects MSERGEANT -::ParseDate Rdpf Parses many forms of dates and times MUIR -::Period Rdpf Code to deal with time periods PRYAN -::Timezone Rdpf Figures out timezone offsets MUIR -::Zone Rdpf Timezone info and translation routines GBARR -::gmtime Supf A by-name interface for gmtime TOMC -::localtime Supf A by-name interface for localtime TOMC -::Seconds RdcO API to convert seconds to other date values MSERGEANT - -Calendar:: -::CSA adcO interface with calenders such as Sun and CDE KJALB -::Hebrew cdpO Hebrew calendar conversion/manipulation YSTH -::RCM i Russell Calendar Manager HTCHAPMAN - -Tie:: -::Hash Supr Base class for implementing tied hashes P5P -::Scalar Supr Base class for implementing tied scalars P5P -::Array Supr Base class for implementing tied arrays P5P -::CPHash bdpO Case preserving but case insensitive hash CJM -::Cache Mdpr In memory size limited LRU cache CHAMAS -::DB_FileLock Rdpr Locking access to Berkeley DB 1.x. JMV -::DB_Lock Rdpr Tie DB_File with automatic locking KWILLIAMS -::DBI RdpO Tie hash to a DBI handle LDS -::Dir adpr Tie hash for reading directories GBARR -::Discovery Rdpr Discover data by caching sub results SIMON -::File adpr Tie hash to files in a directory AMW -::FileLRUCache bdph File based persistent LRU cache SNOWHARE -::Handle RdpO Base class for implementing tied filehandles STBEY -::HashDefaults adpr Let a hash have default values JDPORTER -::IxHash RdpO Indexed hash (ordered array/hash composite) GSAR -::LLHash Rdpr Fast ordered hashes via linked lists KWILLIAMS -::ListKeyedHash Rdpr Use lists to key multi-level hashes SNOWHARE -::Mem adcO Bind perl variables to memory addresses PMQS -::MmapArray bdcr Ties a file to an array ANDREWF -::Multidim adpr "tie"-like multidimensional data structures JDPORTER -::OffsetArray adpr Tie one array to another, with index offset JDPORTER -::Persistent Rdpr Persistent data structures via tie RGIERSIG -::Quick i Simple way to create ties TIMB -::RDBM RdpO Tie hashes to relational databases LDS -::RndHash bdpO choose a random key of a hash in O(1) time DFAN -::SecureHash RdpO Enforced encapsulation of Perl objects DCONWAY -::SentientHash bdpr Tracks changes to nested data structures ANDREWF -::ShadowHash adpO Merge multiple data sources into a hash RRA -::ShiftSplice i Defines shift et al in terms of splice LWALL -::SortHash Rdpr Provides persistent sorting for hashes CTWETEN -::SubstrHash SdpO Very compact hash stored in a string LWALL -::TextDir Rdpr ties a hash to a directory of textfiles KWILLIAMS -::Watch bdpO Watch variables, run code when read/written LUSOL -::Cycle RdpO Cycle through a list of values via a scalar. BDFOY - -Tie::Scalar:: -::Timeout adpr Scalar variables that time out MARCEL - -Tie::Cache:: -::LRU adpr A Least-Recently Used cache MSCHWERN - -Class:: -::Accessor bdpO Automated accessor generation MSCHWERN -::DBI adpO Simple SQL-based object persistance MSCHWERN -::Eroot RdpO Eternal Root - Object persistence DMR -::Fields bdph Inspect the fields of a class MSCHWERN -::MethodMaker bdpO Create generic methods FLUFFY -::Multimethods Rdpf A multiple dispatch mechanism for Perl DCONWAY -::Mutator bdpO Dynamic polymorphism implemented in Perl GMCCAR -::NamedParms MdpO A named parameter accessor base class SNOWHARE -::ParmList MdpO A named parameter list processor SNOWHARE -::Singleton bdpO Implementation of a "Singleton" class ABW -::Template Rdpr Struct/member template builder DMR -::Translucent RdpO Translucent (ala perltootc) method creation GED -::Tree MdpO C++ class hierarchies & disk directories RSAVAGE -::TOM RmpO Transportable Object Model for perl JDUNCAN -::Contract RdpO Design-by-Contract OO in Perl. DCONWAY -::WhiteHole RdpO Treat unhandled method calls as errors MSCHWERN -::BlackHole RdpO treat unhandled method calls as no-op SBURKE -::Classless MdpO Framework for classless OOP SBURKE -::ISA Mdpf Report the search path thru an ISA tree SBURKE - -Object:: -::Info Rupf General info about objects (is-a, ...) JACKS -::Transaction bdpO Transactions on serialized HASH files MUIR - -POE:: Perl Object Environment -::Kernel RdpO An event queue that dispatches events RCAPUTO -::Session RdpO state machine running on POE::Kernel events RCAPUTO - -POE::Component:: -::RSS bdp? Event based RSS interface MSTEVENS -::SubWrapper bdp? Event based Module interface MSTEVENS - -MOP bdp Meta Object Protocol (Tool collection) ORTALO -Ref RdpO Print, compare, and copy perl structures MUIR -SOOP RdpO Safe Object Oriented Programming GARROW - -Sort:: -::ByCompatMatrix idpO Sort objects by attribute compatibility ICKHABOD -::Fields bdpf sort text lines by alpha or numeric fields JNH -::PolySort bdpO general rules-based sorting of lists DMACKS -::Versions Rdpf sorting of revision (and similar) numbers KJALB - -Data Type Marshaling (converting to/from strings) and Persistent Storage - -Clone idch Recursive copy of nested objects RDF -FreezeThaw bdpf Convert arbitrary objects to/from strings ILYAZ -Persistence:: -::Object adpO Store Object definitions with Data::Dumper VIPUL -Storable Rdcr Persistent data structure mechanism RAM -Marshal:: -::Dispatch cdpO Convert arbitrary objects to/from strings MUIR -::Packed cdpO Run-length coded version of Marshal module MUIR -::Eval cdpO Undo serialization with eval MUIR -Tangram RmpO Object persistence in relational databases JLLEROY - -Persistent:: -::Base bdpO Persistent base classes (& DBM/File classes) DWINTERS -::DBI bdpO Persistent abstract class for DBI databases DWINTERS -::MySQL bdpO Persistent class for MySQL databases DWINTERS -::Oracle bdpO Persistent class for Oracle databases DWINTERS -::Sybase bdpO Persistent class for Sybase databases DWINTERS -::mSQL bdpO Persistent class for mSQL databases DWINTERS -::LDAP bdpO Persistent class for LDAP directories DWINTERS - -Data:: -::Check cdpO Checks values for various data formats KENHOLM -::DRef adph Nested data access using delimited strings EVO -::Dumper RdpO Convert data structure into perl code GSAR -::Flow RdpO Acquire data based on recipes ILYAZ -::Locations RdpO Insert data into other data w/o temp files STBEY -::Reporter RdcO Ascii Report Generator RVAZ -::Walker RdpO Navigate through Perl data structures JNOLAN -::Random adpf Generate random sets of data ADEO -::JavaScript RdpO Dumps structures into JavaScript code SCHOP - -Tree:: -::Base cdpO Defines a basic binary search tree MSCHWERN -::Fat Rdcf Embeddable F-Tree algorithm suite JPRIT -::Smart cdpO Splay tree, fastest for commonly accessed ke MSCHWERN -::Ternary bdpO Perl implementation of ternary search trees MROGASKI -::Ternary_XS adcO XS implementation of ternary search trees LBROCARD -::Trie bdpO An implementation of the Trie data structure AVIF -::Nary RdpO Perl implementation of N-ary search trees FSORIANO -::DAG_Node MdpO base class for trees SBURKE - -DFA:: -::Command MdpO Discrete Finite Automata command processor RSAVAGE -::Kleene R Kleene's Algorithm for DFA STBEY -::Simple cdpO An "augmented transition network" RANDYM - -Boulder MdpO Generalized tag/value data objects LDS -Thesaurus RdpO Create associations between related things DROLSKY - -7) Database Interfaces (see also Data Types) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -DBI amcO Generic Database Interface (see DBD modules) DBIML - -DBIx -- Extensions to the DBI - -DBIx:: -::Abstract RmpO Wrapper for DBI that generates SQL TURNERA -::AnyDBD bdpO Module to make cross db applications easier MSERGEANT -::CGITables adpO Easy DB access from a CGI TOBIX -::Copy adpO Copying databases TOBIX -::FullTextSearch bdpO Index documents with MySQL as storage TJMATHER -::glueHTML bdpO CGI interface to DBI databases JFURNESS -::HTMLView cdpO Creating web userinterfaces to DBI dbs HAKANARDO -::OracleSequence adpO OO access to Oracle sequences via DBD-Oracle BLABES -::Password MdpO Abstration layer for database passwords KROW -::Recordset bmpO DB-Abtractionlayer / Access via Arrays/Hashs GRICHTER -::Table bdpO OO access to DBI database tables DLOWE -::TableAdapter adpO An object-relational mapper for DBI tables GED -::Tree adpO Expand self-referential table into a tree BJEPS -::XML_RDB ???? Creates XML from DBI datasources MSERGEANT -::DBSchema bmpO Database-independent schema objects IVAN - -DBD:: -::ASAny adcO Adaptive Server Anywhere Driver for DBI SMIRNIOS -::Altera bdpO Altera SQL Server for DBI - pure Perl code DSOUFLIS -::CSV adcO SQL engine and DBI driver for CSV files JWIED -::DB2 adcO DB2 Driver for DBI MHM -::Empress adcO Empress RDBMS Driver SWILLIAM -::FreeTDS adcO DBI driver for MS SQLServer and Sybase SPANNRING -::SearchServer cdcO PCDOCS/Fulcrum SearchServer Driver for DB SHARI -::Illustra bmcO Illustra Driver for DBI PMH -::Informix amcO Informix Driver for DBI JOHNL -::Informix4 adcO DBI driver for Informix SE 4.10 GTHYNI -::Ingres bmcO Ingres Driver for DBI HTOUG -::Multiplex a Spreading database load acrross servers TIMB -::ODBC amcO ODBC Driver for DBI DBIML -::Oracle MmcO Oracle Driver for DBI TIMB -::QBase amcO QBase Driver for DBI BENLI -::RAM bmpO a DBI driver for files and data structures JZUCKER -::SQLrelay bdpO SQLrelay driver for DBI DMOW -::Solid amcO Solid Driver for DBI TWENRICH -::Sqlflex RdcO SQLFLEX driver for DBI INFOFLEX -::Sybase bmcO Sybase Driver for DBI MEWP -::Unify bdcO Unify driver for DBI HMBRAND -::XBase bmpO XBase driver for DBI JANPAZ -::mSQL RmcO Msql Driver for DBI JWIED -::mysql RmcO Mysql Driver for DBI JWIED -::pNET amcO DBD proxy driver JWIED -::InterBase amcO DBI driver for InterBase RDBMS server EDPRATOMO - -Oraperl Rmpf Oraperl emulation interface for DBD::Oracle DBIML -Ingperl bmpf Ingperl emulation interface for DBD::Ingres HTOUG - -DDL:: -::Oracle bdpO Reverse engineers object DDL; also defrags RVSUTHERL - -MSSQL:: -::DBlib Md+O Access MS SQL Server through DB-Library. SOMMAR -::Sqllib MdpO High-level interface using MSSQL::DBlib. SOMMAR - -Sybase:: -::Async cdpO interact with a Sybase asynchronously WORENKD -::BCP RdcO Sybase BCP interface MEWP -::DBlib RdcO Sybase DBlibrary interface MEWP -::Simple bdpO Simplified db access using Sybase::CTlib MEWP -::Sybperl Rdpf sybperl 1.0xx compatibility module MEWP -::CTlib RdcO Sybase CTlibrary interface MEWP - -Ace i Interface to ACEDB (Popular Genome DB) LDS -BBDB Rdph Insiduous big brother database LAXEN -DTREE cdcf Interface to Faircom DTREE multikey ISAM db JWAT -Datascope Rdcf Interface to Datascope RDBMS DANMQ -Fame adcO Interface to FAME database and language TRIAS -LotusNotes i Interface to Lotus Notes C/C++ API MBRECH -Msql RmcO Mini-SQL database interface JWIED -Mysql RmcO mysql database interface JWIED -NetCDF bmcr Interface to netCDF API for scientific data SEMM -ObjStore Rm+O ObjectStore OODBMS Interface JPRIT -Pg Rdcf PostgreSQL SQL database interface MERGL -PgSQL adpO "Pure perl" interface to PostgreSQL GTHYNI -Pogo ad+O Interface for GOODS object database SEYN -Postgres RncO PostgreSQL interface with Perl5 coding style VKHERA -Sprite RdpO Limited SQL interface to flat file databases SHGUN -Stanza i Text format database used by OSF and IBM JHI -VDBM cdph Client/server-layers on top of DBM files RAM -WAIT adhO A rewrite of the freeWAIS-sf engine in Perl ULPFR -Wais Rdcf Interface to the freeWAIS-sf libraries ULPFR -XBase RdpO Read/write interface to XBase files JANPAZ -Xbase bdpf Read Xbase files with simple IDX indexes PRATP - -Tied Hash File Interfaces: - -AnyDBM_File Sup Uses first available *_File module above P5P -BerkeleyDB RdcO Interface to Berkeley DB 2 & 3 PMQS -CDB_File adc Tie to CDB (Bernstein's constant DB) files TIMPX -DBZ_File adc Tie to dbz files (mainly for news history) IANPX -DWH_File adpO DBM storage of complex data and objects SUMUS -DB_File Suc Tie to DB files PMQS -GDBM_File Suc Tie to GDBM files P5P -NDBM_File Suc Tie to NDBM files P5P -ODBM_File Suc Tie to ODBM files P5P -SDBM_File Suc Tie to SDBM files P5P - -MLDBM RdpO Transparently store multi-level data in DBM GSAR -MLDBM:: -::Sync cdpr MLDBM wrapper to serialize concurrent access CHAMAS - -DB_File:: -::Lock RdpO DB_File wrapper with flock-based locking DHARRIS - -DBM:: -::DBass adpf DBM with hashes, locking and XML records SPIDERBOY - -AsciiDB:: -::Parse i Generic text database parsing MICB -::TagFile adpO Tie class for a simple ASCII database JOSERODR - -Db:: -::Ctree Rdcr Faircom's CTREE+ database interface REDEN -::Documentum Rdcf Documentum EDMS Perl client interface MSROTH -::dmObject cdpO Object-based interface to Documentum EDMS JGARRISON -::DFC adpO OO Interface to Documentum's DFC MSROTH - -DbFramework:: -::Attribute adpO Relational attribute class PSHARPE -::DataModel adpO Relational data model/schema class PSHARPE -::DataType adpO Attribute data type class PSHARPE -::ForeignKey adpO Relational foreign key class PSHARPE -::Key adpO Relational key class PSHARPE -::Persistent adpO Persistent object class PSHARPE -::PrimaryKey adpO Relational primary key class PSHARPE -::Table adpO Relational table/entity class PSHARPE -::Util adhO Utility functions/methods PSHARPE - -BTRIEVE:: -::SAVE bdpO Read-write access to BTRIEVE SAVE files DLANE - -MARC bmpO MAchine Readable Catalog (library bib. data) PERL4LIB -MARC:: -::XML ampO MAchine Readable Catalog / XML Extension PERL4LIB - -Metadata:: -::Base bdpO Base metadata functionality DJBECKETT -::IAFA bdpO IAFA templates metadata DJBECKETT -::SOIF bdpO Harvest SOIF metadata DJBECKETT - -OLE:: -::PropertySet aupO Property Set interface MSCHWARTZ -::Storage aupO Structured Storage / OLE document interface MSCHWARTZ -::Storage_Lite adpO Simple Class for OLE document interface KWITKNR - -Spectrum:: -::CLI RdpO API for Spectrum Enterprise Mgr. CLI PLONKA - -Spreadsheet:: -::Excel i Interface to Excel spreadsheets RRAWLINGS -::Lotus i Interface to Lotus 1-2-3 spreadsheets RRAWLINGS -::WriteExcel bupO Write numbers & text in Excel binary format JMCNAMARA -::ParseExcel RdpO Get information from Excel file KWITKNR - -X500:: -::DN MdpO X500 Distinguished Name parser RSAVAGE - -8) User Interfaces (Character and Graphical) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Term:: -::ANSIColor Sdpf Color output using ANSI escape sequences RRA -::Cap Supf Basic termcap: Tgetent, Tputs, Tgoto TSANDERS -::Complete Supf Tab word completion using stty raw WTOMPSON -::Control idpf Basic curses-type screen controls (gotxy) KJALB -::Gnuplot adcf Draw vector graphics on terminals etc ILYAZ -::Info adpf Terminfo interface (currently just Tput) KJALB -::ProgressBar idpf Progress bar in just ASCII EDAVIS -::Prompt adpf Prompt a user ALLENS -::Query Rdpf Intelligent user prompt/response driver AKSTE -::ReadKey Rdcf Read keystrokes and change terminal modes KJALB -::ReadLine Sdcf Common interface for various implementations ILYAZ -::Scraper cdpO Drive and scrape terminal applications INGY -::Screen RdpO Basic screen + input class (uses Term::Cap) MRKAE -::Size adcf Simple way to get terminal size TIMPX -::TUI bdpf User interface based on Term::ReadLine SBECK - -Term::ReadLine:: -::Perl RdpO GNU Readline history and completion in Perl ILYAZ -::Gnu RdcO GNU Readline XS library wrapper HAYASHI - -Major Character User Interface Modules: - -Cdk RdcO Collection of Curses widgets GLOVER -Curses adcO Character screen handling and windowing WPS -Dialog bdch interface library to libdialog UNCLE -PV bdpO Text-mode User Interface Widgets AGUL -PerlMenu Mdpf Curses-based menu and template system SKUNZ - -Curses:: -::Forms adpO Form management for Curses::Widgets CORLISS -::Widgets Rdpf Assorted widgets for rapid interfaces CORLISS - -Emacs adpf Support for Perl embedded in GNU Emacs JTOBEY -Emacs:: -::Lisp bdch Perl-to-Emacs-Lisp glue JTOBEY - -Tk X Windows User Interface Modules - -Tk bmcO Object oriented version of Tk v4 TKML - -Tk:: -::TextANSIColor bdpO use ANSI color codes in Text widget TJENNESS -::Autoscroll cdpf Alternative way to scroll SREZIC -::Axis RmpO Canvas with Axes TKML -::CheckBox RdpO A radio button widget that uses a checkmark DKWILSON -::ChildNotification RdpO Alert widget when child is created DKWILSON -::Clock RdpO Canvas based Clock widget HMBRAND -::Cloth RdpO Object interface to Tk::Canvas and items ACH -::Columns RdpO Multi column lists w/ resizable borders DKWILSON -::ComboEntry RdpO Drop down list + entry widget DKWILSON -::ContextHelp cdpO A context-sensitive help system SREZIC -::Dial RmpO An alternative to the Scale widget TKML -::Date cdpO A date/time widget SREZIC -::Enscript cdpf Create postscript from text files using Tk SREZIC -::FcyEntry adpO Entry with bg color depending on -state ACH -::FileDialog RdpO A highly configurable file selection widget BPOWERS -::FileEntry adpO Primitive clone of Tix FileEntry widget ACH -::FireButton RdpO Keeps invoking callback when pressed ACH -::FlatCheckbox cdpO A checkbox suitable for flat reliefs SREZIC -::FontDialog cdpO A font dialog widget for perl/Tk SREZIC -::Getopt adpO Configuration interface to Getopt::Long SREZIC -::HistEntry cdpO An entry widget with history capability SREZIC -::HTML bdpO View HTML in a Tk Text widget NI-S -::IconCanvas RdpO Canvas with movable iconic interface DKWILSON -::JPEG RdcO JPEG loader for Tk::Photo NI-S -::LockDisplay RdpO Screen saver/lock widget with animation LUSOL -::Login cdpO A Login widget (name, passwd, et al) BPOWERS -::Menustrip RdpO Another MenuBar DKWILSON -::More adpO A more (or less) like text widget ACH -::Multi bdpO Manages several Text or Canvas widgets DDUMONT -::NumEntry RdpO Numerical entry widget with up/down buttons ACH -::ObjScanner bdpO A scanner to view an object's attribute DDUMONT -::Olwm RmpO Interface to OpenLook toplevels properties TKML -::Pane RdpO A Frame that can be scrolled TKML -::PNG RdcO PNG loader for Tk::Photo NI-S -::Pod ?mpO POD browser toplevel widget TKML -::ProgressBar RdpO Status/progress bar TKML -::ProgressMeter cdpO Simple thermometer-style widget w/callbacks BPOWERS -::RotCanvas RdpO Canvas with arbitrary rotation support AQUMSIEH -::SplitFrame RdpO A sliding separator for two child widgets DKWILSON -::TabFrame RdpO A tabbed frame geometry manager DKWILSON -::TabbedForm RdpO Ext. TabFrame, allowing managed subwidgets DKWILSON -::TableEdit RdpO Simplified interface to a flat file database DKWILSON -::TableMatrix bdcO Display data in Table/Spreadsheet format CERNEY -::TiedListbox RmpO Gang together Listboxes TKML -::TFrame RdpO A Frame with a title ACH -::TIFF adpO TIFF loader for Tk::Photo SREZIC -::Tree RdpO Create and manipulate Tree widgets CTDEAN -::TreeGraph RdpO Widget to draw a tree in a Canvas DDUMONT -::WaitBox RdpO A Wait dialog, of the "Please Wait" variety BPOWERS -::XMLViewer adpO Tk widget to display XML SREZIC - -Modules in the realm of Tk but with a separate namespace - -Log::Dispatch:: -::ToTk RdpO Interface class between Log::Dispatch and Tk DDUMONT -::TkText RdpO Text widget to log Log::Dispatch messages DDUMONT - -Puppet:: -::Body adpO Base class for persistent data DDUMONT -::Log bdpO Logging facility based on Tk DDUMONT -::Any adpO Base class for an optionnal GUI DDUMONT - -Puppet::VcsTools:: -::History bdpO VCS (RCS HMS) history viewer based on Canvas DDUMONT -::File adpO VCS (RCS HMS) file manager DDUMONT - -Orac RdpO DBA GUI tool for Oracle, Informix and Sybase ANDYDUNC -PPresenter MdpO Create presentations with Tk in Perl or XML MARKOV - -Other Major X Windows User Interface Modules: - -Gtk bdcO binding of the Gtk library used by GIMP KJALB - -Gtk:: -::Dialog adph Simple interface to create dialogs in Gtk ALISTAIRC - -Fresco cd+O Interface to Fresco (post X11R6 version) BPETH -Glade adph Glade/Gtk+/Gnome UI source code generator DMUSGR -Gnome bdcO Bindings to the Gnome Desktop Toolkit KJALB -Qt ad+O Interface to the Qt toolkit AWIN -Sx Rdcf Simple Athena widget interface FMC - -X11:: -::Auth adpO Read and handle X11 '.Xauthority' files SMCCAM -::Fvwm RdcO interface to the FVWM window manager API RJRAY -::Keysyms adpf X11 key symbols (translation of keysymdef.h) SMCCAM -::Lib bdcO X11 library interface KENFOX -::Motif bdcO Motif widget set interface KENFOX -::Protocol adpO Raw interface to X Window System servers SMCCAM -::Toolkit bdcO X11 Toolkit library interface KENFOX -::Wcl bdcO Interface to the Widget Creation Library JHPB -::XEvent bdcO provides perl OO acess to XEvent structures MARTINB -::XFontStruct bdcO provides perl OO access to XFontStruct MARTINB -::XRT adcO XRT widget set (commercial) interface KENFOX -::Xbae adcO Xbae matrix (spreadsheet like) interface KENFOX -::Xforms bdcO provides the binding to the xforms library MARTINB -::Xpm adcf X Pixmap library interface KENFOX - -Abstract Graphical User Interfaces modules - -GUI:: -::Guido i bd+O Communicate with objects in a GUI TBRADFUTE - -9) Interfaces to or Emulations of Other Programming Languages - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Clips adpO Interface to the Expert System Clips MSULLIVAN -Java RdoO A Perl front-end for JVM communication METZZO -Rc cdcO Perl interface for the Rc shell JPRIT -SICStus adcO Interface to SICStus Prolog Runtime CBAIL - -C:: -::DynaLib bdcO Allows direct calls to dynamic libraries JTOBEY -::Scan RdpO Heuristic parse of C files ILYAZ - -Tcl RdcO Complete access to Tcl MICB -::Tk RdcO Complete access to Tk *via Tcl* MICB - -Language:: -::Basic adpO Implementation of BASIC AKARGER -::Prolog adpO An implementation of Prolog JACKS -::PGForth i Peter Gallasch's Forth implementation PETERGAL - -Fortran:: -::NameList adpf Interface to FORTRAN NameList data SGEL - -ShellScript:: -::Env adpO Simple sh and csh script generator SVENH - -Verilog:: -::Pli Rdch Access to simulator functions WSNYDER -::Language Rdpf Language support, number parsing, etc WSNYDER -::Parser RdpO Language parsing WSNYDER -::SigParser RdpO Signal and module extraction WSNYDER - -FFI cdcf Low-level Foreign Function Interface PMOORE - -FFI:: -::Library cdcO Access to functions in shared libraries PMOORE - -FFI::Win32:: -::Typelib idcO FFI taking definitions from a type library PMOORE -::COM idcO Access to COM using VTBL interface PMOORE - -Python bmcf Interface Python API (for embedded python) GAAS -Python:: -::Object bmcO Wrapper for python objects GAAS -::Err bmcO Wrapper for python exceptions GAAS - -10) File Names, File Systems and File Locking (see also File Handles) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Cwd Supf Current working directory functions P5P - -File:: -::Attrib idpO Get/set file attributes (stat) TYEMQ -::BSDGlob bdcf Secure, csh-compatible filename globbing GBACON -::Backup bdpf Easy file backup & rotation automation KWILLIAMS -::Basename Supf Return basename of a filename P5P -::Cache adpO Share data between processes via filesystem DCLINTON -::CheckTree Supf Check file/dir tree against a specification P5P -::Compare Supf Compare file contents quickly P5P -::Copy adpf Copying files or filehandles ASHER -::CounterFile RdpO Persistent counter class GAAS -::Df adpf Free disk space utilities (h2ph required) FTASSIN -::Find Supf Call func for every item in a directory tree P5P -::Flock Mdph flock() wrapper. Auto-create locks MUIR -::Glob adpf Filename globing (ksh style) TYEMQ -::LckPwdF adcf Lock and unlock the passwd file ALLENS -::Listing Rdpf Parse directory listings GAAS -::Lock adcf File locking using flock() and lockf() JHI -::MultiTail adpO Tail multiple files SGMIANO -::Path Supf File path and name utilities P5P -::Remote Rdph Read/write/edit remote files transparently NWIGER -::Rsync bdpO Copy efficiently over the net and locally LEAKIN -::Signature cdpf Heuristics for file recognition JHI -::Slurp Mdpf Read/write/append files quickly MUIR -::Sort Rdpf Sort a file or merge sort multiple files CNANDOR -::Spec bdpO Handling files and directories portably KJALB -::Sync bdcf POSIX/*nix fsync() and sync() CEVANS -::Tail bdpO A more efficient tail -f MGRABNAR -::Temp adpf Create temporary files safely TJENNESS -::chmod Mdpf Allows for symbolic chmod notation PINYAN -::lockf bdcf Interface to lockf system call PHENSON -::stat Supf A by-name interface for the stat function TOMC -::BasicFlock Rdpf Simple flock() wrapper MUIR -::Searcher bdpO Search filetree do search/replace regexes ASTUBBS - -File::Searcher:: -::Interactive bdpO Interactive search do search/replace regexes ASTUBBS - -Dir:: -::Purge Rdpf Delete files in directory based on timestamp JV - -Filesys:: -::AFS cdcO AFS Distributed File System interface NOG -::Df Rdpr Disk free based on Filesys::Statvfs IGUTHRIE -::DiskFree adpO OS independant parser of the df command ABARCLAY -::Ext2 Rdpf Interface to e2fs filesystem attributes JPIERCE -::SamFS adcf Interface to SamFS API LUPE -::Statvfs Rdcf Interface to the statvfs() system call IGUTHRIE -::dfent adpf By-name interface TOMC -::mntent adpf By-name interface TOMC -::statfs adpf By-name interface TOMC - -LockFile:: Application-level locking facilities -::Lock adpO Lock handles created by LockFile::* schemes RAM -::Manager adpO Records locks created by LockFile::* RAM -::Scheme adpO Abstract superclass for locking modules RAM -::Simple adpr Simple file locking mechanism RAM - -Stat:: -::lsMode Rdpf Translate mode 0644 to -rw-r--r-- MJD - -11) String Processing, Language Text Processing, Parsing and Searching - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -String:: -::Approx Rdpf Approximate string matching and substitution JHI -::BitCount adpf Count number of "1" bits in strings WINKO -::CRC Rdcf Cyclic redundency check generation MUIR -::CRC32 R?c? ZMODEM-like CRC32 generation of strings as w SOENKE -::DiffLine bdcf line # & position of first diff ALLEN -::Edit adpf Assorted handy string editing functions TOMC -::Parity adpf Parity (odd/even/mark/space) handling WINKO -::RexxParse Rdph Perl implementation of REXX 'parse' command BLCKSMTH -::Scanf Rdpf Implementation of C sscanf function JHI -::ShellQuote Rdpf Quote string for safe passage through shells ROSCH -::Strip Rdcf xs Module to remove white-space from strings BPOWERS -::Random RdpO Perl module to generate random strings based STEVE -::Similarity RdcO Calculate the similarity of two strings MLEHMANN - -Language text related modules - -Text:: -::Abbrev Supf Builds hash of all possible abbreviations P5P -::Bastardize cdpO corrupts text in various ways AYRNIEU -::Bib RdpO Module moved to Text::Refer ERYQ -::BibTeX adcO Parse BibTeX files GWARD -::CSV adpO Manipulate comma-separated value strings ALANCITT -::CSV_XS adpO Fast 8bit clean version of Text::CSV JWIED -::DelimMatch RdpO Match (possibly nested) delimited strings NWALSH -::FillIn RdpO Fill-in text templates KWILLIAMS -::Format RdpO Advanced paragraph formatting GABOR -::Graphics RdpO Graphics rendering toolkit with text output SFARRELL -::Iconv RdcO Perl interface to the XPG4 iconv() function MPIOTR -::Invert cdpO Create/query inv. index of text entities NNEUL -::Macros adpO template macro expander (OO) JDPORTER -::Metaphone bdcf A modern soundex. Phonetic encoding of words MSCHWERN -::MetaText bdpO Text processing/markup meta-language ABW -::Morse cdpf convert text to/from Morse code JONO -::ParseWords Supf Parse strings containing shell-style quoting HALPOM -::Refer RdpO Parse refer(1)-style bibliography files ERYQ -::SimpleTemplate adpO Template for dynamic text generation TAIY -::Soundex Sdhf Convert a string to a soundex value MARKM -::Tabs Sdpf Expand and contract tabs ala expand(1) MUIR -::TeX cdpO TeX typesetting language input parser ILYAZ -::Templar RdpO An object-oriented templating system GED -::Template MdpO Expand template text with embedded perl MJD -::TreeFile bdpO Reads tree of strings into a data structure JNK -::Vpp RdpO Versatile text pre-processor DDUMONT -::Wrap Sdpf Wraps lines to make simple paragraphs MUIR -::iPerl adpf Bring text-docs to life via embedded Perl PFEIFFER -::DoubleMetaphone adcf Convert string to phonetic encoding MAURICE -::FastTemplate bdpO Perl subs from line-oriented templates BOZZIO - -Text::Wrap:: -::Hyphenate a Like Text::Wrap with ability to hyphenate MJD - -Other Text:: modules (these should be under String:: but pre-date it) - -Text:: -::Balanced Mdpf Extract balanced-delimiter substrings DCONWAY -::Banner adpf Resembles UNIX banner command LORY -::Merge i??? Methods for text templating and data merging SHARRIS -::Parser adpO String parser using patterns and states PATM -::Trie adpf Find common heads and tails from strings ILYAZ - -Stemming algorithms - -Text:: -::English adpf English language stemming IANPX -::German adpf German language stemming ULPFR -::Stem bdpf Porter algorithm for stemming English words IANPX - -Natural Languages - -Lingua:: -::DetectCharset a Heuristics to detect coded character sets JNEYSTADT -::Ident RdpO Statistical language identification MPIOTR -::Ispell adpf Interface to the Ispell spellchecker JDPORTER -::Stem Rdph Word stemmer with localization SNOWHARE - -Specific Natural Languages - -Lingua:: -::EN i Namespace for English language modules -::PT bupf Namespace for Portugese language modules EGROSS - -Lingua::EN:: -::AddressParse bdpO Manipulate geographical addresses KIMRYAN -::Cardinal i Convert numbers to words HIGHTOWE -::Fathom RdpO Readability measurements of English text KIMRYAN -::Hyphenate Rdpf Syllable based hyphenation DCONWAY -::Infinitive MdpO Find infinitive of a conjugated word RSAVAGE -::Inflect Mdpf English singular->plural and "a"->"an" DCONWAY -::MatchNames bdpf Smart matching for human names BRIANL -::NameCase Rdpf Convert NAMES and names to Correct Case SUMMER -::NameParse RdpO Manipulate persons name KIMRYAN -::Nickname bdpf Genealogical nickname matching(Peggy=Midge) BRIANL -::Ordinal i Convert numbers to words HIGHTOWE -::Squeeze bdpf Shorten english text for Pagers/GSM phones JARIAALTO -::Syllable a Estimate syllable count in words GREGFAST - -Lingua::EN::Numbers:: -::Ordinate Rdpf go from cardinal (53) to ordinal (53rd) SBURKE - -Lingua::RU:: -::Charset anpf Detect/Convert russian character sets. FARBER - -ERG Rdpf An extensible report generator framework PHOENIXL - -PostScript:: -::Barcode bdpf Various types of barcodes as PostScript COLEMAN -::Basic bdpO Basic methods for postscript generation STWIGGER -::Document bdpO Generate multi-page PostScript SHAWNPW -::Elements bdpO Objects for shapes, lines, images SHAWNPW -::Font RdpO analyzes PostScript font files JV -::FontInfo RdpO analyzes Windows font info files JV -::FontMetrics RdpO analyzes Adobe Font Metric files JV -::Metrics bdpO Font metrics data used by PS::TextBlock SHAWNPW -::Resources RdpO loads Unix PostScript Resources file JV -::TextBlock bdpO Objects used by PS::Document SHAWNPW - -Font:: -::AFM RdpO Parse Adobe Font Metric files GAAS -::TFM RdpO Read info from TeX font metric files JANPAZ -::TTF bdpO TrueType font manipulation module MHOSKEN -::Fret RdpO Fret - Font REporting Tool MHOSKEN - -Number:: -::Format RdpO Package for formatting numbers for display WRW - -Number::Phone:: -::US Rdpf Validates several US phone number formats KENNEDYH - -Email:: -::Find adpf Find RFC 822 email addresses in plain text MSCHWERN - -Parse:: -::ePerl Rdcr Embedded Perl (ePerl) parser RSE -::Lex adpO Generator of lexical analysers PVERD -::RecDescent MdpO Recursive descent parser generator DCONWAY -::Tokens bdpO Base class for parsing tokens from text MCKAY -::Yapp RdpO Generates OO LALR parser modules FDESAR -::YALALR RdpO Yet Another LALR parser SFINK -::Vipar bdpO Visual LALR parser debugger SFINK - -Search:: -::Dict Supf Search a dictionary ordered text file P5P -::InvertedIndex RdpO Inverted index database support SNOWHARE -::Binary Rdpf Generic binary search RANT - -SGML:: -::Element cdpO Build a SGML element structure tree LSTAF -::Parser RdpO SGML instance parser EHOOD -::SPGrove bd+O Load SGML, XML, and HTML files KMACLEOD -::Entity RdpO An entity defined in an SGML or XML document KMACLEOD - -SGMLS RdpO A Post-Processor for SGMLS and NSGMLS INGOMACH - -XML RmhO Large collection of XML related modules XMLML - -XML:: -::AutoWriter RdpO DOCTYPE based XML output RBS -::CSV i?cO Transform comma separated values to XML ISTERIN -::Catalog RdpO Resolve public identifiers and remap system EBOHLMAN -::DOM bmpO Implements Level 1 of W3's DOM ENNO -::Doctype RdpO A DTD object class RBS -::Dumper ampO Converts XML from/to Perl code EISEN -::Edifact ???? Scripts for translating EDIFACT into XML KRAEHE -::Element RdpO XML elements with the same interface as HTML SBURKE -::Encoding ???? Parses encoding map XML files COOPERCL -::Generator bdpO Generates XML documents BHOLZMAN -::Grove RmpO Flexible lightweight mid-level XML objects KMACLEOD -::PPD RdpO PPD file format and XML parsing elements MURRAY -::PYX RdpO XML to PYX generator MSERGEANT -::Parser bmcO Flexible fast parser with plug-in styles COOPERCL -::QL ???? Implements the XML Query Language MSERGEANT -::Registry ampO Implements a generic XML registry EISEN -::Sablotron RdcO Interface to the Sablotron XSLT processor PAVELH -::TreeBuilder RdpO Build a tree of XML::Element objects SBURKE -::Writer ???? Module for writing XML documents DMEGG -::XPath RdpO A set of modules for parsing and evaluating MSERGEANT -::XQL ampO Performs XQL queries on XML object trees ENNO -::XSLT RdcO Process XSL Transformational sheets BRONG -::miniXQL ???? Simplistic XQL-like search using streams MSERGEANT - -Frontier:: -::RPC ???? Performs Remote Procedure Calls using XML KMACLEOD - -RDF:: -::Service ampO RDF API with DBI and other backends JONAS - -RTF:: -::Base i Classes for Microsoft Rich Text Format NI-S -::Document a pO Generate Rich Text (RTF) Files RRWO -::Generator idpO Next Generation of RTF::Document RRWO -::Group adpO Base class for manipulating Rich Text Format RRWO -::Parser a Base class for parsing RTF files PVERD - -SQL:: -::Schema bdpO Convert a data dictionary to SQL statements TODD -::Statement adcO Small SQL parser and engine JWIED -::Builder adpO OO interface for creating SQL statements ZENIN - -TeX:: -::DVI RdpO Methods for writing DVI (DeVice Independent) JANPAZ -::Hyphen RdpO Hyphenate words using TeX's patterns JANPAZ - -FrameMaker cdpO Top level FrameMaker interface PEASE -FrameMaker:: -::FDK idcO Interface to Adobe FDK PEASE -::MIF cdpO Parse and Manipulate FrameMaker MIF files PEASE -::Control cdpO Control a FrameMaker session PEASE - -Marpa cd+O Context Free Parser JKEGL - -Chatbot:: -::Eliza RdpO Eliza algorithm encapsulated in an object JNOLAN - -Quiz:: -::Question cdpO Questions and Answers wrapper RFOLEY - -Template RdpO Extensive Toolkit for template processing ABW -dTemplate bmpO Flexible templating system DLUX - -Barcode:: -::Code128 adpO Generate CODE 128 bar codes WRW - -12) Option, Argument, Parameter and Configuration File Processing - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Getopt:: -::ArgvFile Rdpf Take options from files JSTENZEL -::Declare MdpO An easy-to-use WYSIWYG command-line parser DCONWAY -::EvaP Mdpr Long/short options, multilevel help LUSOL -::Gnu adcf GNU form of long option handling WSCOT -::Help bdpf Yet another getopt, has help and defaults IANPX -::Long Sdpr Advanced handling of command line options JV -::Mixed Rdpf Supports both long and short options CJM -::Regex ad Option handling using regular expressions JARW -::Simple MdpO A simple-to-use interface to Getopt::Long RSAVAGE -::Std Supf Implements basic getopt and getopts P5P -::Tabular adpr Table-driven argument parsing with help text GWARD -::Tiny adpr Table of references interface, auto usage() MUIR - -Getargs:: -::Long cdpf Parses long function args f(-arg => value) RAM - -Argv bdph Provide an OO interface to an ARGV DSB -ConfigReader cdpO Read directives from configuration file AMW -Resources bdpf Application defaults management in Perl FRANCOC - -App:: General application development tools -::Config bdpO Configuration file mgmt ABW -::Manager adch Installing/Managing/Uninstalling Software MLEHMANN - -Config:: -::FreeForm bdpf Provide in-memory configuration data BTROTT -::IniFiles Read/Write INI-Style configuration files RBOW - -CfgTie adph Framework for tieing system admin tasks RANDYM - -13) Internationalization and Locale - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -I18N:: -::Charset Rdpf Character set names and aliases MTHURN -::Collate Sdpr Locale based comparisons JHI -::LangTags Mdpf compare & extract language tags (RFC1766) SBURKE -::WideMulti i Wide and multibyte character string JHI - -Locale:: -::Country Rdpf ISO 3166 two letter country codes NEILB -::Date adpf Month/weekday names in various languages JHI -::Langinfo cdcf The <langinfo.h> API JHI -::Language Rdpf ISO 639 two letter language codes NEILB -::Msgcat RdcO Access to XPG4 message catalog functions CHRWOLF -::PGetText bdpf What GNU gettext does, written in pure perl MSHOYHER -::SubCountry RdpO ISO 3166-2 two letter subcountry codes KIMRYAN -::gettext Rdcf Multilanguage messages PVANDRY -::Maketext RdpO Framework for software localization SBURKE -::PO RdpO Manipulate .po entries from gettext ALANSZ - -Unicode:: -::String RdcO String manipulation for Unicode strings GAAS -::Map8 RdcO Convert between most 8bit encodings GAAS -::Normal i??? Composition, canonical ordering, blocks MHOSKEN -::MapUTF8 Rdpf Conversions to and from arbitrary charsets SNOWHARE - -No:: -::Dato Rdpf Norwegian stuff GAAS -::KontoNr Rdpf Norwegian stuff GAAS -::PersonNr Rdpf Norwegian stuff GAAS -::Sort Rdpf Norwegian stuff GAAS -::Telenor Rdpf Norwegian stuff GAAS - -Cz:: -::Cstocs RdpO Charset reencoding JANPAZ -::Sort RdpO Czech sorting JANPAZ -::Speak bdpf number, etc. convertor to the Czech language YENYA - -Geography:: -::States Rdp? Map states and provinces to their codes ABIGAIL - -Sort:: -::ArbBiLex Mdpf sort functions for arbitrary sort orders SBURKE - -14) Authentication, Security and Encryption (see also Networking) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -User:: -::Utmp Rdcf Perl access to UNIX utmp(x)-style databases MPIOTR -::pwent adpf A by-name interface to password database TOMC -::grent adpf A by-name interface to groups database TOMC -::utent cdcO Interface to utmp/utmpx/wtmp/wtmpx database ROSCH - -PGP adpO Simple interface to PGP subprocess via pipes PGPML -PGP:: -::Sign bdpr Create/verify PGP/GnuPG signatures, securely RRA - -GnuPG bdpO Perl interface to the GNU privacy guard. FRAJULAC -GnuPG:: -::Interface RdpO OO interface to GNU Privacy Guard FTOBIN - -DES adcf DES encryption (libdes) EAYNG -Des adcf DES encryption (libdes) MICB -GSS adcO Generic Security Services API (RFC 2078) MSHLD -OpenCA RmpO Tools for running a Certification Authority MADWOLF -SMIMEUtil amhf Sign, encrypt, verify, decrypt S/MIME mail SAMPO - -Digest:: -::MD5 Rdch MD5 message digest algorithm GAAS -::MD2 Rdch MD2 message digest algorithm GAAS -::SHA1 cdch NIST SHA message digest algorithm UWEH -::HMAC Rdph HMAC message integrity check GAAS - -Crypt:: -::Beowulf Rdpf An original, very fast encryption algorithm SIFUKURT -::Blowfish RdhO XS-based implementation of Blowfish DPARIS -::Blowfish_PP adpO Blowfish encryption algorithm in Pure Perl MATTBM -::CBC adpO Cipherblock chaining for Crypt::DES/IDEA LDS -::CBCeasy bdpf Easy things make really easy with Crypt::CBC MBLAZ -::DES a DES encryption (libdes) GARY -::ElGamal bdpO ElGamal digital signatures and keys VIPUL -::IDEA a International Data Encryption Algorithm GARY -::Keys adpO Management system for cryptographic keys VIPUL -::OTP Rdpf Implements One Time Pad encryption SIFUKURT -::Passwd Mdhf Perl wrapper around the UFC Crypt LUISMUNOZ -::PasswdMD5 Mdhf Interoperable MD5-based crypt() function LUISMUNOZ -::PRSG a 160 bit LFSR for pseudo random sequences GARY -::RC4 Rdpf Implements the RC4 encryption algorithm SIFUKURT -::Random bdpO Cryptographically Strong Random Numbers VIPUL -::Rot13 cdpO simple encryption often seen on usenet AYRNIEU -::RSA bdpO RSA encryption, decryption, key generation VIPUL -::Solitaire Rdpf A very simple encryption system SIFUKURT -::Twofish Rdpf Twofish Encryption Algorothm NISHANT -::UnixCrypt Rdpf Perl-only implementation of crypt(3) MVORL -::RandPasswd RdpO Random password generator based on FIPS-181 JDPORTER -::Rijndael bdch AES/Rijndael Encryption Module DIDO -::TripleDES RdpO Triple DES encyption. VIPUL -::PGP5 bdpO An Object Oriented Interface to PGP5. AGUL -::PGP6 cdpO An Object Oriented Interface to PGP6. AGUL -::PGP cdpO Unified OO Interface to PGP and GnuPG AGUL -::GPG bdpO An Object Oriented Interface to GnuPG AGUL -::ECB Mdph ECB mode for Crypt::DES, Blowfish, etc. APPEL -::CipherSaber bdpO OO module for CS-1 and CS-2 encryption CHROMATIC - -Authen:: -::ACE adcO Interface to Security Dynamics ACE (SecurID) DCARRIGAN -::Krb4 RdcO Interface to Kerberos 4 API JHORWITZ -::Krb5 RdcO Interface to Kerberos 5 API JHORWITZ -::PAM bdch Interface to PAM library NIKIP -::TacacsPlus adcO Authentication on tacacs+ server MSHOYHER -::Ticket adpO Suite consisting of master/client/tools JSMITH - -RADIUS:: -::Dictionary bdpO Object interface to RADIUS dictionaries CHRMASTO -::Packet bdpO Object interface to RADIUS (rfc2138) packets CHRMASTO -::UserFile bdpO Manipulate a RADIUS users file OEVANS - -SSLeay cdcO Interface to SSLeay EAYNG - -15) World Wide Web, HTML, HTTP, CGI, MIME etc (see Text Processing) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -URI:: -::Attr ampO Stores attributes in the URI name space LWWWP -::Bookmark bdpO A Class for bookmarks ASPIERS -::Bookmarks bdpO A Class for bookmark collections ASPIERS -::Escape Rmpf General URI escaping/unescaping functions LWWWP -::Find adpf Find URIs in plain text MSCHWERN -::URL RmpO Uniform Resource Locator objects LWWWP - -CGI:: -::Application RmpO Framework for building reusable web-apps JERLBAUM -::ArgChecker bdpO Consistent, extensible CGI param validation DLOWE -::Authent Mdpf request the HTTP authentification JENDA -::Base RmpO Complete HTTPD CGI Interface class CGIP -::BasePlus RmpO Extra CGI::Base methods (incl file-upload) CGIP -::CList bdpO Manages hierarchical collapsible lists PEARCEC -::Cache adpf Speed up slow CGI scripts by caching BROCSEIB -::Carp cmpf Drop-in Carp replacement for CGI scripts CGIP -::Debug Mdph show CGI debugging data JONAS -::Deurl Mdpr decode the CGI parameters JENDA -::Enurl Mdpr encode the CGI parameters JENDA -::Formalware MdpO Convert an XML file to a suite of CGI forms RSAVAGE -::Imagemap Rdph Imagemap handling for specialized apps MIKEH -::LogCarp Rdph Error, log, bug streams, httpd style format MIKEKING -::MiniSvr RmpO Fork CGI app as a per-session mini server CGIP -::Minimal MdpO A micro-sized CGI handler SNOWHARE -::MxScreen cdpO Screen multi-plexer framework RAM -::Out adpf Buffer CGI output and report errors MUIR -::PathInfo RdpO A lightweight PATH_INFO based CGI package SNOWHARE -::Persistent adpO Transparent State Persistence in CGI scripts VIPUL -::Query adpO Parse CGI quiry strings MPECK -::QuickForm Rdpf Handles UI & validation for CGI forms SUMMER -::Request RmpO Parse CGI request and handle form fields CGIP -::Response ampO Response construction for CGI applications MGH -::Screen adpO Create multi screen CGI-scripts ULPFR -::Session cdpO Persistent storage of complex data in CGI ZED -::SpeedyCGI bdcn Run CGI scripts persistenly HORROCKS -::Validate adpO Advanced CGI form parser ZENIN -::WML RdpO Subclass of CGI.pm for WML output AWOOD -::XML ampO Convert CGI.pm variables to/from XML EISEN -::XMLForm adpO Create/query XML for forms MSERGEANT - -HTML:: -::Base adpO Object-oriented way to build pages of HTML GAND -::CalendarMonth RmpO Calendar Months as easy HTML::Element trees MSISK -::Demoroniser adpO Correct moronic and incompatible HTML JDPORTER -::EP adpO Modular, extensible Perl embedding JWIED -::Element RdpO Representation of a HTML parsing tree SBURKE -::ElementGlob RmpO Manipulate multiple HTML elements as one MSISK -::ElementRaw RmpO Graft HTML strings onto an HTML::Element MSISK -::ElementSuper RmpO Various HTML::Element extensions MSISK -::ElementTable RmpO Tables as easy HTML element structures MSISK -::Embperl Rmcf Embed Perl in HTML GRICHTER -::Entities Rmpf Encode/decode HTML entities LWWWP -::FillInForm adpO Fill in HTML forms, separating HTML and code TJMATHER -::Formatter ampO Convert HTML to plain text or Postscript LWWWP -::HeadParser RmpO Parse <HEAD> section of HTML documents LWWWP -::LinkExtor RmpO Extract links from HTML documents LWWWP -::Mason bdpO Build sites from modular Perl/HTML blocks JSWARTZ -::ParseForm i Parse and handle HTML forms via templates NMONNET -::Parser RmcO Basic HTML Parser LWWWP -::QuickCheck cdpf Fast simple validation of HMTL text YLU -::Simple bdpf Simple functions for generating HTML TOMC -::SimpleParse RdpO Bare-bones HTML parser KWILLIAMS -::StickyForms adpO HTML form generation for mod_perl/CGI PMH -::Stream RdpO HTML output stream ERYQ -::Subtext adpO Text substitutions on an HTML template KAELIN -::Table RupO Write HTML tables via spreadsheet metaphor AJPEACOCK -::TableExtract RmpO Flexible HTML table extraction MSISK -::TableLayout bdpO an extensible OO layout manager PERSICOM -::Template MmpO a simple HTML templating system SAMTREGAR -::TokeParser RmpO Alternative HTML::Parser interface LWWWP -::Validator bdpO HTML validator utilizing nsgmls and libwww SAIT -::Tagset Rdpf data tables useful in parsing HTML SBURKE - -HTML::Widgets:: -::DateEntry RdpO Creates date entry widgets for HTML forms. KENNEDYH -::Menu RdpO Builds an HTML menu FRANKIE -::Search RdpO Perl module for building searches returning FRANKIE - -HTTP:: -::Browscap cdpO Provides info on web browser capabilities JAMESPO -::BrowserDetect adph Detect browser, version, OS from UserAgent LHS -::Cookies RmpO Storage of cookies LWWWP -::DAV ampO A client module for the WebDAV protocol PCOLLINS -::Daemon RmpO Base class for simple HTTP servers LWWWP -::Date Rmpf Date conversion for HTTP date formats LWWWP -::Headers RmpO Class encapsulating HTTP Message headers LWWWP -::Message RmpO Base class for Request/Response LWWWP -::Negotiate Rmpf HTTP content negotiation LWWWP -::Request RmpO Class encapsulating HTTP Requests LWWWP -::Response RmpO Class encapsulating HTTP Responses LWWWP -::Status Rmpf HTTP Status code processing LWWWP -::GHTTP RdcO Perl interface to the gnome ghttp library MSERGEANT -::WebTest bdph Run tests on remote URLs or local web files RANDERSON - -HTTP::Request:: -::Common Rmpf Functions that generate HTTP::Requests LWWWP -::Form RdpO Generates HTTP::Request objects out of forms GBAUER - -WAP:: -::Wbmp i??? Wireless bitmap manipulation module SAA -::WML i??? Wireless Markup language routines SAA - -WML:: -::Card RdpO Builds WML code for different wap browsers MALVARO -::Deck RdpO WML Deck generator MALVARO - -HTTPD:: -::Access cdpO Management of server access control files LDS -::Authen bdpO Preform HTTP Basic and Digest Authentication LDS -::Config cdpO Management of server configuration files LDS -::GroupAdmin bdpO Management of server group databases LDS -::UserAdmin bdpO Management of server user databases LDS - -WWW:: -::BBSWatch adpO email WWW bulletin board postings TAYERS -::Robot adpO Web traversal engine for robots & agents NEILB -::RobotRules ampO Parse /robots.txt file LWWWP -::Search adpO Front-end to Web search engines JOHNH - -WWW::Search:: -::AlltheWeb RdpO Class for searching AlltheWeb JSMYSER -::Deja RdpO Class for www.deja.com searching MTHURN -::Go RdpO Backend class for searching with go.com ALIAN - -LWP RmpO Libwww-perl LWWWP -LWP:: -::Conn ampO LWPng stuff LWWWP -::MediaTypes Rmpf Media types and mailcap processing LWWWP -::Parallel RmpO Allows parallel http and ftp access with LWP MARCLANG -::Protocol RmpO LWP support for URL schemes (http, file etc) LWWWP -::RobotUA RmpO A UserAgent for robot applications LWWWP -::Simple Rmpf Simple procedural interface to libwww-perl LWWWP -::UA ampO LWPng stuff LWWWP -::UserAgent RmpO A WWW UserAgent class LWWWP - -MIME:: -::Base64 Rdhf Encode/decode Base 64 (RFC 2045) GAAS -::QuotedPrint Rdpf Encode/decode Quoted-Printable GAAS -::Decoder RdpO OO interface for decoding MIME messages ERYQ -::Entity RdpO An extracted and decoded MIME entity ERYQ -::Head RdpO A parsed MIME header ERYQ -::IO ?dpO DEPRECATED: now part of IO:: ERYQ -::Latin1 ?dpO DEPRECATED and removed ERYQ -::Lite RdpO Single module for composing simple MIME msgs ERYQ -::Parser RdpO Parses streams to create MIME entities ERYQ -::Types adpr Returns the MIME type for a filename/suffix OKAMOTO -::Words Rdpf Encode/decode RFC1522-escaped header strings ERYQ - -MIME::Lite:: -::HTML bmpO Provide routine to transform HTML to MIME ALIAN - -Apache RmcO Interface to the Apache server API DOUGM - -Apache PerlHandler modules - -Apache:: -::ASP bdpO Implement Active Server Pages CHAMAS -::AdBanner cdpf Ad banner server CHOLET -::AddrMunge bdpf Munge email addresses in webpages MJD -::Archive bdpf Make linked contents pages of .tar(.gz) JPETERSON -::AutoIndex Rdcf Lists directory content GOZER -::AxKit RdcO XML Application Server for Apache MSERGEANT -::BBS cdpO BBS like System for Apache MKOSSATZ -::Cachet i OutputChain with caching MERLYN -::CallHandler cdpf Map filenames to subroutine calls GKNOPS -::Compress bdpO Compress content on the fly KWILLIAMS -::Dir i OO (subclassable) mod_dir replacement DOUGM -::Dispatch bmpf Call PerlHandlers as CGI scripts GEOFF -::Embperl Rmcf Embed Perl in HTML GRICHTER -::EmbperlChain bdpO Feed handler output to Embperl CHOLET -::FTP i Full-fledged FTP proxy PMKANE -::Filter RdpO OutputChain like functionality KWILLIAMS -::Forward bdpO OutputChain like functionality MPB -::Gateway bdpf A multiplexing gateway CCWF -::GzipChain bmpf Compress files on the fly ANDK -::Layer bdpf Layer content tree over one or more SAM -::Magick bdpf Image conversion on-the-fly MPB -::Mason bdpO Build sites w/ modular Perl/HTML blocks JSWARTZ -::ModuleDoc bdpf Self documentation for Apache C modules DOUGM -::NNTPGateway adpf A Web based NNTP (usenet) interface BOUBAKER -::NavBar bdpO Navigation bar generator MPB -::OWA bdpf Runs Oracle PL/SQL Web Toolkit apps SVINTO -::OutputChain bmpO Chain output of stacked handlers JANPAZ -::PageKit ampO Application framework w/ HTML::Template TJMATHER -::PassFile bdpf Send file via OutputChain ANDK -::PerlRun Smpf Run unaltered CGI scripts APML -::PrettyPerl Rdpf Syntax highlighting for Perl files RA -::PrettyText bdpf Re-format .txt files for client display CHTHORMAN -::RandomLocation bdpf Random image display RKOBES -::Registry Smpf Run unaltered CGI scripts APML -::Reload RdpO Reload changed modules (extending StatINC) MSERGEANT -::RobotRules cdpf Enforce robot rules (robots.txt) PARKER -::SSI RmpO Implement server-side includes in Perl KWILLIAMS -::SSIChain bmpO SSI on other modules output JANPAZ -::Sandwich bmpf Layered document (sandwich) maker VKHERA -::ShowRequest bdpf Show phases and module participation DOUGM -::SimpleReplace ampf Simple replacement template tool GEOFF -::Stage Rdpf Manage a document staging directory ANDK -::TarGzip c Manage .tar.gz file ZENIN -::TimedRedirect bdpf Redirect urls for a given time period PETERM -::UploadSvr bdpO A lightweight publishing system ANDK -::VhostSandwich cdpf Virtual host layered document maker MARKC -::WDB bdpf Database query/edit tool using DBI JROWE -::WebSQL cdpO Adaptation of Sybase's WebSQL GUNTHER -::ePerl Rdpr Fast emulated Embedded Perl (ePerl) RSE -::iNcom bdpf An e-commerce framework FRAJULAC - -Apache PerlInitHandler modules - -Apache:: -::RequestNotes ampf Pass cookie & form data around pnotes GEOFF - -Apache PerlAuthenHandler modules - -Apache:: -::AuthAny bdpf Authenticate with any username/password MPB -::AuthenCache bmpf Cache authentication credentials JBODNAR -::AuthCookie RdpO Authen + Authz via cookies KWILLIAMS -::AuthenDBI bmpO Authenticate via Perl's DBI MERGL -::AuthenGSS cdpf Generic Security Service (RFC 2078) DOUGM -::AuthenIMAP bdpf Authentication via an IMAP server MICB -::AuthenPasswdSrv bdpf External authentication server JEFFH -::AuthenPasswd bdpf Authenticate against /etc/passwd DEP -::AuthLDAP bdpf LDAP authentication module CDONLEY -::AuthPerLDAP bdpf LDAP authentication module (PerLDAP) HENRIK -::AuthenNIS bdpf NIS authentication DEP -::AuthNISPlus bdpF NIS Plus authentication/authorization VALERIE -::AuthenRaduis bdpf Authentication via a Radius server DANIEL -::AuthenSmb bdpf Authenticate against NT server PARKER -::AuthenURL bdpf Authenticate via another URL JGROENVEL -::DBILogin bdpf Authenticate to backend database JGROENVEL -::DCELogin bdpf Obtain a DCE login context DOUGM -::PHLogin bdpf Authenticate via a PH database JGROENVEL -::TicketAccess bdpO Ticket based access/authentication MPB - -Apache PerlAuthzHandler modules - -Apache:: -::AuthzAge bmpf Authorize based on age APML -::AuthzDCE cdpf DFS/DCE ACL based access control DOUGM -::AuthzDBI bmpO Group authorization via Perl's DBI MERGL -::AuthzGender bdpf Authorize based on gender MPB -::AuthzNIS bdpf NIS authorization DEP -::AuthzPasswd bdpf Authorize against /etc/passwd DEP -::AuthzSSL bdpf Authorize based on client cert MPB -::RoleAuthz i Role-based authorization DOUGM - -Apache PerlAccessHandler modules - -Apache:: -::AccessLimitNum bmpf Limit user access by number of requests APML -::BlockAgent bdpf Block access from certain agents MPB -::DayLimit bmpf Limit access based on day of week MPB -::IPThrottle cdpf Limit bandwith consumption by IP MERLYN -::RobotLimit cdpf Limit access of robots PARKER -::SpeedLimit bdpf Control client request rate MPB - -Apache PerlTypeHandler modules - -Apache:: -::MIME bdcf Perl implementation of mod_mime MPB -::MimeDBI bdpf Type mapping from a DBI database MPB -::MimeXML bdpf mime encoding sniffer for XML files MSERGEANT - -Apache PerlTransHandler modules (May also include a PerlHandler) - -Apache:: -::AdBlocker bdpf Block advertisement images MPB -::AddHostPath adpf Prepends parts of hostname to URI RJENKS -::AnonProxy bdpf Anonymizing proxy MPB -::Checksum bdpf Manage document checksum trees MPB -::DynaRPC i Dynamically translate URIs into RPCs DOUGM -::LowerCaseGETs bdpf Lowercase URI's when needed PLISTER -::MsqlProxy bmpf Translate URI's into mSQL queries APML -::ProxyPass bdpf Perl implementation of ProxyPass MJS -::ProxyPassThru bdpO Skeleton for vanilla proxy RMANGI -::ProxyCache i Caching proxy DOUGM -::StripSession bdpf Strip session info from URI MPB -::Throttle bdpf Speed-based content negotiation DONS -::TransLDAP bdpf Translate URIs to LDAP queries CDONLEY - -Apache PerlFixupHandler modules - -Apache:: -::RefererBlock bdpf Block based on MIME type + Referer CHOLET -::Timeit bmpf Benchmark PerlHandlers APML -::Usertrack bdpf Perl version of mod_usertrack ABH - -Apache PerlLogHandler modules - -Apache:: -::DBILogConfig bdpf Custom format logging via DBI JBODNAR -::DBILogger bdpf Logging via DBI ABH -::DumpHeaders bdpf Watch HTTP transaction via headers DOUGM -::LogMail bdpf Log certain requests via email MPB -::Traffic bdpf Logs bytes transferred, per-user basis MAURICE -::WatchDog c Look for problematic URIs DOUGM - -Apache PerlChildInitHandler modules - -Apache:: -::Resource Smpf Limit resources used by httpd children APML - -Apache Server Configuration - -Apache:: -::ConfigLDAP i Config via LDAP and <Perl> MARKK -::ConfigDBI i Config via DBI and <Perl> MARKIM -::ModuleConfig SmcO Interface to configuration API APML -::PerlSections SmpO Utilities for <Perl> sections APML -::httpd_conf bmpO Methods to configure and run an httpd APML -::src SmpO Finding and reading bits of source APML - -Apache Database modules - -Apache:: -::DBI bmpO Persistent DBI connection mgmt. MERGL -::Mysql bdpO Persistent connection mgmt. for Mysql NJENSEN - -Apache::Sybase:: -::DBlib bmpO Persistent DBlib connection mgmt. BMILLETT -::CTlib bapO Persistent CTlib connection mgmt. MDOWNING - -Interfaces and integration with Apache C structures and modules - -Apache:: -::Backhand bdcr Bridge between mod_backhand + mod_perl DLOWE -::CmdParms SmcO Interface to Apache cmd_parms struct APML -::Command bmcO Interface to Apache command_rec struct APML -::Connection SmcO Inteface to Apache conn_rec struct APML -::Constants Smcf Constants defined in httpd.h APML -::ExtUtils SmpO Utils for Apache:C/Perl glue APML -::File SmcO Methods for working with files APML -::Handler bmcO Interface to Apache handler_rec struct APML -::Log SmcO ap_log_error interface APML -::LogFile bmcO Interface to Apache's piped logs, etc. APML -::Module bmcO Interface to Apache module struct APML -::Scoreboard RdcO Perl interface to Apache's scoreboard.h DOUGM -::Server SmcO Interface to Apache server_rec struct APML -::SubProcess cmcO Interface to Apache subprocess API APML -::Table SmcO Interface to Apache table struct + API APML -::URI SmcO URI component parsing and unparsing APML -::Util Smcf Interface to Apache's util*.c functions APML - -HTTP Method handler - -Apache:: -::PATCH bdpf HTTP PATCH method handler MPB -::PUT cdpf HTTP PUT method handler SORTIZ -::Roaming bdpO PUT/GET/MOVE/DELETE (Netscape Roaming) JWIED - -Watchdog and Monitoring tools - -Apache:: -::SizeLimit Smpf Graceful exit for large children APML -::GTopLimit Rdpn Child exit on small shared or large mem STAS -::Status Smpf Embedded interpreter runtime status APML -::VMonitor Rdpn Visual System and Processes Monitor STAS - -Apache::Watchdog:: -::RunAway Rdpn RunAway processes watchdog/terminator STAS - -Development and Debug tools - -Apache:: -::DB amcO Hook Perl interactive DB into mod_perl DOUGM -::Debug Rmpf mod_perl debugging utilities APML -::DebugInfo ampO Per-request data logging GEOFF -::DProf bmcf Hook Devel::DProf into mod_perl DOUGM -::FakeRequest ampO Implement Apache methods off-line APML -::Leak bmcf Memory leak tracking routines APML -::Peek amcf Devel::Peek for mod_perl APML -::SawAmpersand bmpf Make sure noone is using $&, $' or $` APML -::SmallProf bmpf Hook Devel::SmallProf into mod_perl DOUGM -::StatINC Smpf Reload require'd files when updated APML -::Symbol bmcO Things for symbol things APML -::Symdump bmpf Symbol table snapshots to disk APML -::test Smpf Handy routines for 'make test' scripts APML - -Miscellaneous Apache modules - -Apache:: -::Byterun i Run Perl bytecode modules DOUGM -::Cookie amcO C version of CGI::Cookie APML -::Icon bdcO Access to AddIcon* configuration DOUGM -::Include Smpf mod_include + Apache::Registry handler APML -::Mmap bdcf Share data via Mmap module FLETCH -::ParseLog bdpO OO interface to Apache log files AKIRA -::RegistryLoader SmpO Apache::Registry startup script loader APML -::Request amcO CGI.pm functionality using API methods APML -::Safe ampO Adaptation of "safecgiperl" APML -::Session bmpO Maintain client <-> httpd session/state JBAKER -::Servlet ampO Interface to the Java Servlet engine IKLUFT -::SIG SmpO Signal handlers for mod_perl APML -::State i Powerful state engine RSE -::TempFile bdpf Manage temporary files TOMHUGHES -::Upload amcO File upload class APML - -Netscape:: -::Cache bdpO Access Netscape cache files SREZIC -::History bdpO Class for accessing Netscape history DB NEILB -::HistoryURL bdpO Like a URI::URL, but with visit time NEILB -::Server adcO Perl interface to Netscape httpd API BSUGARS - -HyperWave:: -::CSP cdpO Interface to HyperWave's HCI protocol GOSSAMER - -WebFS:: -::FileCopy Rdpf Get, put, copy, delete files located by URL BZAJAC - -WebCache:: -::Digest bdpf Internet Cache Protocol (RFCs 2186 and 2187) MHAMILTON - -ASP Rdpr Perl interface to ASP PerlScript TIMMY -Authorizenet bdpf Get Credit Card Info from authorizenet DLINCOLN -BizTalk RdpO Microsoft BizTalk Framework Toolkit SIMONJ -CGI_Lite MnpO Light-weight interface for fast apps SHGUN -CIPP RdpO Preprocessor for embedding Perl, SQL in HTML JRED -Catalog bmpO Manage/display resources catalog (URLs etc.) LDACHARY -PApp adch Multi-page-state-preserving web applications MLEHMANN -WDDX RdpO Allows distributed data exchange via XML GUELICH -WING RmhO Apache based IMAP/NNTP Gateway MICB -WOMP cdpO CGI App Dev Suite: authen/state/html SPADKINS - -FCGI Rdcr Fast CGI SKIMO -FCGI:: -::ProcManager bdpO A FastCGI process manager JURACH - -16) Server and Daemon Utilities - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Event bmch fast, generic event loop JPRIT -Event:: -::Stats Rmcf Collects statistics for Event JPRIT -::tcp bmpO TCP session layer library JPRIT - -EventServer RupO Triggers objects on i/o, timers & interrupts JACKS -::Functions Rupf Utility functions for initializing servers JACKS -::Gettimeofday Rupr gettimeofday syscall wrapper JACKS -::Signal Rupr signalhandler for the eventserver JACKS - -Server::Server:: -::EventDriven RupO See 'EventServer' (compatibility maintained) JACKS - -Server::Echo:: -::MailPipe cup A process which accepts piped mail JACKS -::TcpDForking cup TCP daemon which forks clients JACKS -::TcpDMplx cup TCP daemon which multiplexes clients JACKS -::TcpISWFork cup TCP inetd wait process, forks clients JACKS -::TcpISWMplx cup TCP inetd wait process, multiplexes clients JACKS -::TcpISNowait cup TCP inetd nowait process JACKS -::UdpD cup UDP daemon JACKS -::UdpIS cup UDP inetd process JACKS - -Server::Inet:: -::Functions cdpf Utility functions for Inet socket handling JACKS -::Object cupO Basic Inet object JACKS -::TcpClientObj cupO A TCP client (connected) object JACKS -::TcpMasterObj cupO A TCP master (listening) object JACKS -::UdpObj cupO A UDP object JACKS - -Server::FileQueue:: -::Functions cupf Functions for handling files and mailboxes JACKS -::Object cupO Basic object JACKS -::DirQueue cupO Files queued in a directory JACKS -::MboxQueue cupO Mail queued in a mail box JACKS - -Server::Mail:: -::Functions cupf Functions for handling files and mailboxes JACKS -::Object cupO Basic mail object JACKS - -MailBot cdpO Archive server, listserv, auto-responder RHNELSON -Mud cdcO A multi-user online interactive game server GED - -NetServer:: -::Compiler idph State machine compiler for TCP/IP servers CHSTROSS -::Generic RdpO generic OOP class for internet servers CHSTROSS -::Portal bmpO Sets up a mini-server accessible via telnet JPRIT - -Time:: -::Warp Rmcf Change the start and speed of Event time JPRIT - -Spool:: -::Queue i Generic printer spooling facilities RAM - -17) Archiving, Compression and Conversion - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Compress:: -::Bzip2 Rdcf Interface to the Bzip2 compression library AZEMGI -::LZO Rdcf Interface to the LZO compression library MFX -::LZV1 RdcO Leight-weight Lev-Zimpel-Vogt compression MLEHMANN -::Zlib RdcO Interface to the Info-Zip zlib library PMQS - -Convert:: -::ASN1 adpO Standard en/decode of ASN.1 structures GBARR -::BER adpO Class for encoding/decoding BER messages GBARR -::BinHex anpO Convert to/from RFC1741 HQX7 (Mac BinHex) ERYQ -::EBCDIC adpf ASCII to/from EBCDIC CXL -::Recode Rdpf Mapping functions between character sets GAAS -::SciEng bdpO Convert numbers with scientific notation COLINK -::Translit MdpO String conversion among many character sets GENJISCH -::UU bdpf UUencode and UUdecode ANDK -::UUlib Rdcr Intelligent de- and encode (B64, UUE...) MLEHMANN - -AppleII:: -::Disk bdpO Read/write Apple II disk image files CJM -::ProDOS bdpO Manipulate files on ProDOS disk images CJM -::DOS33 i Manipulate files on DOS 3.3 disk images CJM -::Pascal i Manipulate files on Apple Pascal disk images CJM - -Archive:: -::Tar adpO Read, write and manipulate tar files CDYBED -::Zip RdpO Provides an interface to ZIP archive files NEDKONZ - -PPM Rdpf Perl Package Manager MURRAY - -RPM adcO RPM package management RJRAY -RPM:: -::Constants adcO Constants for RPM package management RJRAY -::Database adcO DB interface for RPM package management RJRAY -::Headers adcO Headers for RPM package management RJRAY - -18) Images, Pixmap and Bitmap Manipulation, Drawing and Graphing - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -ElectricArc RdpO Generic diagram manipulation toolset SELKOVJR -GIFgraph RdpO Obsolete, see GD::Graph MVERB -Gimp Mmch Rich interface to write plugins for The Gimp MLEHMANN -GraphViz RdpO Interface to the GraphViz graphing tool LBROCARD -OpenGL adcf Interface to OpenGL drawing/imaging library FIJI -PGPLOT Rdof PGPLOT plotting library - scientific graphs KGB -PixDraw adcO Drawing and manipulating true color images KSB -RenderMan a Manipulate RenderMan objects GMLEWIS -T3D cdpO Realtime extensible 3D rendering GJB -ThreeD i Namespace root for all kinds of 3D modules ADESC - -GD adcO Interface to Gd Graphics Library LDS -GD:: -::Barcode bdpO Create barcode image with GD KWITKNR -::Graph RdpO Create charts using GD MVERB -::Text RdpO Classes for string handling with GD MVERB - -VRML RdpO VRML methods independent of specification HPALM -VRML:: -::VRML1 RdpO VRML methods with the VRML 1.0 standard HPALM -::VRML2 RdpO VRML methods with the VRML 2.0 standard HPALM -::Color Rdpf color functions and X11 color names HPALM -::Base RdpO common basic methods HPALM -::Browser i A complete VRML viewer LUKKA - -Graphics:: -::Libplot RdcO Binding for C libplotter plotting library JLAPEYRE -::Plotter Rd+O Binding for C++ libplotter plotting library MAKLER -::Simple idcO Simple drawing primitives NEERI -::Turtle idp Turtle graphics package NEERI - -Image:: -::Colorimetry cdpO transform colors between colorspaces JONO -::DS9 adpO Interface to SAO DS9 image & analysis prog DJERIUS -::Grab RdpO Grabbing images off the Internet MAHEX -::Magick RdcO Read, query, transform, and write images JCRISTY -::ParseGIF RdpO Parse GIF images into component parts BENL -::Size Rdpf Measure size of images in common formats RJRAY -::Info RdpO Extract meta information from image files GAAS - -Chart:: -::Base RdpO Business chart widget collection NINJAZ -::Gdchart bdch based on Bruce V's C gdchart distribution MHEMPEL -::Graph Rmpr front-end to gnuplot and XRT MHYOUNG -::PNGgraph RdpO Package to generate PNG graphs, uses GD.pm SBONDS -::Pie adpO Implements "new Chart::Pie()" KARLON -::Plot bdcO Graph two-dimensional data (uses GD.pm) SMORTON -::XMGR Rdph interface to XMGR plotting package TJENNESS - -Xmms bdcO Interactive remote control shell for xmms DOUGM -Xmms:: -::Config bdcO Perl interface to the xmms_cfg_* API DOUGM -::Remote bdcO Perl interface to the xmms_remote_* API DOUGM -::Plugin i Perl interface to the xmms plugin APIs DOUGM - -Flash:: -::SWF cmpO Read/Write Macromedia Flash SWF files SABREN - -19) Mail and Usenet News - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Mail:: -::Address adpf Manipulation of electronic mail addresses GBARR -::Alias bdpO Manipulate E-mail aliases and alias files ZELT -::Audit RdpO Toolkit for constructing mail filters SIMON -::Cap adpO Parse mailcap files as specified in RFC 1524 GBARR -::CheckUser bdpf Checking email addresses for validness ILYAM -::Ezmlm bdpO Object methods for ezmlm mailing lists GHALSE -::Field RdpO Base class for handling mail header fields GBARR -::Folder adpO Base-class for mail folder handling KJOHNSON -::Freshmeat RdpO Parses newsletters from http://freshmeat.net ASPIERS -::Header RdpO Manipulate mail RFC822 compliant headers GBARR -::Internet adpO Functions for RFC822 address manipulations GBARR -::MH adcr MH mail interface MRG -::Mailer adpO Simple mail agent interface (see Mail::Send) GBARR -::POP3Client RdpO Support for clients of POP3 servers SDOWD -::Procmail Rdpf Procmail-like facility for creating easy mai JV -::Send adpO Simple interface for sending mail GBARR -::Sender MdpO socket() based mail with attachments, SMTP JENDA -::Sendmail Rdpf Simple platform independent mailer MIVKOVIC -::UCEResponder i Spamfilter CHSTROSS -::Util adpf Mail utilities (for by some Mail::* modules) GBARR -::IMAPClient RdpO An IMAP Client API DJKERNEN - -Mail::Field:: -::Received RdpO Parses Received headers as per RFC822 ASPIERS - -News:: -::Article adpO Module for handling Usenet articles AGIERTH -::Gateway ampO Mail/news gatewaying, moderation support RRA -::NNTPClient bdpO Support for clients of NNTP servers RVA -::Newsrc adpO Manage .newsrc files SWMCD -::Scan cdpO Gathers and reports newsgroup statistics GBACON - -NNTP:: -::Server i Support for an NNTP server JOEHIL - -NNML:: -::Server adpO An simple RFC 977 NNTP server ULPFR - -IMAP:: -::Admin RdpO IMAP Administration EESTABROO - -Sendmail:: -::Milter Rdch Write mail filters for sendmail in Perl CYING - -20) Control Flow Utilities (callbacks and exceptions etc) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -AtExit Rdpr atexit() function to register exit-callbacks BRADAPP -Callback RdpO Define easy to use function callback objects MUIR -Religion adpr Control where you go when you die()/warn() KJALB - -Hook:: -::PrePostCall adpO Add actions before and after a routine PVERD - -Memoize bdpr Automatically cache results of functions MJD -Memoize:: -::ExpireLRU Rdpr Provide LRU Expiration for Memoize BPOWERS - -21) File Handle, Directory Handle and Input/Output Stream Utilities - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -IO:: -::AtomicFile RdpO Write a file which is updated atomically ERYQ -::Dir cdpO Directory handle objects and methods GBARR -::File cdpO Methods for disk file based i/o handles GBARR -::Handle cdpO Base class for input/output handles GBARR -::Lines RdpO I/O handle to read/write to array of lines ERYQ -::Pipe cdpO Methods for pipe handles GBARR -::Ptty amcf Pseudo terminal interface functions RGIERSIG -::Pty cdpO Methods for pseudo-terminal allocation etc PEASE -::React RdpO OO Expect-like communication GARROW -::STREAMS cdcO Methods for System V style STREAMS control NI-S -::Scalar RdpO I/O handle to read/write to a string ERYQ -::ScalarArray RdpO I/O handle to read/write to array of scalars ERYQ -::Seekable cdpO Methods for seekable input/output handles GBARR -::Select adpO Object interface to system select call GBARR -::Socket cdpO Methods for socket input/output handles GBARR -::Stty bmpf POSIX compliant stty interface RGIERSIG -::Tee RdpO Multiplex output to multiple handles KENSHAN -::Wrap RdpO Wrap old-style FHs in standard OO interface ERYQ -::WrapTie RdpO Tie your handles & retain full OO interface ERYQ -::Zlib adpO IO:: style interface to Compress::Zlib TOMHUGHES - -FileHandle SupO File handle objects and methods P5P -FileCache Supf Keep more files open than the system permits P5P -DirHandle SupO Directory handle objects and methods CHIPS -SelectSaver SupO Save and restore selected file handle CHIPS -Selectable cdpO Event-driven I/O streams MUIR - -Log:: -::Agent adpO A general logging framework RAM -::Dispatch RdpO Log messages to multiple outputs DROLSKY -::Topics Rdpf Control flow of topic based logging messages JARW -::TraceMessages Rdpf Print developer's trace messages EDAVIS - -Log::Agent:: -::Logger cdpO Application-level logging interface RAM -::Rotate adpO Logfile rotation config and support RAM - -Expect RdpO Close relative of Don Libes' Expect in perl RGIERSIG - -22) Microsoft Windows Modules - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Win32:: -::ADO adpf ADO Constants and helper functions MSERGEANT -::ASP Rdpr Makes PerlScript ASP development easier WNODOM -::AbsPath Rdpf relative paths to absolute, understands UNCs JENDA -::AdminMisc Rdcf Misc admin and net functions DAVEROTH -::COM cd+O Access to native COM interfaces JDB -::ChangeNotify bdcO Monitor changes to files and directories CJM -::Clipboard Rdch Interaction with the Windows clipboard ACALPINI -::Console Rdch Win32 Console and Character mode functions ACALPINI -::Event bdcO Use Win32 event objects for IPC CJM -::EventLog adcf Interface to Win32 EventLog functions WIN32 -::FUtils bdcf Implements missing File Utility functions JOCASA -::FileOp Mdpf file operations + fancy dialogs, INI files JENDA -::FileType RdpO modify Win32 fily type mapping JENDA -::GD RdcO Win32 port of the GD extension (gif module) DAVEROTH -::GUI bmch Perl-Win32 Graphical User Interface ACALPINI -::GuiTest adcf SendKeys, FindWindowLike and more ERNGUI -::IPC bdcO Base class for Win32 synchronization objects CJM -::Internet RdcO Perl Module for Internet Extensions ACALPINI -::Message bdcf Network based message passing DAVEROTH -::Mutex bdcO Use Win32 mutex objects for IPC CJM -::NetAdmin adcf Interface to Win32 NetAdmin functions WIN32 -::NetResource adcf Interface to Win32 NetResource functions WIN32 -::ODBC Rd+O ODBC interface for accessing databases DAVEROTH -::OLE Rm+h Interface to OLE Automation JDB -::Pipe Rd+O Named Pipes and assorted function DAVEROTH -::Process adcf Interface to Win32 Process functions WIN32 -::RASE Rdpf Dialup entries and connections on Win32 MBLAZ -::Registry adcf Interface to Win32 Registry functions WIN32 -::Semaphore bdcO Use Win32 semaphore objects for IPC CJM -::SerialPort RdpO Win32 Serial functions/constants/interface BBIRTH -::Shortcut Rd+O Manipulate Windows Shortcut files ACALPINI -::Sound Rdch An extension to play with Windows sounds ACALPINI -::WinError adcf Interface to Win32 WinError functions WIN32 -::SystemInfo RdpO Memory and Processor information CJOHNSTON -::API RdcO Perl Win32 API Import Facility ACALPINI - -WinNT cdcf Interface to Windows NT specific functions WIN32 -NT cdcf Old name for WinNT - being phased out WIN32 -Win95 i Interface to Windows 95 specific functions WIN32 - -Win32API:: -::CommPort RdpO Win32 Serial functions/constants/interface BBIRTH -::Console cdcf Win32 Console Window functions/consts TYEMQ -::File cdcf Win32 file/dir functions/constants TYEMQ -::Registry adcf Win32 Registry functions/constants TYEMQ -::WinStruct cdcf Routines for Win32 Windowing data structures TYEMQ -::Window cdcf Win32 Windowing functions/constants TYEMQ - -23) Miscellaneous Modules - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -ARS Mmhh Interface to Remedy's Action Request API JMURPHY -Agent cdpO Transportable Agent module SPURKIS -Archie Rdpf Archie queries via Prospero ARDP protocol GBOSS -BnP RdhO Build'n'Play all-purpose batch install. tool STBEY -Bundle i Namespace reserved for modules collections ANDK -CPAN RdpO Perl Archive browse and download ANDK -Gedcom bmpO Interface to genealogy Gedcom files PJCJ -Logfile RdpO Generic methods to analyze logfiles ULPFR -NetObj adpO Module loading in real time over TCP/IP JDUNCAN -Neural ad+O Generic simulation of neural networks LUKKA -Nexus cdcO Interface to Nexus (threads/ipc/processes) RDO -Pcap i An interface for LBL's packet capture lib AMOSS -Roman Rdpf Convert Roman numbers to and from Arabic OZAWA -SDDF cd+O Interface to Pablo Self Defining Data Format FIS - -AI:: -::Fuzzy RdpO Perl extension for Fuzzy Logic SABREN -::jNeural RdcO Jet's Neural Architecture JETTERO -::NeuralNet RdpO A simple back-prop neural net JBRYAN - -Astro:: -::Coord Rdpf Transform telescope and source coordinates CPHIL -::Misc Rdpf Miscellaneous astronomical routines CPHIL -::MoonPhase Rdpf Information about the phase of the Moon. RPIKKARA -::SLA Rdcf Interface to SLALIB positional astronomy lib TJENNESS -::SunTime cdpf Calculate sun rise/set times ROBF -::Time Rdpf General time conversions for Astronomers CPHIL -::Sunrise RdpO Computes sunrise/sunset for a given day RKHILL - -Audio:: -::CD bdcO Perl interface to libcdaudio (cd + cddb) DOUGM -::Sox i sox sound library as one or more modules NI-S - -Audio::Play:: -::MPG123 RdcO Generic frontend for MPG123 MLEHMANN - -MPEG:: -::ID3v1Tag MdpO ID3v1 MP3 Tag Reader/Writer SVANZOEST -::ID3v2Tag bdpO OO, extensible ID3 v2.3 tagging module MDIMEO -::MP3Play RdhO Create your own MPEG audio player JRED - -MP3:: -::Info bdpf Manipulate / fetch info from MP3 audio files CNANDOR -::Tag bdpO Tag - Module for reading tags of mp3 files THOGEE - -BarCode:: -::UPC i Produce PostScript UPC barcodes JONO - -Bio i Utilities for molecular biology SEB - -Business:: -::Cashcow i??? Internet payment with the Danish PBS GKE -::CreditCard Rdpf Credit card number check digit test JONO -::ISBN RdpO Work with ISBN as objects BDFOY -::ISSN adpO Object and functions to work with ISSN SAPAPO -::OnlinePayment RdpO Ecommerce middleware JASONK -::UPC ???? manipulating Universal Product Codes ROBF -::US_Amort Mdph US-style loan amortization calculations SBURKE - -Chemistry:: -::Elements RdpO Working with Chemical Elements BDFOY -::Isotopes idpO extends Elements to deal with isotopes BDFOY - -Cisco:: -::Conf adpO Cisco router administratian via TFTP JWIED - -FAQ:: -::OMatic RdpO A CGI-based FAQ/help database maintainer JHOWELL - -FestVox i??? Build synthetic voices (cf. www.festvox.org) LENZO - -Finance:: -::Quote RmpO Fetch stock prices over the Internet PJF -::QuoteHist bdpO Historical stock quotes from multiple sites MSISK - -Games:: -::Cards adpO Tools to write card games in Perl AKARGER -::Dice cdpf Simulates rolling dice PNE -::Hex cdpO Object library for hexmap-based board games JHKIM -::WordFind bdpO Generate word-find type puzzles AJOHNSON -::Alak Rdpf a simple gomoku-like game SBURKE -::Dissociate Mdpf a Dissociated Press algorithm and filter SBURKE -::Worms RdpO A life simulator for Conway/Patterson worms SBURKE - -Geo:: -::METAR Rdpf Process Aviation Weather (METAR) Data JZAWODNY -::Storm_Tracker i Retrieves tropical storm advisories CARPENTER -::WeatherNOAA Rdpf Current/forecast weather from NOAA MSOLOMON - -HP200LX:: -::DB cdpO Handle HP 200LX palmtop computer database GGONTER -::DBgui cdpO Tk base GUI for HP 200LX db files GGONTER - -LEGO:: -::RCX bdpO Control you Lego Mindstorm RCX computer JQUILLAN - -MIDI Mdph read/edit/compose MIDI files SBURKE -MIDI:: -::Realtime cdpO Interacts with MIDI devices in realtime FOOCHRE - -Penguin RdpO Remote Perl in Secure Environment AMERZKY -Penguin:: -::Easy RdpO Provides quick, easy access to Penguin API JDUNCAN - -Psion:: -::Db idpO Handle Psion palmtop computer database files IANPX - -Remedy:: -::AR adcO Interface to Remedy's Action Request API RIK - -Router:: -::LG bdpO Execute commands on routers (based on lg.pl) CHRISJ - -Schedule:: See also Schedule:: in chapter 4 -::Match adpf Pattern-based crontab-like schedule TAIY - -Silly:: -::StringMaths adpf Do maths with letters and strings SKINGTON - -SyslogScan:: -::SyslogEntry bdpO Parse UNIX syslog RHNELSON -::SendmailLine bdpO Summarize sendmail transactions RHNELSON - -Video::Capture:: -::V4l Mdch Video4linux framegrabber interface MLEHMANN - -Watchdog:: -::Service adpO Look for service in process table PSHARPE -::HTTPService adpO Test status of HTTP server PSHARPE -::MysqlService adpO Test status of Mysql server PSHARPE - -24) Interface Modules to Commercial Software - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Resolute:: -::RAPS cd+O Interface to Resolute Software's RAPS CHGOETZE - -AltaVista:: -::SearchSDK cdcf Perl Wrapper for AltaVista SDK functionality JTURNER - -Real:: -::Encode i Interface to Progressive Network's RealAudio KMELTZ - -HtDig RdpO Interface for the HtDig indexing system JTILLMAN -MQSeries RdcO IBM's MQSeries messaging product interface WPMOORE -PQI cdcO Perl Queuing Interface, to MQSeries, MSMQ SIMONJ -R3 bdcO Interface to SAP R/3 using RFCSDK SCHOEN - -Part 3 - Big Projects Registry - -This section of the Module List is devoted to listing "Big Projects". I -don't want to define Big (or even Project) here. Hopefully the items below -speak for themselves. Almost all are just ideas, though some have been -dabbled with and some are active projects. - -These are ideas for people with very strong skills and lots of time. Please -talk, and listen, to Larry and the perl5-porters _before_ starting to do any -work on projects which relate to the core implementation of Perl. - -Ask not when these will be implemented, ask instead how you can help -implement them. - -1) Items in the Todo File - -The Todo supplied with Perl lists over 50 items in categories ranging from -"Would be nice to have" to "Vague possibilities". - -Contacts: P5P - -2) Multi-threading - -This is really two projects. True threads (e.g., POSIX) using multiple -independant perl interpreter structures and simple timeslicing of 'tasks' -within a single perl interpreter. True threads requires operating system -support or an external thread library, simple timeslicing does not (and -should be portable to all platforms). - -Malcolm Beattie < mbeattie@sable.ox.ac.uk > has done extensive work in this -area and is folding this work into Perl now for version 5.005 or 5.006. - -Contacts: MICB P5P - -3) Object Management Group CORBA & IDL - -Work is underway on the COPE mailing list, led by Bart Schuller, to -implement a Perl binding for CORBA. See http://www.lunatech.com/cope/ - -Contacts: COPEML BARTS - -4) Expand Tied Array Interface - -LEN, PUSH, POP, SHIFT, UNSHIFT and a fallback to SPLICE are needed. -Complicated by very widespread use of arrays within perl internals. - -Contacts: P5P CHIPS - -5) Extend Yacc To Write XS Code - -To quote Larry, "The right way to integrate yacc with Perl would be to have -it spit out an XS module, presumably." Some version of yacc, like byacc, -should be converted to spit out an OO .xs and .pm implementing a parser. -Jake Donham's work so far is available in his CPAN directory -http://www.cpan.org/authors/id/JAKE . - -Contacts: JAKE NI-S P5P - -6) Approximate Matching Regular Expressions - -Add support into the core for approximate matching m/.../a (like the agrep -utility). - -Contacts: JHI - -Part 4 - Standards Cross-reference - -This section aims to provide a cross reference between standards that exist -in the computing world and perl modules which have been written to implement -or interface to those standards. - -It also aims to encourage module authors to consider any standards that -might relate to the modules they are developing. - -4.1) IETF - Internet Engineering Task Force (RFCs) - -Standard Description Module Name --------- ----------- ----------- -RFC821 Simple Mail Transfer Protocol Net::SMTP -RFC822 Internet Mail Header Mail::Header -RFC822 Internet Mail addresses Mail::Address -RFC867 Daytime Protocol Net::Time -RFC868 Time Protocol Net::Time -RFC959 File Transfer Protocol Net::FTP -RFC977 A minimal NNTP Server NNML::Server -RFC977 Network News Transfer Protocol Net::NNTP -RFC1035, RFC1183, RFC1706 - Domain names, implementation & specification Net::DNS -RFC1123 Date conversion routines HTTP::Date -RFC1319 MD2 Message-Digest Algorithm Digest::MD2 -RFC1321 MD5 Message-Digest Algorithm Digest::MD5 -RFC1350 Trivial File Transfer Protocol TFTP, Net::TFTP -RFC1413 Identification Protocol Net::Ident -RFC1592 Simple Network Management Protocol SNMP, Net::SNMP -RFC1738 Uniform Resource Locators URI::URL -RFC1777 Lightweight Directory Access Protocol Net::LDAP -RFC1861 Simple Network Pager Protocol Net::SNPP -RFC1866 Encode/decode HTML entities in a string HTML::Entities -RFC1939 Post Office Protocol 3 Net::POP3 -RFC1950-1952 - ZLIB, DEFLATE, GZIP Compress::Zlib -RFC1960 String Representation of LDAP Search Filters Net::LDAP::Filter -RFC2045-2049 - MIME - Multipurpose Internet Mail Extensions MIME::* -RFC2138 Terminal server authentification and accting RADIUS -RFC2229 Dictionary Server Net::Dict -RFC2518 HTTP Extensions for Distributed Authoring HTTP::DAV - -4.2) ITU - International Telegraph Union (X.*) - -Standard Description Module Name --------- ----------- ----------- -X.209 Basic Encoding Rules for ASN.1 Convert::BER - -4.3) ISO - International Standards Organization (ISO*) - -Standard Description Module Name --------- ----------- ----------- -ISO/R 2015-1971 - Date calculations for the Gregorian calendar Date::DateCalc -ISO639 Two letter codes for language identification Locale::Language -ISO3166 Two letter codes for country identification Locale::Country - -Part 5 - Who's Who and What's Where - -5.1) Information / Contact Reference Details (in alphabetical order) - -The following list of email addresses is based on the credentials stored on -the automated Perl Authors Upload Server (PAUSE). If any of the details is -not up to date, you're requested to visit -http://www.cpan.org/modules/04pause.html , where you will find a pointer to -a CGI script that lets you edit the database entries yourself. - -5.2) Perl Frequently Asked Questions (FAQ) - -The FAQ is available on all CPAN sites in the directory doc/FAQs (e.g., - - * http://www.cpan.org/doc/FAQs/ - -) as well as from the RTFM server where you can find all posted FAQs: - - * ftp://rtfm.mit.edu/pub/usenet/news.answers/perl-faq/ - * ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/lang/perl/ - -RTFM mirror sites: North America: - - * ftp://ftp.uu.net/usenet/news.answers - * ftp://mirrors.aol.com/pub/rtfm/usenet - * ftp://mirror.seas.gwu.edu/pub/rtfm - -Europe: - - * ftp://ftp.uni-paderborn.de/pub/FAQ - * ftp://ftp.sunet.se/pub/usenet - -Asia: - - * ftp://nctuccca.edu.tw/USENET/FAQ - * ftp://hwarang.postech.ac.kr/pub/usenet/news.answers - * ftp://ftp.hk.super.net/mirror/faqs diff --git a/doc/memo/01_good_modules b/doc/memo/01_good_modules deleted file mode 100644 index 1983d1de..00000000 --- a/doc/memo/01_good_modules +++ /dev/null @@ -1,1401 +0,0 @@ -::implements RdpO Study in Polymorphism PDCAWLEY -::interface RdpO Another study in polymorphism PDCAWLEY -::override Rdpf perl pragma to override core functions CTWETEN -::vars Rdph Perl pragma to create readonly variables CTWETEN - - -Inline:: - - -Exporter:: -::Import Rdpn Alternate symbol exporter GARROW - - -Safe:: - - -Symbol:: -::Table RdpO OO interface to package symbols GARROW - - -Test:: -::Cmd RdpO Portable test infrastructure for commands KNIGHT -::Harness Supf Executes perl-style tests P5P - - -B:: - - -Filter::Util:: - - -Filter:: - - -Thread:: - - -Module:: -::Reload Rdpf Reloads files in %INC based on timestamps JPRIT - - -Pod:: -::Text Supf convert POD data to formatted ASCII text TOMC -::Rtf RdpO Converter from POD to Rich Text Format PVHP -::Hlp RdpO Convert POD to formatted VMS Help text PVHP -::XML RdpO Generate XML from POD MSERGEANT - - -ExtUtils:: -::MakeMaker SupO Writes Makefiles for extensions MMML -::Manifest Supf Utilities for managing MANIFEST files MMML -::Embed Sdpf Utilities for embedding Perl in C/C++ apps DOUGM -::F77 RdpO Facilitate use of FORTRAN from Perl/XS code KGB - - -Carp:: -::CheckArgs Rdpf Check subroutine argument types GARROW - - -Devel:: -::CallerItem RupO 'caller()' Object wrapper + useful methods JACKS -::DumpStack Rupf Dumping of the current function stack JACKS -::SmallProf Rdpf Line-by-line profiler ASHTED -::StackTrace RdpO Stacktrace object w/ info like Carp::confess DROLSKY -::Symdump RdpO Perl symbol table access and dumping ANDK -::TraceLoad Rdpf Traces the loading of perl source code JPRIT -::Modlist Rdpf Collect module use information RJRAY - - -Exception:: - - -Perf:: Performance measurement other than benchmarks - - -Rcs adcf Alternate RCS interface (see VCS::RCS) CFRETER - - -VCS:: -::CVS RdpO Interface to GNU's CVS RSAVAGE - - -ClearCase:: -::Ct Mnpf Generic cleartool wrapper DSB - - -Sub:: -::Curry Rdpf Perl module to curry functions ((á la Lisp)) DAVIDH - - -Fcntl Sdcf Defines fcntl() constants (see File::Lock) JHI - - -Async:: - - -BSD:: - - -Env:: - - -Proc:: -::Background RdpO OS independent background process objects BZAJAC -::ExitStatus Rdpf Interpret and act on wait() status values ROSCH -::Forkfunc Rdpf Simple lwall-style fork wrapper MUIR -::Spawn Rdpf Run external programs GARROW -::SyncExec Rdpf Spawn processes but report exec() errors ROSCH - - -Schedule:: See also Schedule:: in chapter 23 -::Load RdpO Remote system load, processes, scheduling WSNYDER - - -Sys:: -::AlarmCall Rupf Timeout on any sub. Allows nested alarms JACKS -::Hostname Supf Implements a portable hostname function P5P -::Syslog Supf Provides same functionality as BSD syslog P5P - Note: The Sys:: namespace is considered harmful as it is giving no - - -Be:: - - -FreeBSD:: - - -Mac:: Macintosh specific modules -::AssistantFrames RdpO Easy creation of assistant dialogs GBAUER - - -Mac::AppleEvents:: -::Simple Rdph Simple access to Mac::AppleEvents CNANDOR - - -Mac::Apps:: -::Anarchie RdpO Control Anarchie 2.01+ CNANDOR -::Launch Rdpf MacPerl module to launch / quit apps CNANDOR -::MacPGP RdpO Control MacPGP 2.6.3 CNANDOR -::PBar RdpO Control Progress Bar 1.0.1 CNANDOR - - -Mac::Comm:: -::OT_PPP RdpO Control Open Transport PPP / Remote Access CNANDOR - - -Mac::FileSpec:: -::Unixish Mdpf Unixish-compatability in filespecs SBURKE - - -Mac::OSA:: -::Simple Rdph Simple access to Mac::OSA CNANDOR - - -MSDOS:: - - -MVS:: - - -NeXTStep:: - - -Netware:: - - -OS2:: - - -SGI:: - - -Solaris:: -::MapDev bdpf Maps sdNN disk names to cNtNdN disk names ABURLISON - - -Unix:: -::UserAdmin Rdpf Interface to Unix Account Information JZAWODNY - - -VMS:: - - -PDA:: - - -Hardware:: - - -Device:: - - -Device::ISDN:: - - -Socket:: - - -Net:: -::DummyInetd RdpO A dummy Inetd server GBARR -::Goofey RdpO Communicate with a Goofey server GOSSAMER -::Hotline RdpO Interface to the Hotline protocol JSIRACUSA -::Ident RdpO Performs ident (rfc1413) lookups JPC -::Netmask RdpO Understand and manipulate network blocks MUIR -::Netrc adpO Support for .netrc files GBARR -::PH RdpO CCSO Nameserver Client class GBARR -::Ping SupO TCP and ICMP ping RMOSE -::Printer RdpO Direct to lpd printing CFUHRMAN -::Syslog RdpO Forwarded syslog protocol LHOWARD -::Telnet RdpO Interact with TELNET port or other TCP ports JROGERS -::Pager RdpO Send Numeric/AlphaNumeric Pages to any pager ROOTLEVEL -::Whois RdpO Get+parse "whois" domain data from InterNIC DHUDES -::XWhois RdpO Whois Client Interface for Perl5. VIPUL - - -Net::Daemon:: -::SSL RdpO SSL extension for Net::Daemon MKUL - - -Net::IMAP:: - - -Net::SNMP:: -::Interfaces RdpO Obtain network interface info via SNMP JSTOWE - - -Net::Telnet:: -::Cisco RdpO Net::Telnet wrapper for Cisco devices JOSHUA - - -NetAddr:: -::IP RdpO Manipulation and operations on IP addresses LUISMUNOZ - - -IPC:: -::LDT Rdpf Implements a length based IPC protocol JSTENZEL -::Locker RdpO Shared semaphore locks across a network WSNYDER -::Open2 Supf Open a process for both reading and writing P5P -::Open3 Supf Like IPC::Open2 but with error handling P5P -::SharedCache Rmpr Manage a cache in SysV IPC shared memory SAMTREGAR -::Signal Rdpf Translate signal names to/from numbers ROSCH - - -RPC:: Remote Procedure Calls (see also DCE::RPC) -::PlServer RdpO Interface for building Perl Servers JWIED -::PlClient RdpO Interface for building pServer Clients JWIED - - -DCE:: Distributed Computing Environment (OSF) - - -NetPacket:: - - -Proxy:: - - -IPChains:: - - -SNMP:: -::Util RdpO Perform SNMP set,get,walk,next,walk_hash,... WMARQ - - -Mon:: -::Client RdpO Network monitoring client TROCKIJ -::SNMP RdpO Network monitoring suite TROCKIJ - - -Parallel:: -::ForkManager RdpO A simple parallel processing fork manager DLUX - - -CORBA:: - - -Modem:: -::VBox RdpO Perl module for creation of voiceboxes MLEHMANN - - -ControlX10:: -::CM10 RmpO Control unit for X10 modules BBIRTH -::CM17 RmpO inexpensive RF transmit-only X10 BBIRTH - - -RAS:: -::PortMaster RdpO Interface to Livingston PortMaster STIGMATA -::AS5200 RdpO Interface to Cisco AS5200 dialup server STIGMATA -::HiPerARC RdpO Interface to 3Com TotalControl HiPerARC STIGMATA - - -Math:: -::Amoeba Rdpr Multidimensional Function Minimisation JARW -::BaseCalc RdpO Convert numbers between various bases KWILLIAMS -::BigFloat SupO Arbitrary size floating point math package MARKB -::BigInt SupO Arbitrary size integer math package MARKB -::Brent Rdpr One-dimensional Function Minimisation JARW -::Complex SdpO Complex number data type RAM -::Derivative Rdpr 1st and 2nd order differentiation of data JARW -::Fortran Rdpf Implements Fortran log10 & sign functions JARW -::Interpolate Rdpr Polynomial interpolation of data MATKIN -::Logic RdpO Provides pure 2, 3 or multi-value logic SUMMER -::MatrixReal RdpO Everything you ever wanted to do with Matr. STBEY -::Polynomial RdpO Polynomials as objects MATKIN -::Round RdpO Perl extension for rounding numbers GROMMEL -::SigFigs Rdpf Math using scientific significant figures SBECK -::Spline RdpO Cubic Spline Interpolation of data JARW -::VecStat Rdpr Some basic numeric stats on vectors ASPINELLI - - -Math::Business:: - - -Statistics:: -::ChiSquare Rdpf Chi Square test - how random is your data? JONO -::ConwayLife RdpO Simulates life using Conway's algorithm DANB -::Descriptive RdpO Descriptive statistical methods COLINK -::LTU RdpO Implements Linear Threshold Units TOMFA -::MaxEntropy Rdpf Maximum Entropy Modeling TERDOEST -::Distributions RdpO Perl module for calculating critical values MIKEK - - -Algorithm:: -::Diff Rdpf Diff (also Longest Common Subsequence) NEDKONZ - - -Algorithm::Graphs:: -::TransitiveClosure RdpO Calculates the transitive closure ABIGAIL - - -Algorithm::Numerical:: -::Shuffle Rdph Knuth's shuffle algorithm ABIGAIL - - -PDL:: -::Options Rdph Provides hash options handling for PDL TJENNESS - - -Quantum:: -::Superpositions RdpO QM-like superpositions in Perl DCONWAY - - -Array:: -::Compare RdpO Class to compare two arrays DAVECROSS -::IntSpan RdpO Handling arrays using IntSpan techniques TEVERETT -::Reform RdpO Convert an array into N-sized array of array TBONE - - -Hash:: - - -Heap:: - - -Heap::Elem:: - - -Scalar:: - - -List:: - - -Bit:: - - -Set:: -::Bag RdpO Bag (multiset) class JHI -::NestedGroups RdpO Grouped data eg ACL's, city/state/country ABARCLAY - - -Graph:: -::Element RdpO Base class for element of directed graph NEILB -::Node RdpO A node in a directed graph NEILB -::Edge RdpO An edge in a directed graph NEILB -::Kruskal Rdpf Kruskal Algorithm for Minimal Spanning Trees STBEY - - -Decision:: - - -Date:: -::Format Rdpf Date formatter ala strftime GBARR -::Manip Rdpf Complete date/time manipulation package SBECK -::Parse Rdpf ASCII Date parser using regexp's GBARR - - -Time:: -::Avail Rdpf Calculate min. remaining in time interval PSANTORO -::CTime Rdpf Format Times ala ctime(3) with many formats MUIR -::DaysInMonth Rdpf Returns the number of days in a month MUIR -::JulianDay Rdpf Converts y/m/d into seconds MUIR -::Local Supf Implements timelocal() and timegm() P5P -::ParseDate Rdpf Parses many forms of dates and times MUIR -::Period Rdpf Code to deal with time periods PRYAN -::Timezone Rdpf Figures out timezone offsets MUIR -::Zone Rdpf Timezone info and translation routines GBARR -::gmtime Supf A by-name interface for gmtime TOMC -::localtime Supf A by-name interface for localtime TOMC - - -Calendar:: - - -Tie:: -::Hash Supr Base class for implementing tied hashes P5P -::Scalar Supr Base class for implementing tied scalars P5P -::Array Supr Base class for implementing tied arrays P5P -::Cache Mdpr In memory size limited LRU cache CHAMAS -::DB_FileLock Rdpr Locking access to Berkeley DB 1.x. JMV -::DB_Lock Rdpr Tie DB_File with automatic locking KWILLIAMS -::DBI RdpO Tie hash to a DBI handle LDS -::Discovery Rdpr Discover data by caching sub results SIMON -::Handle RdpO Base class for implementing tied filehandles STBEY -::IxHash RdpO Indexed hash (ordered array/hash composite) GSAR -::LLHash Rdpr Fast ordered hashes via linked lists KWILLIAMS -::ListKeyedHash Rdpr Use lists to key multi-level hashes SNOWHARE -::Persistent Rdpr Persistent data structures via tie RGIERSIG -::RDBM RdpO Tie hashes to relational databases LDS -::SecureHash RdpO Enforced encapsulation of Perl objects DCONWAY -::SortHash Rdpr Provides persistent sorting for hashes CTWETEN -::SubstrHash SdpO Very compact hash stored in a string LWALL -::TextDir Rdpr ties a hash to a directory of textfiles KWILLIAMS -::Cycle RdpO Cycle through a list of values via a scalar. BDFOY - - -Tie::Scalar:: - - -Tie::Cache:: - - -Class:: -::Eroot RdpO Eternal Root - Object persistence DMR -::Multimethods Rdpf A multiple dispatch mechanism for Perl DCONWAY -::NamedParms MdpO A named parameter accessor base class SNOWHARE -::ParmList MdpO A named parameter list processor SNOWHARE -::Template Rdpr Struct/member template builder DMR -::Translucent RdpO Translucent (ala perltootc) method creation GED -::Tree MdpO C++ class hierarchies & disk directories RSAVAGE -::TOM RmpO Transportable Object Model for perl JDUNCAN -::Contract RdpO Design-by-Contract OO in Perl. DCONWAY -::WhiteHole RdpO Treat unhandled method calls as errors MSCHWERN -::BlackHole RdpO treat unhandled method calls as no-op SBURKE -::Classless MdpO Framework for classless OOP SBURKE -::ISA Mdpf Report the search path thru an ISA tree SBURKE - - -Object:: -::Info Rupf General info about objects (is-a, ...) JACKS - - -POE:: Perl Object Environment -::Kernel RdpO An event queue that dispatches events RCAPUTO -::Session RdpO state machine running on POE::Kernel events RCAPUTO - - -POE::Component:: - - -Sort:: -::Versions Rdpf sorting of revision (and similar) numbers KJALB - - -Persistence:: - - -Marshal:: - - -Persistent:: - - -Data:: -::Dumper RdpO Convert data structure into perl code GSAR -::Flow RdpO Acquire data based on recipes ILYAZ -::Locations RdpO Insert data into other data w/o temp files STBEY -::Reporter RdcO Ascii Report Generator RVAZ -::Walker RdpO Navigate through Perl data structures JNOLAN -::JavaScript RdpO Dumps structures into JavaScript code SCHOP - - -Tree:: -::Nary RdpO Perl implementation of N-ary search trees FSORIANO -::DAG_Node MdpO base class for trees SBURKE - - -DFA:: -::Command MdpO Discrete Finite Automata command processor RSAVAGE - - -DBIx:: -::Abstract RmpO Wrapper for DBI that generates SQL TURNERA -::Password MdpO Abstration layer for database passwords KROW - - -DBD:: - - -Oraperl Rmpf Oraperl emulation interface for DBD::Oracle DBIML - - -Ingperl bmpf Ingperl emulation interface for DBD::Ingres HTOUG - - -DDL:: - - -MSSQL:: -::Sqllib MdpO High-level interface using MSSQL::DBlib. SOMMAR - - -Sybase:: -::Sybperl Rdpf sybperl 1.0xx compatibility module MEWP - - -MLDBM:: - - -DB_File:: -::Lock RdpO DB_File wrapper with flock-based locking DHARRIS - - -DBM:: - - -AsciiDB:: - - -Db:: - - -DbFramework:: - - -BTRIEVE:: - - -MARC:: - - -Metadata:: - - -OLE:: - - -Spectrum:: -::CLI RdpO API for Spectrum Enterprise Mgr. CLI PLONKA - - -Spreadsheet:: -::ParseExcel RdpO Get information from Excel file KWITKNR - - -X500:: -::DN MdpO X500 Distinguished Name parser RSAVAGE - - -Term:: -::ANSIColor Sdpf Color output using ANSI escape sequences RRA -::Cap Supf Basic termcap: Tgetent, Tputs, Tgoto TSANDERS -::Complete Supf Tab word completion using stty raw WTOMPSON -::Query Rdpf Intelligent user prompt/response driver AKSTE -::Screen RdpO Basic screen + input class (uses Term::Cap) MRKAE - - -Term::ReadLine:: -::Perl RdpO GNU Readline history and completion in Perl ILYAZ - - -Curses:: -::Widgets Rdpf Assorted widgets for rapid interfaces CORLISS - - -Emacs:: - - -Tk:: -::Axis RmpO Canvas with Axes TKML -::CheckBox RdpO A radio button widget that uses a checkmark DKWILSON -::ChildNotification RdpO Alert widget when child is created DKWILSON -::Clock RdpO Canvas based Clock widget HMBRAND -::Cloth RdpO Object interface to Tk::Canvas and items ACH -::Columns RdpO Multi column lists w/ resizable borders DKWILSON -::ComboEntry RdpO Drop down list + entry widget DKWILSON -::Dial RmpO An alternative to the Scale widget TKML -::FileDialog RdpO A highly configurable file selection widget BPOWERS -::FireButton RdpO Keeps invoking callback when pressed ACH -::IconCanvas RdpO Canvas with movable iconic interface DKWILSON -::LockDisplay RdpO Screen saver/lock widget with animation LUSOL -::Menustrip RdpO Another MenuBar DKWILSON -::NumEntry RdpO Numerical entry widget with up/down buttons ACH -::Olwm RmpO Interface to OpenLook toplevels properties TKML -::Pane RdpO A Frame that can be scrolled TKML -::ProgressBar RdpO Status/progress bar TKML -::RotCanvas RdpO Canvas with arbitrary rotation support AQUMSIEH -::SplitFrame RdpO A sliding separator for two child widgets DKWILSON -::TabFrame RdpO A tabbed frame geometry manager DKWILSON -::TabbedForm RdpO Ext. TabFrame, allowing managed subwidgets DKWILSON -::TableEdit RdpO Simplified interface to a flat file database DKWILSON -::TiedListbox RmpO Gang together Listboxes TKML -::TFrame RdpO A Frame with a title ACH -::Tree RdpO Create and manipulate Tree widgets CTDEAN -::TreeGraph RdpO Widget to draw a tree in a Canvas DDUMONT -::WaitBox RdpO A Wait dialog, of the "Please Wait" variety BPOWERS - - -Log::Dispatch:: -::ToTk RdpO Interface class between Log::Dispatch and Tk DDUMONT -::TkText RdpO Text widget to log Log::Dispatch messages DDUMONT - - -Puppet:: - - -Puppet::VcsTools:: - - -Gtk:: - - -X11:: - - -GUI:: - - -C:: -::Scan RdpO Heuristic parse of C files ILYAZ - - -Language:: - - -Fortran:: - - -ShellScript:: - - -Verilog:: -::Language Rdpf Language support, number parsing, etc WSNYDER -::Parser RdpO Language parsing WSNYDER -::SigParser RdpO Signal and module extraction WSNYDER - - -FFI:: - - -FFI::Win32:: - - -Python:: - - -File:: -::Basename Supf Return basename of a filename P5P -::CheckTree Supf Check file/dir tree against a specification P5P -::Compare Supf Compare file contents quickly P5P -::CounterFile RdpO Persistent counter class GAAS -::Find Supf Call func for every item in a directory tree P5P -::Flock Mdph flock() wrapper. Auto-create locks MUIR -::Listing Rdpf Parse directory listings GAAS -::Path Supf File path and name utilities P5P -::Remote Rdph Read/write/edit remote files transparently NWIGER -::Slurp Mdpf Read/write/append files quickly MUIR -::Sort Rdpf Sort a file or merge sort multiple files CNANDOR -::chmod Mdpf Allows for symbolic chmod notation PINYAN -::stat Supf A by-name interface for the stat function TOMC -::BasicFlock Rdpf Simple flock() wrapper MUIR - - -File::Searcher:: - - -Dir:: -::Purge Rdpf Delete files in directory based on timestamp JV - - -Filesys:: -::Df Rdpr Disk free based on Filesys::Statvfs IGUTHRIE -::Ext2 Rdpf Interface to e2fs filesystem attributes JPIERCE - - -LockFile:: Application-level locking facilities - - -Stat:: -::lsMode Rdpf Translate mode 0644 to -rw-r--r-- MJD - - -String:: -::Approx Rdpf Approximate string matching and substitution JHI -::RexxParse Rdph Perl implementation of REXX 'parse' command BLCKSMTH -::Scanf Rdpf Implementation of C sscanf function JHI -::ShellQuote Rdpf Quote string for safe passage through shells ROSCH -::Random RdpO Perl module to generate random strings based STEVE - - -Text:: -::Abbrev Supf Builds hash of all possible abbreviations P5P -::Bib RdpO Module moved to Text::Refer ERYQ -::DelimMatch RdpO Match (possibly nested) delimited strings NWALSH -::FillIn RdpO Fill-in text templates KWILLIAMS -::Format RdpO Advanced paragraph formatting GABOR -::Graphics RdpO Graphics rendering toolkit with text output SFARRELL -::ParseWords Supf Parse strings containing shell-style quoting HALPOM -::Refer RdpO Parse refer(1)-style bibliography files ERYQ -::Tabs Sdpf Expand and contract tabs ala expand(1) MUIR -::Templar RdpO An object-oriented templating system GED -::Template MdpO Expand template text with embedded perl MJD -::Vpp RdpO Versatile text pre-processor DDUMONT -::Wrap Sdpf Wraps lines to make simple paragraphs MUIR - - -Text::Wrap:: - - -Other Text:: modules (these should be under String:: but pre-date it) - - -Text:: -::Balanced Mdpf Extract balanced-delimiter substrings DCONWAY - - -Text:: - - -Lingua:: -::Ident RdpO Statistical language identification MPIOTR -::Stem Rdph Word stemmer with localization SNOWHARE - - -Lingua:: - - -Lingua::EN:: -::Fathom RdpO Readability measurements of English text KIMRYAN -::Hyphenate Rdpf Syllable based hyphenation DCONWAY -::Infinitive MdpO Find infinitive of a conjugated word RSAVAGE -::Inflect Mdpf English singular->plural and "a"->"an" DCONWAY -::NameCase Rdpf Convert NAMES and names to Correct Case SUMMER -::NameParse RdpO Manipulate persons name KIMRYAN - - -Lingua::EN::Numbers:: -::Ordinate Rdpf go from cardinal (53) to ordinal (53rd) SBURKE - - -Lingua::RU:: - - -PostScript:: -::Font RdpO analyzes PostScript font files JV -::FontInfo RdpO analyzes Windows font info files JV -::FontMetrics RdpO analyzes Adobe Font Metric files JV -::Resources RdpO loads Unix PostScript Resources file JV - - -Font:: -::AFM RdpO Parse Adobe Font Metric files GAAS -::TFM RdpO Read info from TeX font metric files JANPAZ -::Fret RdpO Fret - Font REporting Tool MHOSKEN - - -Number:: -::Format RdpO Package for formatting numbers for display WRW - - -Number::Phone:: -::US Rdpf Validates several US phone number formats KENNEDYH - - -Email:: - - -Parse:: -::RecDescent MdpO Recursive descent parser generator DCONWAY -::Yapp RdpO Generates OO LALR parser modules FDESAR -::YALALR RdpO Yet Another LALR parser SFINK - - -Search:: -::Dict Supf Search a dictionary ordered text file P5P -::InvertedIndex RdpO Inverted index database support SNOWHARE -::Binary Rdpf Generic binary search RANT - - -SGML:: -::Parser RdpO SGML instance parser EHOOD -::Entity RdpO An entity defined in an SGML or XML document KMACLEOD - - -XML:: -::AutoWriter RdpO DOCTYPE based XML output RBS -::Catalog RdpO Resolve public identifiers and remap system EBOHLMAN -::Doctype RdpO A DTD object class RBS -::Element RdpO XML elements with the same interface as HTML SBURKE -::Grove RmpO Flexible lightweight mid-level XML objects KMACLEOD -::PPD RdpO PPD file format and XML parsing elements MURRAY -::PYX RdpO XML to PYX generator MSERGEANT -::TreeBuilder RdpO Build a tree of XML::Element objects SBURKE -::XPath RdpO A set of modules for parsing and evaluating MSERGEANT - - -Frontier:: - - -RDF:: - - -RTF:: - - -SQL:: - - -TeX:: -::DVI RdpO Methods for writing DVI (DeVice Independent) JANPAZ -::Hyphen RdpO Hyphenate words using TeX's patterns JANPAZ - - -FrameMaker:: - - -Chatbot:: -::Eliza RdpO Eliza algorithm encapsulated in an object JNOLAN - - -Quiz:: - - -Barcode:: - - -Getopt:: -::ArgvFile Rdpf Take options from files JSTENZEL -::Declare MdpO An easy-to-use WYSIWYG command-line parser DCONWAY -::EvaP Mdpr Long/short options, multilevel help LUSOL -::Long Sdpr Advanced handling of command line options JV -::Mixed Rdpf Supports both long and short options CJM -::Simple MdpO A simple-to-use interface to Getopt::Long RSAVAGE -::Std Supf Implements basic getopt and getopts P5P - - -Getargs:: - - -App:: General application development tools - - -Config:: - - -I18N:: -::Charset Rdpf Character set names and aliases MTHURN -::Collate Sdpr Locale based comparisons JHI -::LangTags Mdpf compare & extract language tags (RFC1766) SBURKE - - -Locale:: -::Country Rdpf ISO 3166 two letter country codes NEILB -::Language Rdpf ISO 639 two letter language codes NEILB -::SubCountry RdpO ISO 3166-2 two letter subcountry codes KIMRYAN -::Maketext RdpO Framework for software localization SBURKE -::PO RdpO Manipulate .po entries from gettext ALANSZ - - -Unicode:: -::MapUTF8 Rdpf Conversions to and from arbitrary charsets SNOWHARE - - -No:: -::Dato Rdpf Norwegian stuff GAAS -::KontoNr Rdpf Norwegian stuff GAAS -::PersonNr Rdpf Norwegian stuff GAAS -::Sort Rdpf Norwegian stuff GAAS -::Telenor Rdpf Norwegian stuff GAAS - - -Cz:: -::Cstocs RdpO Charset reencoding JANPAZ -::Sort RdpO Czech sorting JANPAZ - - -Geography:: -::States Rdp? Map states and provinces to their codes ABIGAIL - - -Sort:: -::ArbBiLex Mdpf sort functions for arbitrary sort orders SBURKE - - -User:: - - -PGP:: - - -GnuPG:: -::Interface RdpO OO interface to GNU Privacy Guard FTOBIN - - -Digest:: -::HMAC Rdph HMAC message integrity check GAAS - - -Crypt:: -::Beowulf Rdpf An original, very fast encryption algorithm SIFUKURT -::OTP Rdpf Implements One Time Pad encryption SIFUKURT -::RC4 Rdpf Implements the RC4 encryption algorithm SIFUKURT -::Solitaire Rdpf A very simple encryption system SIFUKURT -::Twofish Rdpf Twofish Encryption Algorothm NISHANT -::UnixCrypt Rdpf Perl-only implementation of crypt(3) MVORL -::RandPasswd RdpO Random password generator based on FIPS-181 JDPORTER -::TripleDES RdpO Triple DES encyption. VIPUL -::ECB Mdph ECB mode for Crypt::DES, Blowfish, etc. APPEL - - -Authen:: - - -RADIUS:: - - -URI:: -::Escape Rmpf General URI escaping/unescaping functions LWWWP -::URL RmpO Uniform Resource Locator objects LWWWP - - -CGI:: -::Application RmpO Framework for building reusable web-apps JERLBAUM -::Authent Mdpf request the HTTP authentification JENDA -::Base RmpO Complete HTTPD CGI Interface class CGIP -::BasePlus RmpO Extra CGI::Base methods (incl file-upload) CGIP -::Debug Mdph show CGI debugging data JONAS -::Deurl Mdpr decode the CGI parameters JENDA -::Enurl Mdpr encode the CGI parameters JENDA -::Formalware MdpO Convert an XML file to a suite of CGI forms RSAVAGE -::Imagemap Rdph Imagemap handling for specialized apps MIKEH -::LogCarp Rdph Error, log, bug streams, httpd style format MIKEKING -::MiniSvr RmpO Fork CGI app as a per-session mini server CGIP -::Minimal MdpO A micro-sized CGI handler SNOWHARE -::PathInfo RdpO A lightweight PATH_INFO based CGI package SNOWHARE -::QuickForm Rdpf Handles UI & validation for CGI forms SUMMER -::Request RmpO Parse CGI request and handle form fields CGIP -::WML RdpO Subclass of CGI.pm for WML output AWOOD - - -HTML:: -::CalendarMonth RmpO Calendar Months as easy HTML::Element trees MSISK -::Element RdpO Representation of a HTML parsing tree SBURKE -::ElementGlob RmpO Manipulate multiple HTML elements as one MSISK -::ElementRaw RmpO Graft HTML strings onto an HTML::Element MSISK -::ElementSuper RmpO Various HTML::Element extensions MSISK -::ElementTable RmpO Tables as easy HTML element structures MSISK -::Entities Rmpf Encode/decode HTML entities LWWWP -::HeadParser RmpO Parse <HEAD> section of HTML documents LWWWP -::LinkExtor RmpO Extract links from HTML documents LWWWP -::SimpleParse RdpO Bare-bones HTML parser KWILLIAMS -::Stream RdpO HTML output stream ERYQ -::Table RupO Write HTML tables via spreadsheet metaphor AJPEACOCK -::TableExtract RmpO Flexible HTML table extraction MSISK -::Template MmpO a simple HTML templating system SAMTREGAR -::TokeParser RmpO Alternative HTML::Parser interface LWWWP -::Tagset Rdpf data tables useful in parsing HTML SBURKE - - -HTML::Widgets:: -::DateEntry RdpO Creates date entry widgets for HTML forms. KENNEDYH -::Menu RdpO Builds an HTML menu FRANKIE -::Search RdpO Perl module for building searches returning FRANKIE - - -HTTP:: -::Cookies RmpO Storage of cookies LWWWP -::Daemon RmpO Base class for simple HTTP servers LWWWP -::Date Rmpf Date conversion for HTTP date formats LWWWP -::Headers RmpO Class encapsulating HTTP Message headers LWWWP -::Message RmpO Base class for Request/Response LWWWP -::Negotiate Rmpf HTTP content negotiation LWWWP -::Request RmpO Class encapsulating HTTP Requests LWWWP -::Response RmpO Class encapsulating HTTP Responses LWWWP -::Status Rmpf HTTP Status code processing LWWWP - - -HTTP::Request:: -::Common Rmpf Functions that generate HTTP::Requests LWWWP -::Form RdpO Generates HTTP::Request objects out of forms GBAUER - - -WAP:: - - -WML:: -::Card RdpO Builds WML code for different wap browsers MALVARO -::Deck RdpO WML Deck generator MALVARO - - -HTTPD:: - - -WWW:: - - -WWW::Search:: -::AlltheWeb RdpO Class for searching AlltheWeb JSMYSER -::Deja RdpO Class for www.deja.com searching MTHURN -::Go RdpO Backend class for searching with go.com ALIAN - - -LWP:: -::MediaTypes Rmpf Media types and mailcap processing LWWWP -::Parallel RmpO Allows parallel http and ftp access with LWP MARCLANG -::Protocol RmpO LWP support for URL schemes (http, file etc) LWWWP -::RobotUA RmpO A UserAgent for robot applications LWWWP -::Simple Rmpf Simple procedural interface to libwww-perl LWWWP -::UserAgent RmpO A WWW UserAgent class LWWWP - - -MIME:: -::QuotedPrint Rdpf Encode/decode Quoted-Printable GAAS -::Decoder RdpO OO interface for decoding MIME messages ERYQ -::Entity RdpO An extracted and decoded MIME entity ERYQ -::Head RdpO A parsed MIME header ERYQ -::Lite RdpO Single module for composing simple MIME msgs ERYQ -::Parser RdpO Parses streams to create MIME entities ERYQ -::Words Rdpf Encode/decode RFC1522-escaped header strings ERYQ - - -MIME::Lite:: - - -Apache:: -::CallHandler cdpf Map filenames to subroutine calls GKNOPS -::Filter RdpO OutputChain like functionality KWILLIAMS -::PerlRun Smpf Run unaltered CGI scripts APML -::PrettyPerl Rdpf Syntax highlighting for Perl files RA -::Registry Smpf Run unaltered CGI scripts APML -::Reload RdpO Reload changed modules (extending StatINC) MSERGEANT -::SSI RmpO Implement server-side includes in Perl KWILLIAMS -::Stage Rdpf Manage a document staging directory ANDK -::ePerl Rdpr Fast emulated Embedded Perl (ePerl) RSE - - -Apache:: - - -Apache:: -::AuthCookie RdpO Authen + Authz via cookies KWILLIAMS - - -Apache:: - - -Apache:: - - -Apache:: - - -Apache:: - - -Apache:: - - -Apache:: - - -Apache:: -::Resource Smpf Limit resources used by httpd children APML - - -Apache:: -::PerlSections SmpO Utilities for <Perl> sections APML -::src SmpO Finding and reading bits of source APML - - -Apache:: - - -Apache::Sybase:: - - -Apache:: -::ExtUtils SmpO Utils for Apache:C/Perl glue APML - - -Apache:: - - -Apache:: -::SizeLimit Smpf Graceful exit for large children APML -::GTopLimit Rdpn Child exit on small shared or large mem STAS -::Status Smpf Embedded interpreter runtime status APML -::VMonitor Rdpn Visual System and Processes Monitor STAS - - -Apache::Watchdog:: -::RunAway Rdpn RunAway processes watchdog/terminator STAS - - -Apache:: -::Debug Rmpf mod_perl debugging utilities APML -::StatINC Smpf Reload require'd files when updated APML -::test Smpf Handy routines for 'make test' scripts APML - - -Apache:: -::Include Smpf mod_include + Apache::Registry handler APML -::RegistryLoader SmpO Apache::Registry startup script loader APML -::SIG SmpO Signal handlers for mod_perl APML - - -Netscape:: - - -HyperWave:: - - -WebFS:: -::FileCopy Rdpf Get, put, copy, delete files located by URL BZAJAC - - -WebCache:: - - -FCGI:: - - -Event:: -::Functions Rupf Utility functions for initializing servers JACKS -::Gettimeofday Rupr gettimeofday syscall wrapper JACKS -::Signal Rupr signalhandler for the eventserver JACKS - - -Server::Server:: -::EventDriven RupO See 'EventServer' (compatibility maintained) JACKS - - -Server::Echo:: - - -Server::Inet:: - - -Server::FileQueue:: - - -Server::Mail:: - - -NetServer:: -::Generic RdpO generic OOP class for internet servers CHSTROSS - - -Time:: - - -Spool:: - - -Compress:: - - -Convert:: -::Recode Rdpf Mapping functions between character sets GAAS -::Translit MdpO String conversion among many character sets GENJISCH - - -AppleII:: - - -Archive:: -::Zip RdpO Provides an interface to ZIP archive files NEDKONZ - - -RPM:: - - -GIFgraph RdpO Obsolete, see GD::Graph MVERB - - -GD:: -::Graph RdpO Create charts using GD MVERB -::Text RdpO Classes for string handling with GD MVERB - - -VRML:: -::VRML1 RdpO VRML methods with the VRML 1.0 standard HPALM -::VRML2 RdpO VRML methods with the VRML 2.0 standard HPALM -::Color Rdpf color functions and X11 color names HPALM -::Base RdpO common basic methods HPALM - - -Graphics:: - - -Image:: -::Grab RdpO Grabbing images off the Internet MAHEX -::ParseGIF RdpO Parse GIF images into component parts BENL -::Size Rdpf Measure size of images in common formats RJRAY -::Info RdpO Extract meta information from image files GAAS - - -Chart:: -::Base RdpO Business chart widget collection NINJAZ -::Graph Rmpr front-end to gnuplot and XRT MHYOUNG -::PNGgraph RdpO Package to generate PNG graphs, uses GD.pm SBONDS -::XMGR Rdph interface to XMGR plotting package TJENNESS - - -Xmms:: - - -Flash:: - - -Mail:: -::Audit RdpO Toolkit for constructing mail filters SIMON -::Field RdpO Base class for handling mail header fields GBARR -::Freshmeat RdpO Parses newsletters from http://freshmeat.net ASPIERS -::Header RdpO Manipulate mail RFC822 compliant headers GBARR -::POP3Client RdpO Support for clients of POP3 servers SDOWD -::Procmail Rdpf Procmail-like facility for creating easy mai JV -::Sender MdpO socket() based mail with attachments, SMTP JENDA -::Sendmail Rdpf Simple platform independent mailer MIVKOVIC -::IMAPClient RdpO An IMAP Client API DJKERNEN - - -Mail::Field:: -::Received RdpO Parses Received headers as per RFC822 ASPIERS - - -News:: -::NNTPClient bdpO Support for clients of NNTP servers RVA - - -NNTP:: -::Server i Support for an NNTP server JOEHIL - - -NNML:: - - -IMAP:: -::Admin RdpO IMAP Administration EESTABROO - - -Sendmail:: - - -Hook:: - - -Memoize:: -::ExpireLRU Rdpr Provide LRU Expiration for Memoize BPOWERS - - -IO:: -::AtomicFile RdpO Write a file which is updated atomically ERYQ -::Lines RdpO I/O handle to read/write to array of lines ERYQ -::React RdpO OO Expect-like communication GARROW -::Scalar RdpO I/O handle to read/write to a string ERYQ -::ScalarArray RdpO I/O handle to read/write to array of scalars ERYQ -::Tee RdpO Multiplex output to multiple handles KENSHAN -::Wrap RdpO Wrap old-style FHs in standard OO interface ERYQ -::WrapTie RdpO Tie your handles & retain full OO interface ERYQ - - -Log:: -::Dispatch RdpO Log messages to multiple outputs DROLSKY -::Topics Rdpf Control flow of topic based logging messages JARW -::TraceMessages Rdpf Print developer's trace messages EDAVIS - - -Log::Agent:: - - -Win32:: -::ASP Rdpr Makes PerlScript ASP development easier WNODOM -::AbsPath Rdpf relative paths to absolute, understands UNCs JENDA -::FileOp Mdpf file operations + fancy dialogs, INI files JENDA -::FileType RdpO modify Win32 fily type mapping JENDA -::RASE Rdpf Dialup entries and connections on Win32 MBLAZ -::SerialPort RdpO Win32 Serial functions/constants/interface BBIRTH -::SystemInfo RdpO Memory and Processor information CJOHNSTON - - -Win32API:: -::CommPort RdpO Win32 Serial functions/constants/interface BBIRTH - - -AI:: -::Fuzzy RdpO Perl extension for Fuzzy Logic SABREN -::NeuralNet RdpO A simple back-prop neural net JBRYAN - - -Astro:: -::Coord Rdpf Transform telescope and source coordinates CPHIL -::Misc Rdpf Miscellaneous astronomical routines CPHIL -::MoonPhase Rdpf Information about the phase of the Moon. RPIKKARA -::Time Rdpf General time conversions for Astronomers CPHIL -::Sunrise RdpO Computes sunrise/sunset for a given day RKHILL - - -Audio:: - - -Audio::Play:: - - -MPEG:: -::ID3v1Tag MdpO ID3v1 MP3 Tag Reader/Writer SVANZOEST - - -MP3:: - - -BarCode:: - - -Business:: -::CreditCard Rdpf Credit card number check digit test JONO -::ISBN RdpO Work with ISBN as objects BDFOY -::OnlinePayment RdpO Ecommerce middleware JASONK -::US_Amort Mdph US-style loan amortization calculations SBURKE - - -Chemistry:: -::Elements RdpO Working with Chemical Elements BDFOY - - -Cisco:: - - -FAQ:: -::OMatic RdpO A CGI-based FAQ/help database maintainer JHOWELL - - -Finance:: -::Quote RmpO Fetch stock prices over the Internet PJF - - -Games:: -::Alak Rdpf a simple gomoku-like game SBURKE -::Dissociate Mdpf a Dissociated Press algorithm and filter SBURKE -::Worms RdpO A life simulator for Conway/Patterson worms SBURKE - - -Geo:: -::METAR Rdpf Process Aviation Weather (METAR) Data JZAWODNY -::WeatherNOAA Rdpf Current/forecast weather from NOAA MSOLOMON - - -HP200LX:: - - -LEGO:: - - -MIDI:: - - -Penguin:: -::Easy RdpO Provides quick, easy access to Penguin API JDUNCAN - - -Psion:: - - -Remedy:: - - -Router:: - - -Schedule:: See also Schedule:: in chapter 4 - - -Silly:: - - -SyslogScan:: - - -Video::Capture:: - - -Watchdog:: - - -Resolute:: - - -AltaVista:: - - -Real:: diff --git a/doc/memo/99modlist.txt b/doc/memo/99modlist.txt deleted file mode 100644 index 446c9239..00000000 --- a/doc/memo/99modlist.txt +++ /dev/null @@ -1,3481 +0,0 @@ -The Perl 5 Module List - -Maintained by Tim Bunce and Andreas König <modules@perl.org>; -$Revision$ $Date$ -*- coding:utf-8 -*- - -Contents - -Introduction -Where Are The Modules Kept? -Playing Your Part -How To Get a More Recent Copy of the List -Editorial Information and Copyright - -Part 1 - Modules: Creation, Use and Abuse - -1) Perl 5 Module Terminology -2) Guidelines for Module Creation -3) Guidelines for Converting Perl 4 Library Scripts into Modules -4) Guidelines for Reusing Application Code -5) Namespace Coordination - -Part 2 - The Perl 5 Module List - -1) Module Listing Format -2) Perl Core Modules, Perl Language Extensions and Documentation Tools -3) Development Support -4) Operating System Interfaces, Hardware Drivers -5) Networking, Device Control (modems) and InterProcess Communication -6) Data Types and Data Type Utilities -7) Database Interfaces -8) User Interfaces -9) Interfaces to or Emulations of Other Programming Languages -10) File Names, File Systems and File Locking (see also File Handles) -11) String Processing, Language Text Processing, Parsing and Searching -12) Option, Argument, Parameter and Configuration File Processing -13) Internationalization and Locale -14) Authentication, Security and Encryption -15) World Wide Web, HTML, HTTP, CGI, MIME -16) Server and Daemon Utilities -17) Archiving, Compression and Conversion -18) Images, Pixmap and Bitmap Manipulation, Drawing and Graphing -19) Mail and Usenet News -20) Control Flow Utilities (callbacks and exceptions etc) -21) File Handle, Directory Handle and Input/Output Stream Utilities -22) Microsoft Windows Modules -23) Miscellaneous Modules -24) Interface Modules to Commercial Software - -Part 3 - Big Projects Registry - -1) Items in the Todo File -2) Multi-threading -3) Object Management Group CORBA & IDL -4) Expand Tied Array Interface -5) Extend Yacc To Write XS Code -6) Approximate Matching Regular Expressions - -Part 4 - Standards Cross-reference - -4.1) IETF - Internet Engineering Task Force (RFCs) -4.2) ITU - International Telegraph Union (X.*) -4.3) ISO - International Standards Organization (ISO*) - -Part 5 - Who's Who and What's Where - -5.1) Information / Contact Reference Details -5.2) Perl Frequently Asked Questions (FAQ) Files - - ------------------------------------------------------------------------ - -Introduction - -This document is a semi-formal list of Perl 5 Modules. The Perl 4 concept of -packages has been extended in Perl 5 and a new standardised form of reusable -software component has been defined: the Module. - -Perl 5 Modules typically conform to certain guidelines which make them -easier to use, reuse, integrate and extend. - -This list has two key aims: - - * FOR DEVELOPERS: To change duplication of effort into cooperation. - * FOR USERS: To quickly locate existing software which can be reused. - -This list includes the Perl 5 standard modules, other completed modules, -work-in-progress modules and would-be-nice-to-have ideas for modules. It -also includes guidelines for those wishing to create new modules including -how to name them. - -Where Are The Modules Kept? - -Most, but not all, of the modules can be found within CPAN, the -Comprehensive Perl Archive Network of mirrored FTP sites. Within the CPAN -scheme the modules described in this list can be found in the modules/ -directory below the CPAN root directory. CPAN is a worlswide network of -mirrors and you can find your closest mirror in the file -http://www.cpan.org/SITES.html - -NOTE: If you can't find what you want, or wish to check that what you've -found is the latest version, or wonder why a module mentioned in this list -is not on CPAN, you should contact the person associated with the module -(and not the maintainers of the archives or this list). Contact details are -given at the start of Part 5. - -Playing Your Part - -Perl is a huge collaborative effort. Everyone who uses perl is benefiting -from the contributions of many hundreds, maybe thousands, of people. How -much time has perl saved you since you started using it? - -Do you have any modules you could share with others? For example, you may -have some perl4 scripts from which generally useful, and reusable, modules -could be extracted. There may be many people who would find your work very -useful. Please play your part and contribute to the Perl community where you -can. [ end of sermon :-] - -Help save the world! Please submit new entries and updates to us so we can -keep this list up-to-date. Send the new or corrected entry by email to -modules@perl.org . Please do not send code to this address. Instead upload -your module, once registered, to the PAUSE site for forwarding on to CPAN. -See section 2, especially 2.6 and 2.11. - -How To Get a More Recent Copy of the List - -This Module List is fed into CPAN on a semi-regular basis. Its relative path -within a CPAN mirror is in modules/00modlist.long.html . - -Editorial Information and Copyright - -This document is Copyright (c) 1997-2000 by Tim Bunce and Andreas König. -All rights reserved. Permission to distribute this document, in full or -part, via electronic means (emailed, posted or archived) or printed copy is -granted providing that no charges are involved, reasonable attempt is made -to use the most current version, and all credits and copyright notices are -retained. Requests for other distribution rights, including incorporation in -commercial products, such as books, magazine articles, or CD-ROMs should be -made to Tim.Bunce@ig.co.uk and Andreas.Koenig@mind.de . - -Disclaimer: The content of this document is simply a collection of -information gathered from many sources with little or no checking. There are -NO warranties with regard to this information or its use. - -A little background information... I (Tim) created the Module List in August -1994 and maintained it manually till April 1996. By that time Andreas had -implemented the Perl Authors Upload Server (PAUSE) and it was happily -feeding modules through to the CPAN archive sites (see -http://www.cpan.org/modules/04pause.html for details). Since PAUSE held a -database of module information which could be maintained by module authors -it made sense for the module listing part of the Module List to be built -from that database. In April 1996 Andreas took over the automatic posting of -the Module List and I now maintain the other parts of the text. We plan to -add value to the automation over time. - -Part 1 - Modules: Creation, Use and Abuse - -1) Perl 5 Module Terminology - -Perl 5 implements a class using a package, but the presence of a package -doesn't imply the presence of a class. A package is just a namespace. A -class is a package that provides subroutines that can be used as methods. A -method is just a subroutine that expects, as its first argument, either the -name of a package (for "static" methods), or a reference to something (for -"virtual" methods). - -A module is a file that (by convention) provides a class of the same name -(sans the .pm), plus an import method in that class that can be called to -fetch exported symbols. This module may implement some of its methods by -loading dynamic C or C++ objects, but that should be totally transparent to -the user of the module. Likewise, the module might set up an AUTOLOAD -function to slurp in subroutine definitions on demand, but this is also -transparent. Only the .pm file is required to exist. - -2) Guidelines for Module Creation - -2.1 Do similar modules already exist in some form? - -If so, please try to reuse the existing modules either in whole or by -inheriting useful features into a new class. If this is not practical try to -get together with the module authors to work on extending or enhancing the -functionality of the existing modules. A perfect example is the plethora of -packages in perl4 for dealing with command line options. - -If you are writing a module to expand an already existing set of modules, -please coordinate with the author of the package. It helps if you follow the -same naming scheme and module interaction scheme as the original author. - -2.2 Try to design the new module to be easy to extend and reuse. - -Use blessed references. Use the two argument form of bless to bless into the -class name given as the first parameter of the constructor, e.g.: - - sub new { my $class = shift; return bless {}, $class; } - -or even this if you'd like it to be used as either a static or a virtual -method. - - sub new { my $self = shift; my $class = ref($self) || $self; - return bless {}, $class; } - -Pass arrays as references so more parameters can be added later (it's also -faster). Convert functions into methods where appropriate. Split large -methods into smaller more flexible ones. Inherit methods from other modules -if appropriate. - -Avoid class name tests like: die "Invalid" unless ref $ref eq 'FOO'. -Generally you can delete the "eq 'FOO'" part with no harm at all. Let the -objects look after themselves! If it's vital then you can use the UNIVERSAL -methods isa and can. Generally, avoid hardwired class names as far as -possible. - -Avoid $r->Class::func() where using @ISA=qw(... Class ...) and $r->func() -would work (see perlbot man page for more details). - -Use autosplit or the SelfLoader module so little used or newly added -functions won't be a burden to programs which don't use them. Add test -functions to the module after __END__ either using autosplit or by saying: - - eval join('',<main::DATA>) || die $@ unless caller(); - -Does your module pass the 'empty sub-class' test? If you say "@SUBCLASS::ISA -= qw(YOURCLASS);" your applications should be able to use SUBCLASS in -exactly the same way as YOURCLASS. For example, does your application still -work if you change: $obj = new YOURCLASS; into: $obj = new SUBCLASS; ? - -Avoid keeping any state information in your packages. It makes it difficult -for multiple other packages to use yours. Keep state information in objects. - -Always use -w. Try to "use strict;" (or "use strict qw(...);"). Remember -that you can add "no strict qw(...);" to individual blocks of code which -need less strictness. Always use -w. Always use -w! Follow the guidelines in -the perlstyle(1) manual. - -2.3 Some simple style guidelines - -The perlstyle manual supplied with perl has many helpful points. - -Coding style is a matter of personal taste. Many people evolve their style -over several years as they learn what helps them write and maintain good -code. Here's one set of assorted suggestions that seem to be widely used by -experienced developers: - -Use underscores to separate words. It is generally easier to read -$var_names_like_this than $VarNamesLikeThis, especially for non-native -speakers of English. It's also a simple rule that works consistently with -VAR_NAMES_LIKE_THIS. - -Package/Module names are an exception to this rule. Perl informally reserves -lowercase module names for 'pragma' modules like integer and strict. Other -modules normally begin with a capital letter and use mixed case with no -underscores (need to be short and portable). - -You may find it helpful to use letter case to indicate the scope or nature -of a variable. For example: - - $ALL_CAPS_HERE constants only (beware clashes with perl vars) - $Some_Caps_Here package-wide global/static $no_caps_here function - scope my() or local() variables - -Function and method names seem to work best as all lowercase. E.g., -$obj->as_string(). - -You can use a leading underscore to indicate that a variable or function -should not be used outside the package that defined it. - -For method calls use either - - $foo = new Foo $arg1, $arg2; # no parentheses $foo = - Foo->new($arg1, $arg2); - -but avoid the ambiguous form - - $foo = new Foo($arg1, $arg2); # Foo() looks like function call - -It can be very helpful if the names of the classes that your module uses can -be specified as parameters. Consider: - - $dog_class = $args{dog_class} || 'Dog'; $spot = - $dog_class->new(...); - -This allows the user of your module to specify an alternative class -(typically a subclass of the one you would normally have used). - -On how to report constructor failure, Larry said: - -I tend to see it as exceptional enough that I'll throw a real Perl exception -(die) if I can't construct an object. This has a couple of advantages right -off the bat. First, you don't have to check the return value of every -constructor. Just say "$fido = new Doggie;" and presume it succeeded. This -leads to clearer code in most cases. - -Second, if it does fail, you get a better diagnostic than just the -undefinedness of the return value. In fact, the exception it throws may be -quite rich in "stacked" error messages, if it's rethrowing an exception -caught further in. - -And you can always catch the exception if it does happen using eval {}. - -If, on the other hand, you expect your constructor to fail a goodly part of -the time, then you shouldn't use exceptions, but you should document the -interface so that people will know to check the return value. You don't need -to use defined(), since a constructor would only return a true reference or -a false undef. So good Perl style for checking a return value would simply -say - - $conn = new Connection $addr or die "Couldn't create Connection"; - -In general, make as many things meaningful in a Boolean context as you can. -This leads to straightforward code. Never write anything like - - if (do_your_thing() == OK) - -in Perl. That's just asking for logic errors and domain errors. Just write - - if (do_your_thing()) - -Perl is designed to help you eschew obfuscation, if that's your thing. - -2.4 Select what to export. - -Do NOT export method names! Do NOT export anything else by default without a -good reason! - -Exports pollute the namespace of the module user. If you must export try to -use @EXPORT_OK in preference to @EXPORT and avoid short or common names to -reduce the risk of name clashes. - -Generally anything not exported is still accessible from outside the module -using the ModuleName::item_name (or $blessed_ref->method) syntax. By -convention you can use a leading underscore on names to informally indicate -that they are 'internal' and not for public use. - -(It is actually possible to get private functions by saying: my $subref = -sub { ... }; &$subref; But there's no way to call that directly as a method, -since a method must have a name in the symbol table.) - -As a general rule, if the module is trying to be object oriented then export -nothing. If it's just a collection of functions then @EXPORT_OK anything but -use @EXPORT with caution. - -2.5 Select a name for the module. - -This name should be as descriptive, accurate and complete as possible. Avoid -any risk of ambiguity. Always try to use two or more whole words. Generally -the name should reflect what is special about what the module does rather -than how it does it. - -Having 57 modules all called Sort will not make life easy for anyone (though -having 23 called Sort::Quick is only marginally better :-). Imagine someone -trying to install your module alongside many others. If in any doubt ask for -suggestions in comp.lang.perl.modules or modules@perl.org . - -Please use a nested module name to informally group or categorise a module, -e.g., placing a sorting module into a Sort:: category. A module should have -a very good reason not to have a nested name. Please avoid using more than -one level of nesting for module names (packages or classes within modules -can, of course, use any number). - -Module names should begin with a capital letter. Lowercase names are -reserved for special modules such as pragmas (e.g., lib and strict). - -Note that module names are not related to class hierarchies. A module name -Foo::Bar does not in any way imply that Foo::Bar inherits from Foo. Nested -names are simply used to provide some useful categorisation for humans. The -same is generally true for all package names. - -Since the CPAN is huge and growing daily, it's essential that module authors -choose names which lend themselves to browsing. That means minimizing -acronyms, cute names, and jargon. Also, don't make up a new top level -category unless you have a good reason; please choose an already-existing -category when possible. Send mail to modules@perl.org before you upload, so -we can help you select a name. - -If you insist on a name that we consider inappropriate, we won't prevent you -from uploading your module -- but it'll remain in your "author" directory -and won't be directly visible from CPAN/modules/by-module. - -We appreciate the efforts of the contributors who have helped make the CPAN -the world's largest reusable code repository. Please help us enhance it by -working with us to choose the best name possible. - -If you are developing a suite of related modules/classes it's good practice -to use nested classes with a common prefix as this will avoid namespace -clashes. For example: Xyz::Control, Xyz::View, Xyz::Model etc. Use the -modules in this list as a naming guide. - -If adding a new module to a set, follow the original author's standards for -naming modules and the interface to methods in those modules. - -If developing modules for private internal or project specific use, that -will never be released to the public, then you should ensure that their -names will not clash with any future public module. You can do this either -by using the reserved Local::* category or by using an underscore in the top -level name like Foo_Corp::*. - -To be portable each component of a module name should be limited to 11 -characters. If it might be used on DOS then try to ensure each is unique in -the first 8 characters. Nested modules make this easier. - -2.6 Have you got it right? - -How do you know that you've made the right decisions? Have you picked an -interface design that will cause problems later? Have you picked the most -appropriate name? Do you have any questions? - -The best way to know for sure, and pick up many helpful suggestions, is to -ask someone who knows. The comp.lang.perl.modules Usenet newsgroup is read -by just about all the people who develop modules and it's generally the best -place to ask first. If you need more help then try modules@perl.org . - -All you need to do is post a short summary of the module, its purpose and -interfaces. A few lines on each of the main methods is probably enough. (If -you post the whole module it might be ignored by busy people - generally the -very people you want to read it!) - -Don't worry about posting if you can't say when the module will be ready - -just say so in the message. It might be worth inviting others to help you, -they may be able to complete it for you! - -2.7 README and other Additional Files. - -It's well known that software developers usually fully document the software -they write. If, however, the world is in urgent need of your software and -there is not enough time to write the full documentation please at least -provide a README file containing: - - * A description of the module/package/extension etc. - * A copyright notice - see below. - * Prerequisites - what else you may need to have. - * How to build it - possible changes to Makefile.PL etc. - * How to install it. - * Recent changes in this release, especially incompatibilities - * Changes / enhancements you plan to make in the future. - -If the README file seems to be getting too large you may wish to split out -some of the sections into separate files: INSTALL, Copying, ToDo etc. - -2.8 Adding a Copyright Notice. - -How you choose to licence your work is a personal decision. The general -mechanism is to assert your Copyright and then make a declaration of how -others may copy/use/modify your work. - -Perl, for example, is supplied with two types of licence: The GNU GPL and -The Artistic License (see the files README, Copying and Artistic). Larry has -good reasons for NOT just using the GNU GPL. - -My personal recommendation, out of respect for Larry, Perl and the perl -community at large is to simply state something like: - - Copyright (c) 1997 Your Name. All rights reserved. This program is - free software; you can redistribute it and/or modify it under the - same terms as Perl itself. - -This statement should at least appear in the README file. You may also wish -to include it in a Copying file and your source files. Remember to include -the other words in addition to the Copyright. - -2.9 Give the module a version/issue/release number. - -To be fully compatible with the Exporter and MakeMaker modules you should -store your module's version number in a non-my package variable called -$VERSION. This should be a valid floating point number with at least two -digits after the decimal (ie hundredths, e.g, $VERSION = "0.01"). See -Exporter.pm for details. - -Don't use a "1.3.2" style version directly. If you use RCS or a similar -system which supports multilevel versions/branches you can use this (but put -it all on one line for MakeMaker VERSION_FROM): - -$VERSION = do { my @r=(q$Revision$=~/\d+/g); sprintf -"%d."."%02d"x$#r,@r }; - -It may be handy to add a function or method to retrieve the number. Use the -number in announcements and archive file names when releasing the module -(ModuleName-1.02.tar.gz). See perldoc ExtUtils::MakeMaker.pm for details. - -2.10 Listing Prerequisites in a Bundle module - -If your module needs some others that are available on CPAN, you might -consider creating a 'bundle' module that lists all the prerequisites in a -standardized way. Automatic installation software such as the CPAN.pm module -can take advantage of such a listing and enable your users to install all -prerequisites and your own module with one single command. See the CPAN.pm -module for details. - -2.11 How to release and distribute a module. - -By far the best way to release modules is to register yourself with the Perl -Authors Upload Server (PAUSE). By registering with PAUSE you will be able to -easily upload (or mirror) your modules to the PAUSE server from where they -will be mirrored to CPAN sites across the planet. - -It's good idea to post an announcement of the availability of your module to -the comp.lang.perl.announce Usenet newsgroup. This will at least ensure very -wide once-off distribution. - -If not using PAUSE you should place the module into a major ftp archive and -include details of it's location in your announcement. Some notes about ftp -archives: Please use a long descriptive file name which includes the version -number. Most incoming directories will not be readable/listable, i.e., you -won't be able to see your file after uploading it. Remember to send your -email notification message as soon as possible after uploading else your -file may get deleted automatically. Allow time for the file to be processed -and/or check the file has been processed before announcing its location. - -FTP Archives for Perl Modules: - -Follow the instructions and links on - -http://www.cpan.org/modules/04pause.html - -or upload to: - -ftp://pause.kbx.de/incoming - -and notify upload@pause.kbx.de . - -By using the PAUSE WWW interface you can ask the Upload Server to mirror -your modules from your ftp or WWW site into your own directory on CPAN. -Please remember to send us an updated entry for the Module list! - -2.12 Take care when changing a released module. - -Always strive to remain compatible with previous released versions (see 2.2 -above) Otherwise try to add a mechanism to revert to the old behaviour if -people rely on it. Document incompatible changes. - -3) Guidelines for Converting Perl 4 Library Scripts into Modules - -3.1 There is no requirement to convert anything. - -If it ain't broke, don't fix it! Perl 4 library scripts should continue to -work with no problems. You may need to make some minor changes (like -escaping non-array @'s in double quoted strings) but there is no need to -convert a .pl file into a Module for just that. See perltrap.pod for details -of all known perl4-to-perl5 issues. - -3.2 Consider the implications. - -All the perl applications which make use of the script will need to be -changed (slightly) if the script is converted into a module. Is it worth it -unless you plan to make other changes at the same time? - -3.3 Make the most of the opportunity. - -If you are going to convert the script to a module you can use the -opportunity to redesign the interface. The 'Guidelines for Module Creation' -above include many of the issues you should consider. - -3.4 The pl2pm utility will get you started. - -This utility will read *.pl files (given as parameters) and write -corresponding *.pm files. The pl2pm utilities does the following: - - * Adds the standard Module prologue lines - * Converts package specifiers from ' to :: - * Converts die(...) to croak(...) - * Several other minor changes - -Being a mechanical process pl2pm is not bullet proof. The converted code -will need careful checking, especially any package statements. Don't delete -the original .pl file till the new .pm one works! - -4) Guidelines for Reusing Application Code - -4.1 Complete applications rarely belong in the Perl Module Library. - -4.2 Many applications contain some perl code which could be reused. Help -save the world! Share your code in a form that makes it easy to reuse. - -4.3 Break-out the reusable code into one or more separate module files. - -4.4 Take the opportunity to reconsider and redesign the interfaces. - -4.5 In some cases the 'application' can then be reduced to a small fragment -of code built on top of the reusable modules. In these cases the application -could invoked as: - -5) Namespace Coordination - -The maintainers of the module list are not the Internic for perl namespaces. -They do neither sell namespaces nor can they establish property rights. What -they try to do is to minimize namespace clashes and maximize usablility of -the CPAN archive by setting up a catalogue of modules and control the -indexers. Time permitting, they will also try to give advice for what they -think is a proper usage of the namespace. - -It is an important part of the namespace concept that the module list -maintainers do not guarantee to you that somebody else won't use the, say, -Foo::Bar namespace. The upload area is not censored except for abuse. People -are free to upload any modules they like. Instead, there are several levels -of protection for your namespaces: - -a) The most important is the module list which actually lists and proclaims -your namespace. - -b) The second is the indexing mechanism of the CPAN. Modules are indexed on -a first-come-first-serve basis. The module namespace that is uploaded for -the first time ever gets indexed, but not the module of the second one who -tries to use the same namespace. - -c) As the whole process is trying to benefit the community, all parties are -subject to a wider monitoring within the community. This is sometimes -referred to as security by visibility. - -d) So the next level of namespace protection is the common sense. Your own -common sense. Help to save the world. If you get the impression that -something goes wrong with regard to namespaces, please write to -modules@perl.org and let them know. - -e) The perhaps most interesting namespace protection is provided by the perl -symbol table itself. A namespace Foo:: is just a package name and its -relationship to a namespace Foo::Bar:: is not predetermined whatsoever. The -two namespaces can be closely or loosely related or not related at all, but -what's most important, they can be writen by different authors who may work -rather independently from each other. So if you have registered any -namespace, it does not mean that you own the whole namespace tree that -starts there. If you are registered as the contact for Foo::Bar, you are not -necessarily also associated with Foo::Bar::Baz. - -f) In a few rare cases the module list people restrict indexing of certain -categories. For example: DBI::* under the control of Tim Bunce Sun::* under -the control of Sun Microsystems - -Part 2 - The Perl 5 Module List - -The remainder of this document is divided up into sections. Each section -deals with a particular topic and lists all known modules related to that -topic. Modules are only listed in one section so check all sections that -might related to your particular needs. - -All the information corresponds to the latest updates we have received. We -don't record the version number or release dates of the listed Modules. Nor -do we record the locations of these Modules. Consult the contact, try the -usual perl CPAN sites or ask in comp.lang.perl.modules. Please do *not* ask -us directly, we simply don't have the time. Sorry. - -1) Module Listing Format - -Each Module listing is very short. The main goal is to simply publish the -existence of the modules, or ideas for modules, and enough contact -information for you to find out more. Each listing includes some characters -which convey (approximate) basic status information. - -For example: - -Name DSLI Description Info -------------- ---- -------------------------------------------- ----- -Fcntl Sdcf Defines fcntl() constants (see File::Lock) JHI - -Where the 'DSLI' characters have the following meanings: - - * D - Development Stage (Note: *NO IMPLIED TIMESCALES*): - * - o i - Idea, listed to gain consensus or as a placeholder - o c - under construction but pre-alpha (not yet released) - o a/b - Alpha/Beta testing - o R - Released - o M - Mature (no rigorous definition) - o S - Standard, supplied with Perl 5 - - * S - Support Level: - * - o m - Mailing-list - o d - Developer - o u - Usenet newsgroup comp.lang.perl.modules - o n - None known, try comp.lang.perl.modules - - * L - Language Used: - * - o p - Perl-only, no compiler needed, should be platform independent - o c - C and perl, a C compiler will be needed - o h - Hybrid, written in perl with optional C code, no compiler - needed - o + - C++ and perl, a C++ compiler will be needed - o o - perl and another language other than C or C++ - - * I - Interface Style - * - o f - plain Functions, no references used - o h - hybrid, object and function interfaces available - o n - no interface at all (huh?) - o r - some use of unblessed References or ties - o O - Object oriented using blessed references and/or inheritance - -Where letters are missing they can usually be inferred from the others. For -example 'i' implies 'id', 'S' implies 'Su'. - -The Info column gives a contact reference 'tag'. Lookup this tag in the -"Information / Contact Reference Details" section in Pert 3 of this -document. If no contact is given always try asking in -comp.lang.perl.modules. - -Most Modules are nested in categories such as IPC::Open2 and IPC::Open3. -These are shown as 'IPC::' on one line then each module listed below with a -'::' prefix. - -Ideas For Adoption - -Modules listed as in the 'i' Development Stage with no contact reference are -ideas without an owner. Feel free to 'adopt' these but please let me know so -that we can update the list and thus inform anyone else who might be -interested. Adoption simply means that you either hope to implement the -module one day or would like to cooperate with anyone else who might be -interested in implementing it. - -Cooperation - -Similarly, if an idea that interests you has been adopted by someone please -contact them so you can share ideas. Just because an idea has been adopted -does NOT imply that it's going to be implemented. Just because a module is -listed and being implemented does NOT mean it'll get finished. Waiting -silently in the hope that the Module will appear one day is unlikely to be -fruitful! Offer to help. Cooperate. Pool your efforts. Go on, try it! - -The same applies to modules in all states. Most modules are developed in -limited spare time. If you're interested in a module don't just wait for it -to happen, offer to help. - -Module developers should feel free to announce incomplete work early. If -you're not going to be able to spend much time on something then say so. If -you invite cooperation maybe someone will implement it for you! - -2) Perl Core Modules, Perl Language Extensions and Documentation Tools - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -CORE Sucf Internal package for perl native functions P5P -UNIVERSAL SucO Internal universal base-class JACKS -SUPER SucO Internal class to access superclass methods P5P -DynaLoader SucO Dynamic loader for shared libraries P5P -AutoLoader SupO Automatic function loader (using AutoSplit) P5P -SelfLoader SdpO Automatic function loader (using __DATA__) JACKS -Exporter SupO Implements default import method for modules P5P -Carp Supf Throw exceptions outside current package P5P -Config Supf Stores details of perl build configuration P5P -English Supf Defines English names for special variables P5P -Symbol SupO Create 'anonymous' symbol (typeglobs) refs CHIPS -Opcode Supf Disable named opcodes when compiling code TIMB -Taint bdpf Utilities related to tainting PHOENIX - -Perl Pragmatic Modules - -constant Supf Define compile-time constants P5P -diagnostics Sdpf For reporting perl diagnostics in full form TOMC -enum cdpf resemble enumerated types in C ZENIN -integer Supf Controls float vs. integer arithmetic P5P -less Supf Controls optimisations (yet unimplemented) P5P -lib Supf Simple way to add/delete directories in @INC P5P -overload SdpO Overload perl operators for new data types ILYAZ -sigtrap Supf For trapping an abort and giving a traceback P5P -strict Supf Controls averments (similar to pragmas) P5P -subs Supf use subs qw(x y); is short for sub x; sub y; P5P -vars Supf predeclare variable names P5P - -Experimental pragmatic modules live in the ex:: namespace - -ex:: -ex::implements RdpO Study in Polymorphism PDCAWLEY -ex::interface RdpO Another study in polymorphism PDCAWLEY -ex::override Rdpf perl pragma to override core functions CTWETEN - -ex::constant:: -ex::constant::vars Rdph Perl pragma to create readonly variables CTWETEN - -Perl Language Extensions - -Alias bdcf Convenient access to data/code via aliases GSAR -End RdpO Generalized END {}. ABIGAIL -Error adpO Error/exception handling in an OO-ish way GBARR -Perl adcO Create Perl interpreters from within Perl GSAR -Protect bdpf declare subs private or member JDUNCAN -Regexp adcO An OO interface to regular expressions GBARR -Safe SdcO Restrict eval'd code to safe subset of ops MICB -Softref bdcf Extension for weak/soft referenced SVs ILYAZ - -Inline adp? Easy way to use other languages in Perl INGY -Inline:: -Inline::CPR adpn C Perl Run - Embed Perl in C, ala Inline INGY -Inline::C bdpn Write C extensions in Perl the easy way INGY -Inline::CPP adpO Easy implementation of C++ extensions NEILW -Inline::Python adpO Easy implementation of Python extensions NEILW - -Exporter:: -Exporter::Import Rdpn Alternate symbol exporter GARROW -Exporter::Options adpO Extends Exporter to handle use-line options YSTH -Exporter::PkgAlias adpf Load a module into multiple namespaces JDPORTER - -Safe:: -Safe::Hole bdcO Exec subs in the original package from Safe SEYN - -Symbol:: -Symbol::Table RdpO OO interface to package symbols GARROW - -Test Sdpf Utilities for writing test scripts JPRIT -Test:: -Test::Cmd RdpO Portable test infrastructure for commands KNIGHT -Test::Harness Supf Executes perl-style tests P5P -Test::Unit adpO simple framework for unit testing CLEMBURG -Test::Suite cdpO tbs HENKE -Test::Case cdpO tbs HENKE - -The Perl Compiler - -B aucO The Perl Compiler MICB -O aucO Perl Compiler frontends MICB - -B:: -B::Fathom bdpO Estimate the readability of Perl code KSTAR -B::Graph bdpr Perl Compiler backend to diagram OP trees SMCCAM -B::LexInfo bdcO Show info about subroutine lexical variables DOUGM -B::Size bdcO Measure size of Perl OPs and SVs DOUGM -B::TerseSize bdpO Info about ops and their (estimated) size DOUGM - -Source Code Filters - -Filter::Util:: -Filter::Util::Exec bdcf Interface for creation of coprocess Filters PMQS -Filter::Util::Call bdcf Interface for creation of Perl Filters PMQS - -Filter:: -Filter::exec bdcf Filters script through an external command PMQS -Filter::sh bdcf Filters script through a shell command PMQS -Filter::cpp bdcf Filters script through C preprocessor PMQS -Filter::tee bdcf Copies to file perl source being compiled PMQS -Filter::decrypt bdcf Template for a perl source decryption filter PMQS - -Thread support (note that these are experimental, i.e. pre-alpha) - -Thread cuhO Manipulate threads in Perl (EXPERIMENTAL) P5P - -Thread:: -Thread::Group bdph Wait()-like and grouping functions DSUGAL -Thread::IO i IO routines DSUGAL -Thread::Object i OO routines DSUGAL -Thread::Pool bdpO Worker pools to run Perl code asynchronously MICB -Thread::Queue cuph Thread-safe queues P5P -Thread::Semaphore cuph Thread-safe semaphores P5P -Thread::Signal cuhh A thread which runs signal handlers reliably P5P -Thread::Specific cuhh Thread-specific keys P5P - -Module Support - -Module:: -Module::Reload Rdpf Reloads files in %INC based on timestamps JPRIT - -Documentation Tools: - -Pod:: -Pod::Diff cdpf compare two POD files and report diff IANC -Pod::HTML cdpr converter to HTML KJALB -Pod::Index cdpr index generator KJALB -Pod::Latex cdpr converter to LaTeX KJALB -Pod::LaTeX bdpO Converts pod to latex with Pod::Parser TJENNESS -Pod::Lint cdpO Lint-style validator for pod NEILB -Pod::Lyx adpO A pod to LyX format conversion class RICHARDJ -Pod::Man cdpr converter to man page KJALB -Pod::MIF adpO converter to FrameMaker MIF JNH -Pod::Parser bdpO Base class for parsing pod syntax BRADAPP -Pod::Pdf bdpf Converter to PDF AJFRY -Pod::Pod cdpr converter to canonical pod KJALB -Pod::RTF cdpr converter to RTF KJALB -Pod::Sdf cdpf converter to SDF IANC -Pod::Select bdpf Print only selected sections of pod docs BRADAPP -Pod::Simplify cdpr Common pod parsing code KJALB -Pod::Texinfo cdpr converter to texinfo KJALB -Pod::Text Supf convert POD data to formatted ASCII text TOMC -Pod::Usage bdpf Print Usage messages based on your own pod BRADAPP -Pod::Rtf RdpO Converter from POD to Rich Text Format PVHP -Pod::Hlp RdpO Convert POD to formatted VMS Help text PVHP -Pod::XML RdpO Generate XML from POD MSERGEANT -Pod::PP idpO A Pod pre-processor RAM - -3) Development Support - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -AutoSplit Supf Splits modules into files for AutoLoader P5P -Benchmark Supf Easy way to time fragments of perl code P5P -Conjury Rdp? Generic software construction toolset JWOODYATT -Coy Rdpn Like Carp - only prettier DCONWAY -FindBin adpf Locate current script bin directory GBARR -Include adpO Parse C header files for use in XS GBARR -Make adpO Makefile parsing, and 'make' replacement NI-S -Usage bupr Type and range checking on subroutine args JACKS - -ExtUtils:: -ExtUtils::DynaGlue adcr Methods for generating Perl extension files DOUGM -ExtUtils::MakeMaker SupO Writes Makefiles for extensions MMML -ExtUtils::Manifest Supf Utilities for managing MANIFEST files MMML -ExtUtils::Typemap i xsubpp typemap handling WPS -ExtUtils::Embed Sdpf Utilities for embedding Perl in C/C++ apps DOUGM -ExtUtils::F77 RdpO Facilitate use of FORTRAN from Perl/XS code KGB - -Carp:: -Carp::Assert adpf Stating the obvious to let the computer know MSCHWERN -Carp::CheckArgs Rdpf Check subroutine argument types GARROW - -Devel:: -Devel::CallerItem RupO 'caller()' Object wrapper + useful methods JACKS -Devel::CoreStack adpf generate a stack dump from a core file ADESC -Devel::Coverage adpf Coverage analysis for Perl code RJRAY -Devel::Datum cdpf Debugging And Tracing Ultimate Module CDE -Devel::DebugAPI bdpf Interface to the Perl debug environment JHA -Devel::DebugInit i Create a .gdbinit or similar file JASONS -Devel::DProf Rdcf Execution profiler DMR -Devel::DumpStack Rupf Dumping of the current function stack JACKS -Devel::Leak Rdcf Find perl objects that are not reclaimed NI-S -Devel::PPPort bdcn Portability aid for your XS code KJALB -Devel::Peek adcf Peek at internal representation of Perl data ILYAZ -Devel::RegExp adcO Access perl internal regex functions ILYAZ -Devel::SmallProf Rdpf Line-by-line profiler ASHTED -Devel::StackTrace RdpO Stacktrace object w/ info like Carp::confess DROLSKY -Devel::Symdump RdpO Perl symbol table access and dumping ANDK -Devel::TraceFuncs adpO Trace funcs by using object destructions JOEHIL -Devel::TraceLoad Rdpf Traces the loading of perl source code JPRIT -Devel::Modlist Rdpf Collect module use information RJRAY - -Exception:: -Exception::Class bdpO Declare exception class hierarchies DROLSKY -Exception::Cxx Rd+f Cause perl to longjmp using C++ exceptions JPRIT - -Perf:: Performance measurement other than benchmarks -Perf::ARM adcf Application Response Measurement BBACKER - -Rcs adcf Alternate RCS interface (see VCS::RCS) CFRETER -VCS ampO Generic interface to Version Control Systems LBROCARD - -VCS:: -VCS::CVS RdpO Interface to GNU's CVS RSAVAGE -VCS::PVCS i PVCS Version Manager (intersolv.com) BMIDD -VCS::RCS idpf Interface layer over RCS (See also Rcs) RJRAY -VCS::RCE idcf Perl layer over RCE C API RJRAY - -ClearCase idcf Environment for ClearCase revision control BRADAPP -ClearCase:: -ClearCase::Ct Mnpf Generic cleartool wrapper DSB - -Sub:: -Sub::Curry Rdpf Perl module to curry functions ((á la Lisp)) DAVIDH - -Perlbug RdpO Database driven bug tracking system RFOLEY - -Continuus adpO Interface to Continuus Code Management tool HENKE - -4) Operating System Interfaces, Hardware Drivers - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Env Supf Alias environment variables as perl vars P5P -Errno cdpf Constants from errno.h EACCES, ENOENT etc GBARR -Fcntl Sdcf Defines fcntl() constants (see File::Lock) JHI -Ioctl adcf ioctl(2) constants JPRIT -POSIX SupO An interface to most (all?) of POSIX.1 P5P -Shell Supf Run shell commands transparently within perl P5P - -Async:: -Async::Group adpO Deal with simultaneous asynchronous calls DDUMONT -Async::Process i class to run sub-processes DDUMONT - -BSD:: -BSD::HostIdent i s/gethostname(), s/gethostid() JHI -BSD::Ipfwgen bdpf Generate ipfw(8) filters MUIR -BSD::Resource Rdcf getrusage(), s/getrlimit(), s/getpriority() JHI - -Env:: -Env::Path adpO Advanced operations on path variables DSB - -Proc:: -Proc::Background RdpO OS independent background process objects BZAJAC -Proc::ExitStatus Rdpf Interpret and act on wait() status values ROSCH -Proc::Forkfunc Rdpf Simple lwall-style fork wrapper MUIR -Proc::ProcessTable adcO Unix process table information DURIST -Proc::SafePipe bdpf popen() and `` without calling the shell ROSCH -Proc::Short adpO System calls with timeout option JHKIM -Proc::Simple adpO Fork wrapper with objects MSCHILLI -Proc::Spawn Rdpf Run external programs GARROW -Proc::SyncExec Rdpf Spawn processes but report exec() errors ROSCH -Proc::times adpf By-name interface to process times function TOMC - -GTop bdcO Perl interface to libgtop DOUGM - -Schedule:: See also Schedule:: in chapter 23 -Schedule::At Rd OS independent interface to the at command JOSERODR -Schedule::ByClock adpO Return at given times SCHAFFTER -Schedule::Cron adpO cron-like scheduler for perl subroutines ROLAND -Schedule::Load RdpO Remote system load, processes, scheduling WSNYDER - -Quota Rdcf Disk quota system functions, local & remote TOMZO - -Sys:: -Sys::AlarmCall Rupf Timeout on any sub. Allows nested alarms JACKS -Sys::Hostname Supf Implements a portable hostname function P5P -Sys::Sysconf bdpf Defines constants for POSIX::sysconf() NI-S -Sys::Syslog Supf Provides same functionality as BSD syslog P5P - - Note: The Sys:: namespace is considered harmful as it is giving no - clue about which system. Placing additional modules into this - namespace is discouraged. - -Platform Specific Modules - -Be:: -Be::Attribute Rd+f Manipulate BeOS BFS MIME file attributes TSPIN -Be::Query Rd+f Query a BeOS file system TSPIN - -FreeBSD:: -FreeBSD::SysCalls cdcf FreeBSD-specific system calls GARY - -Mac:: Macintosh specific modules -Mac::AppleEvents bmcO AppleEvent manager and AEGizmos MCPL -Mac::AssistantFrames RdpO Easy creation of assistant dialogs GBAUER -Mac::Components bmcO (QuickTime) Component manager MCPL -Mac::Files bmcO File manager MCPL -Mac::Gestalt bmcO Gestalt manager: Environment enquiries MCPL -Mac::Glue bdpO Control apps with AppleScript terminology CNANDOR -Mac::Macbinary bdpO Decodes MacBinary files. MIYAGAWA -Mac::Memory bmcO Memory manager MCPL -Mac::MoreFiles bmcO Further file management routines MCPL -Mac::OSA bmcO Open Scripting Architecture MCPL -Mac::Processes bmcO Process manager MCPL -Mac::Resources bmcO Resource manager MCPL -Mac::Serial bdpO Interface to Macintosh serial ports DIVERDI -Mac::Types bmcO (Un-)Packing of Macintosh specific types MCPL - -Mac::AppleEvents:: -Mac::AppleEvents::Simple Rdph Simple access to Mac::AppleEvents CNANDOR - -Mac::Apps:: -Mac::Apps::Anarchie RdpO Control Anarchie 2.01+ CNANDOR -Mac::Apps::Launch Rdpf MacPerl module to launch / quit apps CNANDOR -Mac::Apps::MacPGP RdpO Control MacPGP 2.6.3 CNANDOR -Mac::Apps::PBar RdpO Control Progress Bar 1.0.1 CNANDOR - -Mac::Comm:: -Mac::Comm::OT_PPP RdpO Control Open Transport PPP / Remote Access CNANDOR - -Mac::FileSpec:: -Mac::FileSpec::Unixish Mdpf Unixish-compatability in filespecs SBURKE - -Mac::OSA:: -Mac::OSA::Simple Rdph Simple access to Mac::OSA CNANDOR - -MSDOS:: -MSDOS::Attrib bdcf Get/set DOS file attributes in OS/2 or Win32 CJM -MSDOS::Descript bdpO Manage 4DOS style DESCRIPT.ION files CJM -MSDOS::SysCalls adcf MSDOS interface (interrupts, port I/O) DMO - -MVS:: -MVS::VBFile bdpf Read MVS VB (variable-length) files GROMMEL - -NeXTStep:: -NeXTStep::NetInfo idcO NeXTStep's NetInfo (like ONC NIS) PGUEN - -Netware:: -Netware::NDS cd+O Interface to Novell Directory Services KTHOMAS -Netware::Bindery cd+O Interface to Novell Bindery mode calls KTHOMAS - -OS2:: -OS2::ExtAttr RdcO (Tied) access to extended attributes ILYAZ -OS2::FTP bncf Access to ftplib interface ILYAZ -OS2::PrfDB RdcO (Tied) access to .INI-style databases ILYAZ -OS2::REXX RdcO Access to REXX DLLs and REXX runtime ILYAZ -OS2::UPM bncf User Profile Management ILYAZ - -Riscos i Namespace for Risc-OS (Acorn et.al.) RISCOSML - -SGI:: -SGI::SysCalls cdcf SGI-specific system calls AMOSS -SGI::GL adcr SGI's Iris GL library AMOSS -SGI::FM adcr SGI's Font Management library AMOSS -SGI::FAM RdcO Interface to SGI/Irix File Access Monitor JGLICK - -Solaris:: -Solaris::ACL adch Provides access to ACLs in Solaris IROBERTS -Solaris::Kmem idcf Read values from the running kernel ABURLISON -Solaris::Kstat adcO Access kernel performance statistics ABURLISON -Solaris::MIB idcO Access STREAMS network statistics ABURLISON -Solaris::MapDev bdpf Maps sdNN disk names to cNtNdN disk names ABURLISON -Solaris::NDD idcO Access network device statistics ABURLISON -Solaris::Procfs adhh Access to the Solaris /proc filesystem JNOLAN -Solaris::InstallDB bdp? Searches for Solaris package/system info CHRISJ -Solaris::Package bdpO Access a Solaris package pkginfo file CHRISJ -Solaris::Contents bdp? Access a Solaris contents file CHRISJ - -Unix:: -Unix::ConfigFile adpO Abstract interfaces to Unix config files SSNODGRA -Unix::Processors RdcO Interface to per-processor information WSNYDER -Unix::Syslog i Interface to syslog functions in a C-library MHARNISCH -Unix::UserAdmin Rdpf Interface to Unix Account Information JZAWODNY - -VMS:: -VMS::Device Rdcr Access info about any device on a VMS system DSUGAL -VMS::Filespec Sdcf VMS and Unix file name syntax CBAIL -VMS::ICC bdcr Interface to the ICC facilities in VMS 7.2+ DSUGAL -VMS::Lock cncO Object interface to $ENQ (VMS lock mgr) BHUGHES -VMS::Misc Rdcr Miscellaneous VMS utility routines DSUGAL -VMS::Monitor Rdcr Access VMS system performance info DSUGAL -VMS::Persona Rdcf Interface to the VMS Persona services DSUGAL -VMS::Priv Rdcf Access VMS Privileges for processes DSUGAL -VMS::Process Rdcf Process management on VMS DSUGAL -VMS::Queue bdcf Manage queues and entries DSUGAL -VMS::SysCalls i VMS-specific system calls CBAIL -VMS::System Rdcf VMS-specific system calls DSUGAL -VMS::User bdcr Read access to system UAF data DSUGAL - -Portable Digital Assistants - -PDA:: -PDA::Pilot amcO Interface to pilot-link library KJALB -PDA::PilotDesktop i Managing Pilot Desktop databases software JWIEGLEY - -Hardware related modules - -Hardware:: -Hardware::Simulator adpf Simulate different pieces of hardware GSLONDON - -Device:: -Device::SerialPort bdpO POSIX clone of Win32::SerialPort BBIRTH -Device::SVGA c SVGA Graphic card driver SCOTTVR - -Device::ISDN:: -Device::ISDN::OCLM bd?? Perl interface to the 3com OCLM ISDN TA MERLIN - -5) Networking, Device Control (modems) and InterProcess Communication - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Socket Smcf Defines socket-related constants GNAT -Socket6 adcf getaddrinfo/getnameinfo support module UMEMOTO -Ptty adcf Pseudo terminal interface functions NI-S - -Socket:: -Socket::PassAccessRights adcf Pass file descriptor via Unix domain socket SAMPO - -Net:: -Net::ACAP adpO Interface to ACAP Protocol (Internet-Draft) KJOHNSON -Net::AIM adpO AOL Instant Messenger TOC protocol ARYEH -Net::AOLIM bdpO AOL Instant Messenger OO Interface (TOC) RWAHBY -Net::Bind adpO Interface to bind daemon files KJOHNSON -Net::CDDB cdpr Interface to the CDDB (CD Database) DSTALDER -Net::Cmd cdpO For command based protocols (FTP, SMTP etc) GBARR -Net::DLookup adpO Lookup domains on Internic and 2-letter TLDs DJASMINE -Net::DNS bdpO Interface to the DNS resolver MFUHR -Net::Daemon adpO Abstract base class for portable servers JWIED -Net::Dict cdpO Client of Dictionary Server Protocol (DICT) ABIGAIL -Net::Dnet cdcO DECnet-specific socket usage SPIDB -Net::Domain adpf Try to determine TCP domain name of system GBARR -Net::DummyInetd RdpO A dummy Inetd server GBARR -Net::FTP adpf Interface to File Transfer Protocol GBARR -Net::Gen RdcO Generic support for socket usage SPIDB -Net::Goofey RdpO Communicate with a Goofey server GOSSAMER -Net::Hotline RdpO Interface to the Hotline protocol JSIRACUSA -Net::ICAP adpO Interface to ICAP Protocol (Internet-Draft) KJOHNSON -Net::ICB bdpO ICB style chat server interface JMV -Net::IMAP adpO Interface to IMAP Protocol (RFC2060) KJOHNSON -Net::IRC cdpO Internet Relay Chat interface DSHEPP -Net::Ident RdpO Performs ident (rfc1413) lookups JPC -Net::Inet RdcO Internet (IP) socket usage SPIDB -Net::Interface adcO ifconfig(1) implementation SRZ -Net::Jabber ampO Access to the Jabber protocol REATMON -Net::LDAP adpO Interface to LDAP Protocol (RFC1777) PLDAP -Net::LDAPapi Rdcf Interface to UMICH and Netscape LDAP C API CDONLEY -Net::MsgLink cdpO Abstraction of "user" part for message link RAM -Net::NIS adcO Interface to Sun's NIS RIK -Net::NISPlus adcO Interface to Sun's NIS+ RIK -Net::NNTP adpO Client interface to NNTP protocol GBARR -Net::Netmask RdpO Understand and manipulate network blocks MUIR -Net::Netrc adpO Support for .netrc files GBARR -Net::PH RdpO CCSO Nameserver Client class GBARR -Net::POP3 adpO Client interface to POP3 protocol GBARR -Net::Patricia RdcO Patricia Trie perl module for fast IP addres PLONKA -Net::Pcap adcr An interface for LBL's packet capture lib PLISTER -Net::Ping SupO TCP and ICMP ping RMOSE -Net::Printer RdpO Direct to lpd printing CFUHRMAN -Net::SMTP adpf Interface to Simple Mail Transfer Protocol GBARR -Net::SNMP adpO Interface to SNMP Protocol (RFC1157) GBARR -Net::SNPP cdpO Client interface to SNPP protocol GBARR -Net::SOCKS cdcf TCP/IP access through firewalls using SOCKS SCOOPER -Net::SSLeay bmhf Secure Socket Layer (based on OpenSSL) SAMPO -Net::Syslog RdpO Forwarded syslog protocol LHOWARD -Net::TCP RdcO TCP-specific socket usage SPIDB -Net::TFTP cdpf Interface to Trivial File Transfer Protocol GSM -Net::Telnet RdpO Interact with TELNET port or other TCP ports JROGERS -Net::Time adpf Obtain time from remote machines GBARR -Net::Traceroute bdpO Trace routes HAG -Net::UDP RdcO UDP-specific socket usage SPIDB -Net::VNC i??? Interface VNC remote frame buffer protocol BRONG -Net::hostent adpf A by-name interface for hosts functions TOMC -Net::netent adpf A by-name interface for networks functions TOMC -Net::protoent adpf A by-name interface for protocols functions TOMC -Net::servent adpf A by-name interface for services functions TOMC -Net::xAP adpO Interface to IMAP,ACAP,ICAP substrate KJOHNSON -Net::Z3950 adcO OO interface to the Yaz Z39.50 toolkit MIRK -Net::SSL RdcO Glue that enables LWP to access https URIs CHAMAS -Net::Pager RdpO Send Numeric/AlphaNumeric Pages to any pager ROOTLEVEL -Net::Whois RdpO Get+parse "whois" domain data from InterNIC DHUDES -Net::XWhois RdpO Whois Client Interface for Perl5. VIPUL -Net::ICQ bmpO Client interface to ICQ messaging JMUHLICH - -Net::Daemon:: -Net::Daemon::SSL RdpO SSL extension for Net::Daemon MKUL - -Net::IMAP:: -Net::IMAP::Simple bdpO Only implements the basic IMAP features JPAF - -Net::SNMP:: -Net::SNMP::Interfaces RdpO Obtain network interface info via SNMP JSTOWE - -Net::Telnet:: -Net::Telnet::Cisco RdpO Net::Telnet wrapper for Cisco devices JOSHUA - -NetAddr:: -NetAddr::IP RdpO Manipulation and operations on IP addresses LUISMUNOZ - -IPC:: -IPC::Cache adpO Shared-memory object cache DCLINTON -IPC::Chat2 ? Out-of-service during refit! GBARR -IPC::ChildSafe RdcO Control child process w/o risk of deadlock DSB -IPC::Globalspace cdpO Multi-process shared hash and shared events JACKS -IPC::LDT Rdpf Implements a length based IPC protocol JSTENZEL -IPC::Locker RdpO Shared semaphore locks across a network WSNYDER -IPC::Mmap i Interface to Unix's mmap() shared memory MICB -IPC::Open2 Supf Open a process for both reading and writing P5P -IPC::Open3 Supf Like IPC::Open2 but with error handling P5P -IPC::Run bdph Child procs w/ piping, redir and psuedo-ttys RBS -IPC::Session anpO remote shell session mgr; wraps open3() STEVEGT -IPC::Shareable bdpr Tie a variable to shared memory BSUGARS -IPC::SharedCache Rmpr Manage a cache in SysV IPC shared memory SAMTREGAR -IPC::Signal Rdpf Translate signal names to/from numbers ROSCH -IPC::SysV adcr shared memory, semaphores, messages etc JACKS -IPC::XPA adch Interface to SAO XPA messaging system DJERIUS - -RPC:: Remote Procedure Calls (see also DCE::RPC) -RPC::PlServer RdpO Interface for building Perl Servers JWIED -RPC::PlClient RdpO Interface for building pServer Clients JWIED -RPC::ONC adcO ONC RPC interface (works with perlrpcgen) JAKE -RPC::Simple adpO Simple OO async remote procedure calls DDUMONT - -DCE:: Distributed Computing Environment (OSF) -DCE::ACL bdcO Interface to Access Control List protocol PHENSON -DCE::DFS bdcO DCE Distributed File System interface PHENSON -DCE::Login bdcO Interface to login functions PHENSON -DCE::RPC c Remote Procedure Calls PHENSON -DCE::Registry bdcO DCE registry functions PHENSON -DCE::Status bdpr Make sense of DCE status codes PHENSON -DCE::UUID bdcf Misc uuid functions PHENSON - -NetPacket:: -NetPacket::ARP adpO Address Resolution Protocol TIMPOTTER -NetPacket::Ethernet adpO Ethernet framed data TIMPOTTER -NetPacket::IGMP adpO Internet Group Management Protocol TIMPOTTER -NetPacket::IP adpO Internet Protocol TIMPOTTER -NetPacket::TCP adpO Transmission Control Protocol TIMPOTTER -NetPacket::UDP adpO User Datagram Protocol TIMPOTTER - -Proxy i Transport-independent remote processing MICB -Proxy:: -Proxy::Tk ? Tk transport class for Proxy (part of Tk) MICB - -Fwctl bmpO Interface to Linux packet filtering firewall FRAJULAC -LSF cdcO Interface to the Load Sharing Facility API PFRANCEUS -TFTP bdpO Interface to TFTP (rfc1350) GSM -ToolTalk adcr Interface to the ToolTalk messaging service MARCP - -SOAP cmpO SOAP/Perl language mapping KBROWN - -IPChains RdcO Create and Manipulate ipchains JESSICAQ -IPChains:: -IPChains::PortFW bdpO Interface to ipmasqadm portfw command FRAJULAC - -SNMP RdcO Interface to the UCD SNMP toolkit GSM -SNMP:: -SNMP::Monitor adpO Accounting and graphical display JWIED -SNMP::Util RdpO Perform SNMP set,get,walk,next,walk_hash,... WMARQ - -Mon:: -Mon::Client RdpO Network monitoring client TROCKIJ -Mon::SNMP RdpO Network monitoring suite TROCKIJ - -Parallel:: -Parallel::ForkManager RdpO A simple parallel processing fork manager DLUX -Parallel::Pvm bdcf Interface to the PVM messaging service DLECONTE - -CORBA:: -::IOP::IOR adpO Decode, munge, and re-encode CORBA IORs PHILIPA -::IOP::IDLtree adpf IDL to symbol tree translator OMKELLOGG - -Modem:: -Modem::VBox RdpO Perl module for creation of voiceboxes MLEHMANN -Modem::Vgetty bdpO Interface to voice modems using vgetty YENYA - -ControlX10:: -ControlX10::CM10 RmpO Control unit for X10 modules BBIRTH -ControlX10::CM17 RmpO inexpensive RF transmit-only X10 BBIRTH - -RAS:: -RAS::PortMaster RdpO Interface to Livingston PortMaster STIGMATA -RAS::AS5200 RdpO Interface to Cisco AS5200 dialup server STIGMATA -RAS::HiPerARC RdpO Interface to 3Com TotalControl HiPerARC STIGMATA - -6) Data Types and Data Type Utilities (see also Database Interfaces) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Math:: -Math::Amoeba Rdpr Multidimensional Function Minimisation JARW -Math::Approx adpO Approximate x,y-values by a function ULPFR -Math::BaseCalc RdpO Convert numbers between various bases KWILLIAMS -Math::BigFloat SupO Arbitrary size floating point math package MARKB -Math::BigInt SupO Arbitrary size integer math package MARKB -Math::BigInteger adc Arbitrary size integer as XS extension GARY -Math::BigRat ? Arbitrary size rational numbers (fractions) MARKB -Math::Brent Rdpr One-dimensional Function Minimisation JARW -Math::CDF bdch Cumulative Distribution Functions CALLAHAN -Math::Cephes adcf Interface to St. Moshier's Cephes library RKOBES -Math::Complex SdpO Complex number data type RAM -Math::Derivative Rdpr 1st and 2nd order differentiation of data JARW -Math::Expr adpO Parses agebraic expressions HAKANARDO -Math::Fortran Rdpf Implements Fortran log10 & sign functions JARW -Math::Fourier i Fast Fourier Transforms AQUMSIEH -Math::Fraction bdpO Fraction Manipulation KEVINA -Math::Geometry adpf 2D and 3D algorithms GMCCAR -Math::Integral i Integration of data AQUMSIEH -Math::Interpolate Rdpr Polynomial interpolation of data MATKIN -Math::LinearProg idp Linear programming utilities JONO -Math::Logic RdpO Provides pure 2, 3 or multi-value logic SUMMER -Math::Matrix adpO Matrix data type (transpose, multiply etc) ULPFR -Math::MatrixBool RdcO Matrix of booleans (Boolean Algebra) STBEY -Math::MatrixCplx idpO Matrix data type for Complex Numbers STBEY -Math::MatrixReal RdpO Everything you ever wanted to do with Matr. STBEY -Math::Pari adcf Interface to the powerful PARI library ILYAZ -Math::Polynomial RdpO Polynomials as objects MATKIN -Math::Prime i Prime number testing GARY -Math::RandomPrime i Generates random primes of x bits GARY -Math::Round RdpO Perl extension for rounding numbers GROMMEL -Math::SigFigs Rdpf Math using scientific significant figures SBECK -Math::Spline RdpO Cubic Spline Interpolation of data JARW -Math::Trig bdpf tan asin acos sinh cosh tanh sech cosech JARW -Math::TrulyRandom i based on interrupt timing discrepancies GARY -Math::VecStat Rdpr Some basic numeric stats on vectors ASPINELLI -Math::ematica adcO Interface to the powerful Mathematica system ULPFR -Math::Libm RdcO Perl extension for the C math library, libm DSLEWART - -Math::Business:: -Math::Business::EMA adcO An Exponential Moving Average Calculator JETTERO - -Statistics:: -Statistics::ChiSquare Rdpf Chi Square test - how random is your data? JONO -Statistics::ConwayLife RdpO Simulates life using Conway's algorithm DANB -Statistics::Descriptive RdpO Descriptive statistical methods COLINK -Statistics::LTU RdpO Implements Linear Threshold Units TOMFA -Statistics::MaxEntropy Rdpf Maximum Entropy Modeling TERDOEST -Statistics::OLS bdpO ordinary least squares (curve fitting) SMORTON -Statistics::ROC bdpf ROC curves with nonparametric conf. bounds HAKESTLER -Statistics::Distributions RdpO Perl module for calculating critical values MIKEK - -Algorithm:: -Algorithm::Diff Rdpf Diff (also Longest Common Subsequence) NEDKONZ -Algorithm::Permute bdcO Handy and fast permutation with OO interface EDPRATOMO - -Algorithm::Graphs:: -Algorithm::Graphs::TransitiveClosure RdpO Calculates the transitive closure ABIGAIL - -Algorithm::Numerical:: -Algorithm::Numerical::Shuffle Rdph Knuth's shuffle algorithm ABIGAIL -Algorithm::Numerical::Sample RDph Knuth's sample algorithm ABIGAIL - -PDL amcf Perl Data Language - numeric analysis env PERLDL - -PDL:: -PDL::Audio adch Sound synthesis and editing with PDL MLEHMANN -PDL::Meschach amcf Links PDL to meschach matrix library EGROSS -PDL::NetCDF bdhO Reads/Writes NetCDF files from/to PDL objs DHUNT -PDL::Options Rdph Provides hash options handling for PDL TJENNESS -PDL::PP amcf Automatically generate C code for PDL PERLDL -PDL::Slatec amof Interface to slatec (linpack+eispack) lib. PERLDL - -Quantum:: -Quantum::Superpositions RdpO QM-like superpositions in Perl DCONWAY - -Array:: -Array::Compare RdpO Class to compare two arrays DAVECROSS -Array::Heap cdpf Manipulate array elements as a heap JMM -Array::IntSpan RdpO Handling arrays using IntSpan techniques TEVERETT -Array::PrintCols adpf Print elements in vertically sorted columns AKSTE -Array::Substr idp Implement array using substr() LWALL -Array::Vec idp Implement array using vec() LWALL -Array::Virtual idp Implement array using a file LWALL -Array::Reform RdpO Convert an array into N-sized array of array TBONE - -Hash:: -Hash::NoVivify Rdcf Provide non-autovivifying hash functions BPOWERS - -Heap bdpO Define Heap interface JMM -Heap:: -Heap::Binary bdpO Implement Binary Heap JMM -Heap::Binomial bdpO Implement Binomial Heap JMM -Heap::Fibonacci bdpO Implement Fibonacci Heap JMM -Heap::Elem bdpO Heap Element interface, ISA JMM -Heap::Elem:: -Heap::Elem::Num bdpO Numeric heap element container JMM -Heap::Elem::NumRev bdpO Numeric element reversed order JMM -Heap::Elem::Str bdpO String heap element container JMM -Heap::Elem::StrRev bdpO String element reversed order JMM -Heap::Elem::Ref bdpO Obj ref heap element container JMM -Heap::Elem::RefRev bdpO Obj ref element reversed order JMM - -Scalar:: -Scalar::Util bdcf Scalar utilities (dualvar reftype etc) GBARR - -List:: -List::Util bdcf List utilities (eg min, max, reduce) GBARR - -Bit:: -Bit::Vector RdcO Virtual (arbitrary machineword size) CPU STBEY - -Set:: -Set::Bag RdpO Bag (multiset) class JHI -Set::IntRange RdcO Set of integers (arbitrary intervals, fast) STBEY -Set::IntSpan adpO Set of integers newsrc style '1,5-9,11' etc SWMCD -Set::NestedGroups RdpO Grouped data eg ACL's, city/state/country ABARCLAY -Set::Object bdcO Set of Objects (smalltalkish: IdentitySet) JLLEROY -Set::Scalar adpO Set of scalars (inc references) JHI -Set::Window bdpO Manages an interval on the integer line SWMCD - -Graph:: -Graph::Element RdpO Base class for element of directed graph NEILB -Graph::Node RdpO A node in a directed graph NEILB -Graph::Edge RdpO An edge in a directed graph NEILB -Graph::Kruskal Rdpf Kruskal Algorithm for Minimal Spanning Trees STBEY - -Decision:: -Decision::Markov bdpO Build/evaluate Markov models for decisions ALANSZ - -Date:: -Date::Calc Rdcf Gregorian calendar date calculations STBEY -Date::Convert cdpO Conversion between Gregorian, Hebrew, more? MORTY -Date::CTime adpf Updated ctime.pl with mods for timezones GBARR -Date::Format Rdpf Date formatter ala strftime GBARR -Date::Interval idpO Lightweight normalised interval data type KTORP -Date::Language adpO Multi-language date support GBARR -Date::Manip Rdpf Complete date/time manipulation package SBECK -Date::Parse Rdpf ASCII Date parser using regexp's GBARR -Date::Time idpO Lightweight normalised datetime data type TOBIX - -Time:: -Time::Avail Rdpf Calculate min. remaining in time interval PSANTORO -Time::CTime Rdpf Format Times ala ctime(3) with many formats MUIR -Time::DaysInMonth Rdpf Returns the number of days in a month MUIR -Time::HiRes Rdcf High resolution time, sleep, and alarm DEWEG -Time::JulianDay Rdpf Converts y/m/d into seconds MUIR -Time::Local Supf Implements timelocal() and timegm() P5P -Time::Object adpO Object Oriented time objects MSERGEANT -Time::ParseDate Rdpf Parses many forms of dates and times MUIR -Time::Period Rdpf Code to deal with time periods PRYAN -Time::Timezone Rdpf Figures out timezone offsets MUIR -Time::Zone Rdpf Timezone info and translation routines GBARR -Time::gmtime Supf A by-name interface for gmtime TOMC -Time::localtime Supf A by-name interface for localtime TOMC -Time::Seconds RdcO API to convert seconds to other date values MSERGEANT - -Calendar:: -Calendar::CSA adcO interface with calenders such as Sun and CDE KJALB -Calendar::Hebrew cdpO Hebrew calendar conversion/manipulation YSTH -Calendar::RCM i Russell Calendar Manager HTCHAPMAN - -Tie:: -Tie::Hash Supr Base class for implementing tied hashes P5P -Tie::Scalar Supr Base class for implementing tied scalars P5P -Tie::Array Supr Base class for implementing tied arrays P5P -Tie::CPHash bdpO Case preserving but case insensitive hash CJM -Tie::Cache Mdpr In memory size limited LRU cache CHAMAS -Tie::DB_FileLock Rdpr Locking access to Berkeley DB 1.x. JMV -Tie::DB_Lock Rdpr Tie DB_File with automatic locking KWILLIAMS -Tie::DBI RdpO Tie hash to a DBI handle LDS -Tie::Dir adpr Tie hash for reading directories GBARR -Tie::Discovery Rdpr Discover data by caching sub results SIMON -Tie::File adpr Tie hash to files in a directory AMW -Tie::FileLRUCache bdph File based persistent LRU cache SNOWHARE -Tie::Handle RdpO Base class for implementing tied filehandles STBEY -Tie::HashDefaults adpr Let a hash have default values JDPORTER -Tie::IxHash RdpO Indexed hash (ordered array/hash composite) GSAR -Tie::LLHash Rdpr Fast ordered hashes via linked lists KWILLIAMS -Tie::ListKeyedHash Rdpr Use lists to key multi-level hashes SNOWHARE -Tie::Mem adcO Bind perl variables to memory addresses PMQS -Tie::MmapArray bdcr Ties a file to an array ANDREWF -Tie::Multidim adpr "tie"-like multidimensional data structures JDPORTER -Tie::OffsetArray adpr Tie one array to another, with index offset JDPORTER -Tie::Persistent Rdpr Persistent data structures via tie RGIERSIG -Tie::Quick i Simple way to create ties TIMB -Tie::RDBM RdpO Tie hashes to relational databases LDS -Tie::RndHash bdpO choose a random key of a hash in O(1) time DFAN -Tie::SecureHash RdpO Enforced encapsulation of Perl objects DCONWAY -Tie::SentientHash bdpr Tracks changes to nested data structures ANDREWF -Tie::ShadowHash adpO Merge multiple data sources into a hash RRA -Tie::ShiftSplice i Defines shift et al in terms of splice LWALL -Tie::SortHash Rdpr Provides persistent sorting for hashes CTWETEN -Tie::SubstrHash SdpO Very compact hash stored in a string LWALL -Tie::TextDir Rdpr ties a hash to a directory of textfiles KWILLIAMS -Tie::Watch bdpO Watch variables, run code when read/written LUSOL -Tie::Cycle RdpO Cycle through a list of values via a scalar. BDFOY - -Tie::Scalar:: -Tie::Scalar::Timeout adpr Scalar variables that time out MARCEL - -Tie::Cache:: -Tie::Cache::LRU adpr A Least-Recently Used cache MSCHWERN - -Class:: -Class::Accessor bdpO Automated accessor generation MSCHWERN -Class::DBI adpO Simple SQL-based object persistance MSCHWERN -Class::Eroot RdpO Eternal Root - Object persistence DMR -Class::Fields bdph Inspect the fields of a class MSCHWERN -Class::MethodMaker bdpO Create generic methods FLUFFY -Class::Multimethods Rdpf A multiple dispatch mechanism for Perl DCONWAY -Class::Mutator bdpO Dynamic polymorphism implemented in Perl GMCCAR -Class::NamedParms MdpO A named parameter accessor base class SNOWHARE -Class::ParmList MdpO A named parameter list processor SNOWHARE -Class::Singleton bdpO Implementation of a "Singleton" class ABW -Class::Template Rdpr Struct/member template builder DMR -Class::Translucent RdpO Translucent (ala perltootc) method creation GED -Class::Tree MdpO C++ class hierarchies & disk directories RSAVAGE -Class::TOM RmpO Transportable Object Model for perl JDUNCAN -Class::Contract RdpO Design-by-Contract OO in Perl. DCONWAY -Class::WhiteHole RdpO Treat unhandled method calls as errors MSCHWERN -Class::BlackHole RdpO treat unhandled method calls as no-op SBURKE -Class::Classless MdpO Framework for classless OOP SBURKE -Class::ISA Mdpf Report the search path thru an ISA tree SBURKE - -Object:: -Object::Info Rupf General info about objects (is-a, ...) JACKS -Object::Transaction bdpO Transactions on serialized HASH files MUIR - -POE:: Perl Object Environment -POE::Kernel RdpO An event queue that dispatches events RCAPUTO -POE::Session RdpO state machine running on POE::Kernel events RCAPUTO - -POE::Component:: -POE::Component::RSS bdp? Event based RSS interface MSTEVENS -POE::Component::SubWrapper bdp? Event based Module interface MSTEVENS - -MOP bdp Meta Object Protocol (Tool collection) ORTALO -Ref RdpO Print, compare, and copy perl structures MUIR -SOOP RdpO Safe Object Oriented Programming GARROW - -Sort:: -Sort::ByCompatMatrix idpO Sort objects by attribute compatibility ICKHABOD -Sort::Fields bdpf sort text lines by alpha or numeric fields JNH -Sort::PolySort bdpO general rules-based sorting of lists DMACKS -Sort::Versions Rdpf sorting of revision (and similar) numbers KJALB - -Data Type Marshaling (converting to/from strings) and Persistent Storage - -Clone idch Recursive copy of nested objects RDF -FreezeThaw bdpf Convert arbitrary objects to/from strings ILYAZ -Persistence:: -Persistence::Object adpO Store Object definitions with Data::Dumper VIPUL -Storable Rdcr Persistent data structure mechanism RAM -Marshal:: -Marshal::Dispatch cdpO Convert arbitrary objects to/from strings MUIR -Marshal::Packed cdpO Run-length coded version of Marshal module MUIR -Marshal::Eval cdpO Undo serialization with eval MUIR -Tangram RmpO Object persistence in relational databases JLLEROY - -Persistent:: -Persistent::Base bdpO Persistent base classes (& DBM/File classes) DWINTERS -Persistent::DBI bdpO Persistent abstract class for DBI databases DWINTERS -Persistent::MySQL bdpO Persistent class for MySQL databases DWINTERS -Persistent::Oracle bdpO Persistent class for Oracle databases DWINTERS -Persistent::Sybase bdpO Persistent class for Sybase databases DWINTERS -Persistent::mSQL bdpO Persistent class for mSQL databases DWINTERS -Persistent::LDAP bdpO Persistent class for LDAP directories DWINTERS - -Data:: -Data::Check cdpO Checks values for various data formats KENHOLM -Data::DRef adph Nested data access using delimited strings EVO -Data::Dumper RdpO Convert data structure into perl code GSAR -Data::Flow RdpO Acquire data based on recipes ILYAZ -Data::Locations RdpO Insert data into other data w/o temp files STBEY -Data::Reporter RdcO Ascii Report Generator RVAZ -Data::Walker RdpO Navigate through Perl data structures JNOLAN -Data::Random adpf Generate random sets of data ADEO -Data::JavaScript RdpO Dumps structures into JavaScript code SCHOP - -Tree:: -Tree::Base cdpO Defines a basic binary search tree MSCHWERN -Tree::Fat Rdcf Embeddable F-Tree algorithm suite JPRIT -Tree::Smart cdpO Splay tree, fastest for commonly accessed ke MSCHWERN -Tree::Ternary bdpO Perl implementation of ternary search trees MROGASKI -Tree::Ternary_XS adcO XS implementation of ternary search trees LBROCARD -Tree::Trie bdpO An implementation of the Trie data structure AVIF -Tree::Nary RdpO Perl implementation of N-ary search trees FSORIANO -Tree::DAG_Node MdpO base class for trees SBURKE - -DFA:: -DFA::Command MdpO Discrete Finite Automata command processor RSAVAGE -DFA::Kleene R Kleene's Algorithm for DFA STBEY -DFA::Simple cdpO An "augmented transition network" RANDYM - -Boulder MdpO Generalized tag/value data objects LDS -Thesaurus RdpO Create associations between related things DROLSKY - -7) Database Interfaces (see also Data Types) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -DBI amcO Generic Database Interface (see DBD modules) DBIML - -DBIx -- Extensions to the DBI - -DBIx:: -DBIx::Abstract RmpO Wrapper for DBI that generates SQL TURNERA -DBIx::AnyDBD bdpO Module to make cross db applications easier MSERGEANT -DBIx::CGITables adpO Easy DB access from a CGI TOBIX -DBIx::Copy adpO Copying databases TOBIX -DBIx::FullTextSearch bdpO Index documents with MySQL as storage TJMATHER -DBIx::glueHTML bdpO CGI interface to DBI databases JFURNESS -DBIx::HTMLView cdpO Creating web userinterfaces to DBI dbs HAKANARDO -DBIx::OracleSequence adpO OO access to Oracle sequences via DBD-Oracle BLABES -DBIx::Password MdpO Abstration layer for database passwords KROW -DBIx::Recordset bmpO DB-Abtractionlayer / Access via Arrays/Hashs GRICHTER -DBIx::Table bdpO OO access to DBI database tables DLOWE -DBIx::TableAdapter adpO An object-relational mapper for DBI tables GED -DBIx::Tree adpO Expand self-referential table into a tree BJEPS -DBIx::XML_RDB ???? Creates XML from DBI datasources MSERGEANT -DBIx::DBSchema bmpO Database-independent schema objects IVAN - -DBD:: -DBD::ASAny adcO Adaptive Server Anywhere Driver for DBI SMIRNIOS -DBD::Altera bdpO Altera SQL Server for DBI - pure Perl code DSOUFLIS -DBD::CSV adcO SQL engine and DBI driver for CSV files JWIED -DBD::DB2 adcO DB2 Driver for DBI MHM -DBD::Empress adcO Empress RDBMS Driver SWILLIAM -DBD::FreeTDS adcO DBI driver for MS SQLServer and Sybase SPANNRING -DBD::SearchServer cdcO PCDOCS/Fulcrum SearchServer Driver for DB SHARI -DBD::Illustra bmcO Illustra Driver for DBI PMH -DBD::Informix amcO Informix Driver for DBI JOHNL -DBD::Informix4 adcO DBI driver for Informix SE 4.10 GTHYNI -DBD::Ingres bmcO Ingres Driver for DBI HTOUG -DBD::Multiplex a Spreading database load acrross servers TIMB -DBD::ODBC amcO ODBC Driver for DBI DBIML -DBD::Oracle MmcO Oracle Driver for DBI TIMB -DBD::QBase amcO QBase Driver for DBI BENLI -DBD::RAM bmpO a DBI driver for files and data structures JZUCKER -DBD::SQLrelay bdpO SQLrelay driver for DBI DMOW -DBD::Solid amcO Solid Driver for DBI TWENRICH -DBD::Sqlflex RdcO SQLFLEX driver for DBI INFOFLEX -DBD::Sybase bmcO Sybase Driver for DBI MEWP -DBD::Unify bdcO Unify driver for DBI HMBRAND -DBD::XBase bmpO XBase driver for DBI JANPAZ -DBD::mSQL RmcO Msql Driver for DBI JWIED -DBD::mysql RmcO Mysql Driver for DBI JWIED -DBD::pNET amcO DBD proxy driver JWIED -DBD::InterBase amcO DBI driver for InterBase RDBMS server EDPRATOMO - -Oraperl Rmpf Oraperl emulation interface for DBD::Oracle DBIML -Ingperl bmpf Ingperl emulation interface for DBD::Ingres HTOUG - -DDL:: -DDL::Oracle bdpO Reverse engineers object DDL; also defrags RVSUTHERL - -MSSQL:: -MSSQL::DBlib Md+O Access MS SQL Server through DB-Library. SOMMAR -MSSQL::Sqllib MdpO High-level interface using MSSQL::DBlib. SOMMAR - -Sybase:: -Sybase::Async cdpO interact with a Sybase asynchronously WORENKD -Sybase::BCP RdcO Sybase BCP interface MEWP -Sybase::DBlib RdcO Sybase DBlibrary interface MEWP -Sybase::Simple bdpO Simplified db access using Sybase::CTlib MEWP -Sybase::Sybperl Rdpf sybperl 1.0xx compatibility module MEWP -Sybase::CTlib RdcO Sybase CTlibrary interface MEWP - -Ace i Interface to ACEDB (Popular Genome DB) LDS -BBDB Rdph Insiduous big brother database LAXEN -DTREE cdcf Interface to Faircom DTREE multikey ISAM db JWAT -Datascope Rdcf Interface to Datascope RDBMS DANMQ -Fame adcO Interface to FAME database and language TRIAS -LotusNotes i Interface to Lotus Notes C/C++ API MBRECH -Msql RmcO Mini-SQL database interface JWIED -Mysql RmcO mysql database interface JWIED -NetCDF bmcr Interface to netCDF API for scientific data SEMM -ObjStore Rm+O ObjectStore OODBMS Interface JPRIT -Pg Rdcf PostgreSQL SQL database interface MERGL -PgSQL adpO "Pure perl" interface to PostgreSQL GTHYNI -Pogo ad+O Interface for GOODS object database SEYN -Postgres RncO PostgreSQL interface with Perl5 coding style VKHERA -Sprite RdpO Limited SQL interface to flat file databases SHGUN -Stanza i Text format database used by OSF and IBM JHI -VDBM cdph Client/server-layers on top of DBM files RAM -WAIT adhO A rewrite of the freeWAIS-sf engine in Perl ULPFR -Wais Rdcf Interface to the freeWAIS-sf libraries ULPFR -XBase RdpO Read/write interface to XBase files JANPAZ -Xbase bdpf Read Xbase files with simple IDX indexes PRATP - -Tied Hash File Interfaces: - -AnyDBM_File Sup Uses first available *_File module above P5P -BerkeleyDB RdcO Interface to Berkeley DB 2 & 3 PMQS -CDB_File adc Tie to CDB (Bernstein's constant DB) files TIMPX -DBZ_File adc Tie to dbz files (mainly for news history) IANPX -DWH_File adpO DBM storage of complex data and objects SUMUS -DB_File Suc Tie to DB files PMQS -GDBM_File Suc Tie to GDBM files P5P -NDBM_File Suc Tie to NDBM files P5P -ODBM_File Suc Tie to ODBM files P5P -SDBM_File Suc Tie to SDBM files P5P - -MLDBM RdpO Transparently store multi-level data in DBM GSAR -MLDBM:: -MLDBM::Sync cdpr MLDBM wrapper to serialize concurrent access CHAMAS - -DB_File:: -DB_File::Lock RdpO DB_File wrapper with flock-based locking DHARRIS - -DBM:: -DBM::DBass adpf DBM with hashes, locking and XML records SPIDERBOY - -AsciiDB:: -AsciiDB::Parse i Generic text database parsing MICB -AsciiDB::TagFile adpO Tie class for a simple ASCII database JOSERODR - -Db:: -Db::Ctree Rdcr Faircom's CTREE+ database interface REDEN -Db::Documentum Rdcf Documentum EDMS Perl client interface MSROTH -Db::dmObject cdpO Object-based interface to Documentum EDMS JGARRISON -Db::DFC adpO OO Interface to Documentum's DFC MSROTH - -DbFramework:: -DbFramework::Attribute adpO Relational attribute class PSHARPE -DbFramework::DataModel adpO Relational data model/schema class PSHARPE -DbFramework::DataType adpO Attribute data type class PSHARPE -DbFramework::ForeignKey adpO Relational foreign key class PSHARPE -DbFramework::Key adpO Relational key class PSHARPE -DbFramework::Persistent adpO Persistent object class PSHARPE -DbFramework::PrimaryKey adpO Relational primary key class PSHARPE -DbFramework::Table adpO Relational table/entity class PSHARPE -DbFramework::Util adhO Utility functions/methods PSHARPE - -BTRIEVE:: -BTRIEVE::SAVE bdpO Read-write access to BTRIEVE SAVE files DLANE - -MARC bmpO MAchine Readable Catalog (library bib. data) PERL4LIB -MARC:: -MARC::XML ampO MAchine Readable Catalog / XML Extension PERL4LIB - -Metadata:: -Metadata::Base bdpO Base metadata functionality DJBECKETT -Metadata::IAFA bdpO IAFA templates metadata DJBECKETT -Metadata::SOIF bdpO Harvest SOIF metadata DJBECKETT - -OLE:: -OLE::PropertySet aupO Property Set interface MSCHWARTZ -OLE::Storage aupO Structured Storage / OLE document interface MSCHWARTZ -OLE::Storage_Lite adpO Simple Class for OLE document interface KWITKNR - -Spectrum:: -Spectrum::CLI RdpO API for Spectrum Enterprise Mgr. CLI PLONKA - -Spreadsheet:: -Spreadsheet::Excel i Interface to Excel spreadsheets RRAWLINGS -Spreadsheet::Lotus i Interface to Lotus 1-2-3 spreadsheets RRAWLINGS -Spreadsheet::WriteExcel bupO Write numbers & text in Excel binary format JMCNAMARA -Spreadsheet::ParseExcel RdpO Get information from Excel file KWITKNR - -X500:: -X500::DN MdpO X500 Distinguished Name parser RSAVAGE - -8) User Interfaces (Character and Graphical) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Term:: -Term::ANSIColor Sdpf Color output using ANSI escape sequences RRA -Term::Cap Supf Basic termcap: Tgetent, Tputs, Tgoto TSANDERS -Term::Complete Supf Tab word completion using stty raw WTOMPSON -Term::Control idpf Basic curses-type screen controls (gotxy) KJALB -Term::Gnuplot adcf Draw vector graphics on terminals etc ILYAZ -Term::Info adpf Terminfo interface (currently just Tput) KJALB -Term::ProgressBar idpf Progress bar in just ASCII EDAVIS -Term::Prompt adpf Prompt a user ALLENS -Term::Query Rdpf Intelligent user prompt/response driver AKSTE -Term::ReadKey Rdcf Read keystrokes and change terminal modes KJALB -Term::ReadLine Sdcf Common interface for various implementations ILYAZ -Term::Scraper cdpO Drive and scrape terminal applications INGY -Term::Screen RdpO Basic screen + input class (uses Term::Cap) MRKAE -Term::Size adcf Simple way to get terminal size TIMPX -Term::TUI bdpf User interface based on Term::ReadLine SBECK - -Term::ReadLine:: -Term::ReadLine::Perl RdpO GNU Readline history and completion in Perl ILYAZ -Term::ReadLine::Gnu RdcO GNU Readline XS library wrapper HAYASHI - -Major Character User Interface Modules: - -Cdk RdcO Collection of Curses widgets GLOVER -Curses adcO Character screen handling and windowing WPS -Dialog bdch interface library to libdialog UNCLE -PV bdpO Text-mode User Interface Widgets AGUL -PerlMenu Mdpf Curses-based menu and template system SKUNZ - -Curses:: -Curses::Forms adpO Form management for Curses::Widgets CORLISS -Curses::Widgets Rdpf Assorted widgets for rapid interfaces CORLISS - -Emacs adpf Support for Perl embedded in GNU Emacs JTOBEY -Emacs:: -Emacs::Lisp bdch Perl-to-Emacs-Lisp glue JTOBEY - -Tk X Windows User Interface Modules - -Tk bmcO Object oriented version of Tk v4 TKML - -Tk:: -Tk::TextANSIColor bdpO use ANSI color codes in Text widget TJENNESS -Tk::Autoscroll cdpf Alternative way to scroll SREZIC -Tk::Axis RmpO Canvas with Axes TKML -Tk::CheckBox RdpO A radio button widget that uses a checkmark DKWILSON -Tk::ChildNotification RdpO Alert widget when child is created DKWILSON -Tk::Clock RdpO Canvas based Clock widget HMBRAND -Tk::Cloth RdpO Object interface to Tk::Canvas and items ACH -Tk::Columns RdpO Multi column lists w/ resizable borders DKWILSON -Tk::ComboEntry RdpO Drop down list + entry widget DKWILSON -Tk::ContextHelp cdpO A context-sensitive help system SREZIC -Tk::Dial RmpO An alternative to the Scale widget TKML -Tk::Date cdpO A date/time widget SREZIC -Tk::Enscript cdpf Create postscript from text files using Tk SREZIC -Tk::FcyEntry adpO Entry with bg color depending on -state ACH -Tk::FileDialog RdpO A highly configurable file selection widget BPOWERS -Tk::FileEntry adpO Primitive clone of Tix FileEntry widget ACH -Tk::FireButton RdpO Keeps invoking callback when pressed ACH -Tk::FlatCheckbox cdpO A checkbox suitable for flat reliefs SREZIC -Tk::FontDialog cdpO A font dialog widget for perl/Tk SREZIC -Tk::Getopt adpO Configuration interface to Getopt::Long SREZIC -Tk::HistEntry cdpO An entry widget with history capability SREZIC -Tk::HTML bdpO View HTML in a Tk Text widget NI-S -Tk::IconCanvas RdpO Canvas with movable iconic interface DKWILSON -Tk::JPEG RdcO JPEG loader for Tk::Photo NI-S -Tk::LockDisplay RdpO Screen saver/lock widget with animation LUSOL -Tk::Login cdpO A Login widget (name, passwd, et al) BPOWERS -Tk::Menustrip RdpO Another MenuBar DKWILSON -Tk::More adpO A more (or less) like text widget ACH -Tk::Multi bdpO Manages several Text or Canvas widgets DDUMONT -Tk::NumEntry RdpO Numerical entry widget with up/down buttons ACH -Tk::ObjScanner bdpO A scanner to view an object's attribute DDUMONT -Tk::Olwm RmpO Interface to OpenLook toplevels properties TKML -Tk::Pane RdpO A Frame that can be scrolled TKML -Tk::PNG RdcO PNG loader for Tk::Photo NI-S -Tk::Pod ?mpO POD browser toplevel widget TKML -Tk::ProgressBar RdpO Status/progress bar TKML -Tk::ProgressMeter cdpO Simple thermometer-style widget w/callbacks BPOWERS -Tk::RotCanvas RdpO Canvas with arbitrary rotation support AQUMSIEH -Tk::SplitFrame RdpO A sliding separator for two child widgets DKWILSON -Tk::TabFrame RdpO A tabbed frame geometry manager DKWILSON -Tk::TabbedForm RdpO Ext. TabFrame, allowing managed subwidgets DKWILSON -Tk::TableEdit RdpO Simplified interface to a flat file database DKWILSON -Tk::TableMatrix bdcO Display data in Table/Spreadsheet format CERNEY -Tk::TiedListbox RmpO Gang together Listboxes TKML -Tk::TFrame RdpO A Frame with a title ACH -Tk::TIFF adpO TIFF loader for Tk::Photo SREZIC -Tk::Tree RdpO Create and manipulate Tree widgets CTDEAN -Tk::TreeGraph RdpO Widget to draw a tree in a Canvas DDUMONT -Tk::WaitBox RdpO A Wait dialog, of the "Please Wait" variety BPOWERS -Tk::XMLViewer adpO Tk widget to display XML SREZIC - -Modules in the realm of Tk but with a separate namespace - -Log::Dispatch:: -Log::Dispatch::ToTk RdpO Interface class between Log::Dispatch and Tk DDUMONT -Log::Dispatch::TkText RdpO Text widget to log Log::Dispatch messages DDUMONT - -Puppet:: -Puppet::Body adpO Base class for persistent data DDUMONT -Puppet::Log bdpO Logging facility based on Tk DDUMONT -Puppet::Any adpO Base class for an optionnal GUI DDUMONT - -Puppet::VcsTools:: -Puppet::VcsTools::History bdpO VCS (RCS HMS) history viewer based on Canvas DDUMONT -Puppet::VcsTools::File adpO VCS (RCS HMS) file manager DDUMONT - -Orac RdpO DBA GUI tool for Oracle, Informix and Sybase ANDYDUNC -PPresenter MdpO Create presentations with Tk in Perl or XML MARKOV - -Other Major X Windows User Interface Modules: - -Gtk bdcO binding of the Gtk library used by GIMP KJALB - -Gtk:: -Gtk::Dialog adph Simple interface to create dialogs in Gtk ALISTAIRC - -Fresco cd+O Interface to Fresco (post X11R6 version) BPETH -Glade adph Glade/Gtk+/Gnome UI source code generator DMUSGR -Gnome bdcO Bindings to the Gnome Desktop Toolkit KJALB -Qt ad+O Interface to the Qt toolkit AWIN -Sx Rdcf Simple Athena widget interface FMC - -X11:: -X11::Auth adpO Read and handle X11 '.Xauthority' files SMCCAM -X11::Fvwm RdcO interface to the FVWM window manager API RJRAY -X11::Keysyms adpf X11 key symbols (translation of keysymdef.h) SMCCAM -X11::Lib bdcO X11 library interface KENFOX -X11::Motif bdcO Motif widget set interface KENFOX -X11::Protocol adpO Raw interface to X Window System servers SMCCAM -X11::Toolkit bdcO X11 Toolkit library interface KENFOX -X11::Wcl bdcO Interface to the Widget Creation Library JHPB -X11::XEvent bdcO provides perl OO acess to XEvent structures MARTINB -X11::XFontStruct bdcO provides perl OO access to XFontStruct MARTINB -X11::XRT adcO XRT widget set (commercial) interface KENFOX -X11::Xbae adcO Xbae matrix (spreadsheet like) interface KENFOX -X11::Xforms bdcO provides the binding to the xforms library MARTINB -X11::Xpm adcf X Pixmap library interface KENFOX - -Abstract Graphical User Interfaces modules - -GUI:: -GUI::Guido i bd+O Communicate with objects in a GUI TBRADFUTE - -9) Interfaces to or Emulations of Other Programming Languages - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Clips adpO Interface to the Expert System Clips MSULLIVAN -Java RdoO A Perl front-end for JVM communication METZZO -Rc cdcO Perl interface for the Rc shell JPRIT -SICStus adcO Interface to SICStus Prolog Runtime CBAIL - -C:: -C::DynaLib bdcO Allows direct calls to dynamic libraries JTOBEY -C::Scan RdpO Heuristic parse of C files ILYAZ - -Tcl RdcO Complete access to Tcl MICB -::Tk RdcO Complete access to Tk *via Tcl* MICB - -Language:: -Language::Basic adpO Implementation of BASIC AKARGER -Language::Prolog adpO An implementation of Prolog JACKS -Language::PGForth i Peter Gallasch's Forth implementation PETERGAL - -Fortran:: -Fortran::NameList adpf Interface to FORTRAN NameList data SGEL - -ShellScript:: -ShellScript::Env adpO Simple sh and csh script generator SVENH - -Verilog:: -Verilog::Pli Rdch Access to simulator functions WSNYDER -Verilog::Language Rdpf Language support, number parsing, etc WSNYDER -Verilog::Parser RdpO Language parsing WSNYDER -Verilog::SigParser RdpO Signal and module extraction WSNYDER - -FFI cdcf Low-level Foreign Function Interface PMOORE - -FFI:: -FFI::Library cdcO Access to functions in shared libraries PMOORE - -FFI::Win32:: -FFI::Win32::Typelib idcO FFI taking definitions from a type library PMOORE -FFI::Win32::COM idcO Access to COM using VTBL interface PMOORE - -Python bmcf Interface Python API (for embedded python) GAAS -Python:: -Python::Object bmcO Wrapper for python objects GAAS -Python::Err bmcO Wrapper for python exceptions GAAS - -10) File Names, File Systems and File Locking (see also File Handles) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Cwd Supf Current working directory functions P5P - -File:: -File::Attrib idpO Get/set file attributes (stat) TYEMQ -File::BSDGlob bdcf Secure, csh-compatible filename globbing GBACON -File::Backup bdpf Easy file backup & rotation automation KWILLIAMS -File::Basename Supf Return basename of a filename P5P -File::Cache adpO Share data between processes via filesystem DCLINTON -File::CheckTree Supf Check file/dir tree against a specification P5P -File::Compare Supf Compare file contents quickly P5P -File::Copy adpf Copying files or filehandles ASHER -File::CounterFile RdpO Persistent counter class GAAS -File::Df adpf Free disk space utilities (h2ph required) FTASSIN -File::Find Supf Call func for every item in a directory tree P5P -File::Flock Mdph flock() wrapper. Auto-create locks MUIR -File::Glob adpf Filename globing (ksh style) TYEMQ -File::LckPwdF adcf Lock and unlock the passwd file ALLENS -File::Listing Rdpf Parse directory listings GAAS -File::Lock adcf File locking using flock() and lockf() JHI -File::MultiTail adpO Tail multiple files SGMIANO -File::Path Supf File path and name utilities P5P -File::Remote Rdph Read/write/edit remote files transparently NWIGER -File::Rsync bdpO Copy efficiently over the net and locally LEAKIN -File::Signature cdpf Heuristics for file recognition JHI -File::Slurp Mdpf Read/write/append files quickly MUIR -File::Sort Rdpf Sort a file or merge sort multiple files CNANDOR -File::Spec bdpO Handling files and directories portably KJALB -File::Sync bdcf POSIX/*nix fsync() and sync() CEVANS -File::Tail bdpO A more efficient tail -f MGRABNAR -File::Temp adpf Create temporary files safely TJENNESS -File::chmod Mdpf Allows for symbolic chmod notation PINYAN -File::lockf bdcf Interface to lockf system call PHENSON -File::stat Supf A by-name interface for the stat function TOMC -File::BasicFlock Rdpf Simple flock() wrapper MUIR -File::Searcher bdpO Search filetree do search/replace regexes ASTUBBS - -File::Searcher:: -File::Searcher::Interactive bdpO Interactive search do search/replace regexes ASTUBBS - -Dir:: -Dir::Purge Rdpf Delete files in directory based on timestamp JV - -Filesys:: -Filesys::AFS cdcO AFS Distributed File System interface NOG -Filesys::Df Rdpr Disk free based on Filesys::Statvfs IGUTHRIE -Filesys::DiskFree adpO OS independant parser of the df command ABARCLAY -Filesys::Ext2 Rdpf Interface to e2fs filesystem attributes JPIERCE -Filesys::SamFS adcf Interface to SamFS API LUPE -Filesys::Statvfs Rdcf Interface to the statvfs() system call IGUTHRIE -Filesys::dfent adpf By-name interface TOMC -Filesys::mntent adpf By-name interface TOMC -Filesys::statfs adpf By-name interface TOMC - -LockFile:: Application-level locking facilities -LockFile::Lock adpO Lock handles created by LockFile::* schemes RAM -LockFile::Manager adpO Records locks created by LockFile::* RAM -LockFile::Scheme adpO Abstract superclass for locking modules RAM -LockFile::Simple adpr Simple file locking mechanism RAM - -Stat:: -Stat::lsMode Rdpf Translate mode 0644 to -rw-r--r-- MJD - -11) String Processing, Language Text Processing, Parsing and Searching - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -String:: -String::Approx Rdpf Approximate string matching and substitution JHI -String::BitCount adpf Count number of "1" bits in strings WINKO -String::CRC Rdcf Cyclic redundency check generation MUIR -String::CRC32 R?c? ZMODEM-like CRC32 generation of strings as w SOENKE -String::DiffLine bdcf line # & position of first diff ALLEN -String::Edit adpf Assorted handy string editing functions TOMC -String::Parity adpf Parity (odd/even/mark/space) handling WINKO -String::RexxParse Rdph Perl implementation of REXX 'parse' command BLCKSMTH -String::Scanf Rdpf Implementation of C sscanf function JHI -String::ShellQuote Rdpf Quote string for safe passage through shells ROSCH -String::Strip Rdcf xs Module to remove white-space from strings BPOWERS -String::Random RdpO Perl module to generate random strings based STEVE -String::Similarity RdcO Calculate the similarity of two strings MLEHMANN - -Language text related modules - -Text:: -Text::Abbrev Supf Builds hash of all possible abbreviations P5P -Text::Bastardize cdpO corrupts text in various ways AYRNIEU -Text::Bib RdpO Module moved to Text::Refer ERYQ -Text::BibTeX adcO Parse BibTeX files GWARD -Text::CSV adpO Manipulate comma-separated value strings ALANCITT -Text::CSV_XS adpO Fast 8bit clean version of Text::CSV JWIED -Text::DelimMatch RdpO Match (possibly nested) delimited strings NWALSH -Text::FillIn RdpO Fill-in text templates KWILLIAMS -Text::Format RdpO Advanced paragraph formatting GABOR -Text::Graphics RdpO Graphics rendering toolkit with text output SFARRELL -Text::Iconv RdcO Perl interface to the XPG4 iconv() function MPIOTR -Text::Invert cdpO Create/query inv. index of text entities NNEUL -Text::Macros adpO template macro expander (OO) JDPORTER -Text::Metaphone bdcf A modern soundex. Phonetic encoding of words MSCHWERN -Text::MetaText bdpO Text processing/markup meta-language ABW -Text::Morse cdpf convert text to/from Morse code JONO -Text::ParseWords Supf Parse strings containing shell-style quoting HALPOM -Text::Refer RdpO Parse refer(1)-style bibliography files ERYQ -Text::SimpleTemplate adpO Template for dynamic text generation TAIY -Text::Soundex Sdhf Convert a string to a soundex value MARKM -Text::Tabs Sdpf Expand and contract tabs ala expand(1) MUIR -Text::TeX cdpO TeX typesetting language input parser ILYAZ -Text::Templar RdpO An object-oriented templating system GED -Text::Template MdpO Expand template text with embedded perl MJD -Text::TreeFile bdpO Reads tree of strings into a data structure JNK -Text::Vpp RdpO Versatile text pre-processor DDUMONT -Text::Wrap Sdpf Wraps lines to make simple paragraphs MUIR -Text::iPerl adpf Bring text-docs to life via embedded Perl PFEIFFER -Text::DoubleMetaphone adcf Convert string to phonetic encoding MAURICE -Text::FastTemplate bdpO Perl subs from line-oriented templates BOZZIO - -Text::Wrap:: -Text::Wrap::Hyphenate a Like Text::Wrap with ability to hyphenate MJD - -Other Text:: modules (these should be under String:: but pre-date it) - -Text:: -Text::Balanced Mdpf Extract balanced-delimiter substrings DCONWAY -Text::Banner adpf Resembles UNIX banner command LORY -Text::Merge i??? Methods for text templating and data merging SHARRIS -Text::Parser adpO String parser using patterns and states PATM -Text::Trie adpf Find common heads and tails from strings ILYAZ - -Stemming algorithms - -Text:: -Text::English adpf English language stemming IANPX -Text::German adpf German language stemming ULPFR -Text::Stem bdpf Porter algorithm for stemming English words IANPX - -Natural Languages - -Lingua:: -Lingua::DetectCharset a Heuristics to detect coded character sets JNEYSTADT -Lingua::Ident RdpO Statistical language identification MPIOTR -Lingua::Ispell adpf Interface to the Ispell spellchecker JDPORTER -Lingua::Stem Rdph Word stemmer with localization SNOWHARE - -Specific Natural Languages - -Lingua:: -Lingua::EN i Namespace for English language modules -Lingua::PT bupf Namespace for Portugese language modules EGROSS - -Lingua::EN:: -Lingua::EN::AddressParse bdpO Manipulate geographical addresses KIMRYAN -Lingua::EN::Cardinal i Convert numbers to words HIGHTOWE -Lingua::EN::Fathom RdpO Readability measurements of English text KIMRYAN -Lingua::EN::Hyphenate Rdpf Syllable based hyphenation DCONWAY -Lingua::EN::Infinitive MdpO Find infinitive of a conjugated word RSAVAGE -Lingua::EN::Inflect Mdpf English singular->plural and "a"->"an" DCONWAY -Lingua::EN::MatchNames bdpf Smart matching for human names BRIANL -Lingua::EN::NameCase Rdpf Convert NAMES and names to Correct Case SUMMER -Lingua::EN::NameParse RdpO Manipulate persons name KIMRYAN -Lingua::EN::Nickname bdpf Genealogical nickname matching(Peggy=Midge) BRIANL -Lingua::EN::Ordinal i Convert numbers to words HIGHTOWE -Lingua::EN::Squeeze bdpf Shorten english text for Pagers/GSM phones JARIAALTO -Lingua::EN::Syllable a Estimate syllable count in words GREGFAST - -Lingua::EN::Numbers:: -Lingua::EN::Numbers::Ordinate Rdpf go from cardinal (53) to ordinal (53rd) SBURKE - -Lingua::RU:: -Lingua::RU::Charset anpf Detect/Convert russian character sets. FARBER - -ERG Rdpf An extensible report generator framework PHOENIXL - -PostScript:: -PostScript::Barcode bdpf Various types of barcodes as PostScript COLEMAN -PostScript::Basic bdpO Basic methods for postscript generation STWIGGER -PostScript::Document bdpO Generate multi-page PostScript SHAWNPW -PostScript::Elements bdpO Objects for shapes, lines, images SHAWNPW -PostScript::Font RdpO analyzes PostScript font files JV -PostScript::FontInfo RdpO analyzes Windows font info files JV -PostScript::FontMetrics RdpO analyzes Adobe Font Metric files JV -PostScript::Metrics bdpO Font metrics data used by PS::TextBlock SHAWNPW -PostScript::Resources RdpO loads Unix PostScript Resources file JV -PostScript::TextBlock bdpO Objects used by PS::Document SHAWNPW - -Font:: -Font::AFM RdpO Parse Adobe Font Metric files GAAS -Font::TFM RdpO Read info from TeX font metric files JANPAZ -Font::TTF bdpO TrueType font manipulation module MHOSKEN -Font::Fret RdpO Fret - Font REporting Tool MHOSKEN - -Number:: -Number::Format RdpO Package for formatting numbers for display WRW - -Number::Phone:: -Number::Phone::US Rdpf Validates several US phone number formats KENNEDYH - -Email:: -Email::Find adpf Find RFC 822 email addresses in plain text MSCHWERN - -Parse:: -Parse::ePerl Rdcr Embedded Perl (ePerl) parser RSE -Parse::Lex adpO Generator of lexical analysers PVERD -Parse::RecDescent MdpO Recursive descent parser generator DCONWAY -Parse::Tokens bdpO Base class for parsing tokens from text MCKAY -Parse::Yapp RdpO Generates OO LALR parser modules FDESAR -Parse::YALALR RdpO Yet Another LALR parser SFINK -Parse::Vipar bdpO Visual LALR parser debugger SFINK - -Search:: -Search::Dict Supf Search a dictionary ordered text file P5P -Search::InvertedIndex RdpO Inverted index database support SNOWHARE -Search::Binary Rdpf Generic binary search RANT - -SGML:: -SGML::Element cdpO Build a SGML element structure tree LSTAF -SGML::Parser RdpO SGML instance parser EHOOD -SGML::SPGrove bd+O Load SGML, XML, and HTML files KMACLEOD -SGML::Entity RdpO An entity defined in an SGML or XML document KMACLEOD - -SGMLS RdpO A Post-Processor for SGMLS and NSGMLS INGOMACH - -XML RmhO Large collection of XML related modules XMLML - -XML:: -XML::AutoWriter RdpO DOCTYPE based XML output RBS -XML::CSV i?cO Transform comma separated values to XML ISTERIN -XML::Catalog RdpO Resolve public identifiers and remap system EBOHLMAN -XML::DOM bmpO Implements Level 1 of W3's DOM ENNO -XML::Doctype RdpO A DTD object class RBS -XML::Dumper ampO Converts XML from/to Perl code EISEN -XML::Edifact ???? Scripts for translating EDIFACT into XML KRAEHE -XML::Element RdpO XML elements with the same interface as HTML SBURKE -XML::Encoding ???? Parses encoding map XML files COOPERCL -XML::Generator bdpO Generates XML documents BHOLZMAN -XML::Grove RmpO Flexible lightweight mid-level XML objects KMACLEOD -XML::PPD RdpO PPD file format and XML parsing elements MURRAY -XML::PYX RdpO XML to PYX generator MSERGEANT -XML::Parser bmcO Flexible fast parser with plug-in styles COOPERCL -XML::QL ???? Implements the XML Query Language MSERGEANT -XML::Registry ampO Implements a generic XML registry EISEN -XML::Sablotron RdcO Interface to the Sablotron XSLT processor PAVELH -XML::TreeBuilder RdpO Build a tree of XML::Element objects SBURKE -XML::Writer ???? Module for writing XML documents DMEGG -XML::XPath RdpO A set of modules for parsing and evaluating MSERGEANT -XML::XQL ampO Performs XQL queries on XML object trees ENNO -XML::XSLT RdcO Process XSL Transformational sheets BRONG -XML::miniXQL ???? Simplistic XQL-like search using streams MSERGEANT - -Frontier:: -Frontier::RPC ???? Performs Remote Procedure Calls using XML KMACLEOD - -RDF:: -RDF::Service ampO RDF API with DBI and other backends JONAS - -RTF:: -RTF::Base i Classes for Microsoft Rich Text Format NI-S -RTF::Document a pO Generate Rich Text (RTF) Files RRWO -RTF::Generator idpO Next Generation of RTF::Document RRWO -RTF::Group adpO Base class for manipulating Rich Text Format RRWO -RTF::Parser a Base class for parsing RTF files PVERD - -SQL:: -SQL::Schema bdpO Convert a data dictionary to SQL statements TODD -SQL::Statement adcO Small SQL parser and engine JWIED -SQL::Builder adpO OO interface for creating SQL statements ZENIN - -TeX:: -TeX::DVI RdpO Methods for writing DVI (DeVice Independent) JANPAZ -TeX::Hyphen RdpO Hyphenate words using TeX's patterns JANPAZ - -FrameMaker cdpO Top level FrameMaker interface PEASE -FrameMaker:: -FrameMaker::FDK idcO Interface to Adobe FDK PEASE -FrameMaker::MIF cdpO Parse and Manipulate FrameMaker MIF files PEASE -FrameMaker::Control cdpO Control a FrameMaker session PEASE - -Marpa cd+O Context Free Parser JKEGL - -Chatbot:: -Chatbot::Eliza RdpO Eliza algorithm encapsulated in an object JNOLAN - -Quiz:: -Quiz::Question cdpO Questions and Answers wrapper RFOLEY - -Template RdpO Extensive Toolkit for template processing ABW -dTemplate bmpO Flexible templating system DLUX - -Barcode:: -Barcode::Code128 adpO Generate CODE 128 bar codes WRW - -12) Option, Argument, Parameter and Configuration File Processing - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Getopt:: -Getopt::ArgvFile Rdpf Take options from files JSTENZEL -Getopt::Declare MdpO An easy-to-use WYSIWYG command-line parser DCONWAY -Getopt::EvaP Mdpr Long/short options, multilevel help LUSOL -Getopt::Gnu adcf GNU form of long option handling WSCOT -Getopt::Help bdpf Yet another getopt, has help and defaults IANPX -Getopt::Long Sdpr Advanced handling of command line options JV -Getopt::Mixed Rdpf Supports both long and short options CJM -Getopt::Regex ad Option handling using regular expressions JARW -Getopt::Simple MdpO A simple-to-use interface to Getopt::Long RSAVAGE -Getopt::Std Supf Implements basic getopt and getopts P5P -Getopt::Tabular adpr Table-driven argument parsing with help text GWARD -Getopt::Tiny adpr Table of references interface, auto usage() MUIR - -Getargs:: -Getargs::Long cdpf Parses long function args f(-arg => value) RAM - -Argv bdph Provide an OO interface to an ARGV DSB -ConfigReader cdpO Read directives from configuration file AMW -Resources bdpf Application defaults management in Perl FRANCOC - -App:: General application development tools -App::Config bdpO Configuration file mgmt ABW -App::Manager adch Installing/Managing/Uninstalling Software MLEHMANN - -Config:: -Config::FreeForm bdpf Provide in-memory configuration data BTROTT -Config::IniFiles Read/Write INI-Style configuration files RBOW - -CfgTie adph Framework for tieing system admin tasks RANDYM - -13) Internationalization and Locale - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -I18N:: -I18N::Charset Rdpf Character set names and aliases MTHURN -I18N::Collate Sdpr Locale based comparisons JHI -I18N::LangTags Mdpf compare & extract language tags (RFC1766) SBURKE -I18N::WideMulti i Wide and multibyte character string JHI - -Locale:: -Locale::Country Rdpf ISO 3166 two letter country codes NEILB -Locale::Date adpf Month/weekday names in various languages JHI -Locale::Langinfo cdcf The <langinfo.h> API JHI -Locale::Language Rdpf ISO 639 two letter language codes NEILB -Locale::Msgcat RdcO Access to XPG4 message catalog functions CHRWOLF -Locale::PGetText bdpf What GNU gettext does, written in pure perl MSHOYHER -Locale::SubCountry RdpO ISO 3166-2 two letter subcountry codes KIMRYAN -Locale::gettext Rdcf Multilanguage messages PVANDRY -Locale::Maketext RdpO Framework for software localization SBURKE -Locale::PO RdpO Manipulate .po entries from gettext ALANSZ - -Unicode:: -Unicode::String RdcO String manipulation for Unicode strings GAAS -Unicode::Map8 RdcO Convert between most 8bit encodings GAAS -Unicode::Normal i??? Composition, canonical ordering, blocks MHOSKEN -Unicode::MapUTF8 Rdpf Conversions to and from arbitrary charsets SNOWHARE - -No:: -No::Dato Rdpf Norwegian stuff GAAS -No::KontoNr Rdpf Norwegian stuff GAAS -No::PersonNr Rdpf Norwegian stuff GAAS -No::Sort Rdpf Norwegian stuff GAAS -No::Telenor Rdpf Norwegian stuff GAAS - -Cz:: -Cz::Cstocs RdpO Charset reencoding JANPAZ -Cz::Sort RdpO Czech sorting JANPAZ -Cz::Speak bdpf number, etc. convertor to the Czech language YENYA - -Geography:: -Geography::States Rdp? Map states and provinces to their codes ABIGAIL - -Sort:: -Sort::ArbBiLex Mdpf sort functions for arbitrary sort orders SBURKE - -14) Authentication, Security and Encryption (see also Networking) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -User:: -User::Utmp Rdcf Perl access to UNIX utmp(x)-style databases MPIOTR -User::pwent adpf A by-name interface to password database TOMC -User::grent adpf A by-name interface to groups database TOMC -User::utent cdcO Interface to utmp/utmpx/wtmp/wtmpx database ROSCH - -PGP adpO Simple interface to PGP subprocess via pipes PGPML -PGP:: -PGP::Sign bdpr Create/verify PGP/GnuPG signatures, securely RRA - -GnuPG bdpO Perl interface to the GNU privacy guard. FRAJULAC -GnuPG:: -GnuPG::Interface RdpO OO interface to GNU Privacy Guard FTOBIN - -DES adcf DES encryption (libdes) EAYNG -Des adcf DES encryption (libdes) MICB -GSS adcO Generic Security Services API (RFC 2078) MSHLD -OpenCA RmpO Tools for running a Certification Authority MADWOLF -SMIMEUtil amhf Sign, encrypt, verify, decrypt S/MIME mail SAMPO - -Digest:: -Digest::MD5 Rdch MD5 message digest algorithm GAAS -Digest::MD2 Rdch MD2 message digest algorithm GAAS -Digest::SHA1 cdch NIST SHA message digest algorithm UWEH -Digest::HMAC Rdph HMAC message integrity check GAAS - -Crypt:: -Crypt::Beowulf Rdpf An original, very fast encryption algorithm SIFUKURT -Crypt::Blowfish RdhO XS-based implementation of Blowfish DPARIS -Crypt::Blowfish_PP adpO Blowfish encryption algorithm in Pure Perl MATTBM -Crypt::CBC adpO Cipherblock chaining for Crypt::DES/IDEA LDS -Crypt::CBCeasy bdpf Easy things make really easy with Crypt::CBC MBLAZ -Crypt::DES a DES encryption (libdes) GARY -Crypt::ElGamal bdpO ElGamal digital signatures and keys VIPUL -Crypt::IDEA a International Data Encryption Algorithm GARY -Crypt::Keys adpO Management system for cryptographic keys VIPUL -Crypt::OTP Rdpf Implements One Time Pad encryption SIFUKURT -Crypt::Passwd Mdhf Perl wrapper around the UFC Crypt LUISMUNOZ -Crypt::PasswdMD5 Mdhf Interoperable MD5-based crypt() function LUISMUNOZ -Crypt::PRSG a 160 bit LFSR for pseudo random sequences GARY -Crypt::RC4 Rdpf Implements the RC4 encryption algorithm SIFUKURT -Crypt::Random bdpO Cryptographically Strong Random Numbers VIPUL -Crypt::Rot13 cdpO simple encryption often seen on usenet AYRNIEU -Crypt::RSA bdpO RSA encryption, decryption, key generation VIPUL -Crypt::Solitaire Rdpf A very simple encryption system SIFUKURT -Crypt::Twofish Rdpf Twofish Encryption Algorothm NISHANT -Crypt::UnixCrypt Rdpf Perl-only implementation of crypt(3) MVORL -Crypt::RandPasswd RdpO Random password generator based on FIPS-181 JDPORTER -Crypt::Rijndael bdch AES/Rijndael Encryption Module DIDO -Crypt::TripleDES RdpO Triple DES encyption. VIPUL -Crypt::PGP5 bdpO An Object Oriented Interface to PGP5. AGUL -Crypt::PGP6 cdpO An Object Oriented Interface to PGP6. AGUL -Crypt::PGP cdpO Unified OO Interface to PGP and GnuPG AGUL -Crypt::GPG bdpO An Object Oriented Interface to GnuPG AGUL -Crypt::ECB Mdph ECB mode for Crypt::DES, Blowfish, etc. APPEL -Crypt::CipherSaber bdpO OO module for CS-1 and CS-2 encryption CHROMATIC - -Authen:: -Authen::ACE adcO Interface to Security Dynamics ACE (SecurID) DCARRIGAN -Authen::Krb4 RdcO Interface to Kerberos 4 API JHORWITZ -Authen::Krb5 RdcO Interface to Kerberos 5 API JHORWITZ -Authen::PAM bdch Interface to PAM library NIKIP -Authen::TacacsPlus adcO Authentication on tacacs+ server MSHOYHER -Authen::Ticket adpO Suite consisting of master/client/tools JSMITH - -RADIUS:: -RADIUS::Dictionary bdpO Object interface to RADIUS dictionaries CHRMASTO -RADIUS::Packet bdpO Object interface to RADIUS (rfc2138) packets CHRMASTO -RADIUS::UserFile bdpO Manipulate a RADIUS users file OEVANS - -SSLeay cdcO Interface to SSLeay EAYNG - -15) World Wide Web, HTML, HTTP, CGI, MIME etc (see Text Processing) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -URI:: -URI::Attr ampO Stores attributes in the URI name space LWWWP -URI::Bookmark bdpO A Class for bookmarks ASPIERS -URI::Bookmarks bdpO A Class for bookmark collections ASPIERS -URI::Escape Rmpf General URI escaping/unescaping functions LWWWP -URI::Find adpf Find URIs in plain text MSCHWERN -URI::URL RmpO Uniform Resource Locator objects LWWWP - -CGI:: -CGI::Application RmpO Framework for building reusable web-apps JERLBAUM -CGI::ArgChecker bdpO Consistent, extensible CGI param validation DLOWE -CGI::Authent Mdpf request the HTTP authentification JENDA -CGI::Base RmpO Complete HTTPD CGI Interface class CGIP -CGI::BasePlus RmpO Extra CGI::Base methods (incl file-upload) CGIP -CGI::CList bdpO Manages hierarchical collapsible lists PEARCEC -CGI::Cache adpf Speed up slow CGI scripts by caching BROCSEIB -CGI::Carp cmpf Drop-in Carp replacement for CGI scripts CGIP -CGI::Debug Mdph show CGI debugging data JONAS -CGI::Deurl Mdpr decode the CGI parameters JENDA -CGI::Enurl Mdpr encode the CGI parameters JENDA -CGI::Formalware MdpO Convert an XML file to a suite of CGI forms RSAVAGE -CGI::Imagemap Rdph Imagemap handling for specialized apps MIKEH -CGI::LogCarp Rdph Error, log, bug streams, httpd style format MIKEKING -CGI::MiniSvr RmpO Fork CGI app as a per-session mini server CGIP -CGI::Minimal MdpO A micro-sized CGI handler SNOWHARE -CGI::MxScreen cdpO Screen multi-plexer framework RAM -CGI::Out adpf Buffer CGI output and report errors MUIR -CGI::PathInfo RdpO A lightweight PATH_INFO based CGI package SNOWHARE -CGI::Persistent adpO Transparent State Persistence in CGI scripts VIPUL -CGI::Query adpO Parse CGI quiry strings MPECK -CGI::QuickForm Rdpf Handles UI & validation for CGI forms SUMMER -CGI::Request RmpO Parse CGI request and handle form fields CGIP -CGI::Response ampO Response construction for CGI applications MGH -CGI::Screen adpO Create multi screen CGI-scripts ULPFR -CGI::Session cdpO Persistent storage of complex data in CGI ZED -CGI::SpeedyCGI bdcn Run CGI scripts persistenly HORROCKS -CGI::Validate adpO Advanced CGI form parser ZENIN -CGI::WML RdpO Subclass of CGI.pm for WML output AWOOD -CGI::XML ampO Convert CGI.pm variables to/from XML EISEN -CGI::XMLForm adpO Create/query XML for forms MSERGEANT - -HTML:: -HTML::Base adpO Object-oriented way to build pages of HTML GAND -HTML::CalendarMonth RmpO Calendar Months as easy HTML::Element trees MSISK -HTML::Demoroniser adpO Correct moronic and incompatible HTML JDPORTER -HTML::EP adpO Modular, extensible Perl embedding JWIED -HTML::Element RdpO Representation of a HTML parsing tree SBURKE -HTML::ElementGlob RmpO Manipulate multiple HTML elements as one MSISK -HTML::ElementRaw RmpO Graft HTML strings onto an HTML::Element MSISK -HTML::ElementSuper RmpO Various HTML::Element extensions MSISK -HTML::ElementTable RmpO Tables as easy HTML element structures MSISK -HTML::Embperl Rmcf Embed Perl in HTML GRICHTER -HTML::Entities Rmpf Encode/decode HTML entities LWWWP -HTML::FillInForm adpO Fill in HTML forms, separating HTML and code TJMATHER -HTML::Formatter ampO Convert HTML to plain text or Postscript LWWWP -HTML::HeadParser RmpO Parse <HEAD> section of HTML documents LWWWP -HTML::LinkExtor RmpO Extract links from HTML documents LWWWP -HTML::Mason bdpO Build sites from modular Perl/HTML blocks JSWARTZ -HTML::ParseForm i Parse and handle HTML forms via templates NMONNET -HTML::Parser RmcO Basic HTML Parser LWWWP -HTML::QuickCheck cdpf Fast simple validation of HMTL text YLU -HTML::Simple bdpf Simple functions for generating HTML TOMC -HTML::SimpleParse RdpO Bare-bones HTML parser KWILLIAMS -HTML::StickyForms adpO HTML form generation for mod_perl/CGI PMH -HTML::Stream RdpO HTML output stream ERYQ -HTML::Subtext adpO Text substitutions on an HTML template KAELIN -HTML::Table RupO Write HTML tables via spreadsheet metaphor AJPEACOCK -HTML::TableExtract RmpO Flexible HTML table extraction MSISK -HTML::TableLayout bdpO an extensible OO layout manager PERSICOM -HTML::Template MmpO a simple HTML templating system SAMTREGAR -HTML::TokeParser RmpO Alternative HTML::Parser interface LWWWP -HTML::Validator bdpO HTML validator utilizing nsgmls and libwww SAIT -HTML::Tagset Rdpf data tables useful in parsing HTML SBURKE - -HTML::Widgets:: -HTML::Widgets::DateEntry RdpO Creates date entry widgets for HTML forms. KENNEDYH -HTML::Widgets::Menu RdpO Builds an HTML menu FRANKIE -HTML::Widgets::Search RdpO Perl module for building searches returning FRANKIE - -HTTP:: -HTTP::Browscap cdpO Provides info on web browser capabilities JAMESPO -HTTP::BrowserDetect adph Detect browser, version, OS from UserAgent LHS -HTTP::Cookies RmpO Storage of cookies LWWWP -HTTP::DAV ampO A client module for the WebDAV protocol PCOLLINS -HTTP::Daemon RmpO Base class for simple HTTP servers LWWWP -HTTP::Date Rmpf Date conversion for HTTP date formats LWWWP -HTTP::Headers RmpO Class encapsulating HTTP Message headers LWWWP -HTTP::Message RmpO Base class for Request/Response LWWWP -HTTP::Negotiate Rmpf HTTP content negotiation LWWWP -HTTP::Request RmpO Class encapsulating HTTP Requests LWWWP -HTTP::Response RmpO Class encapsulating HTTP Responses LWWWP -HTTP::Status Rmpf HTTP Status code processing LWWWP -HTTP::GHTTP RdcO Perl interface to the gnome ghttp library MSERGEANT -HTTP::WebTest bdph Run tests on remote URLs or local web files RANDERSON - -HTTP::Request:: -HTTP::Request::Common Rmpf Functions that generate HTTP::Requests LWWWP -HTTP::Request::Form RdpO Generates HTTP::Request objects out of forms GBAUER - -WAP:: -WAP::Wbmp i??? Wireless bitmap manipulation module SAA -WAP::WML i??? Wireless Markup language routines SAA - -WML:: -WML::Card RdpO Builds WML code for different wap browsers MALVARO -WML::Deck RdpO WML Deck generator MALVARO - -HTTPD:: -HTTPD::Access cdpO Management of server access control files LDS -HTTPD::Authen bdpO Preform HTTP Basic and Digest Authentication LDS -HTTPD::Config cdpO Management of server configuration files LDS -HTTPD::GroupAdmin bdpO Management of server group databases LDS -HTTPD::UserAdmin bdpO Management of server user databases LDS - -WWW:: -WWW::BBSWatch adpO email WWW bulletin board postings TAYERS -WWW::Robot adpO Web traversal engine for robots & agents NEILB -WWW::RobotRules ampO Parse /robots.txt file LWWWP -WWW::Search adpO Front-end to Web search engines JOHNH - -WWW::Search:: -WWW::Search::AlltheWeb RdpO Class for searching AlltheWeb JSMYSER -WWW::Search::Deja RdpO Class for www.deja.com searching MTHURN -WWW::Search::Go RdpO Backend class for searching with go.com ALIAN - -LWP RmpO Libwww-perl LWWWP -LWP:: -LWP::Conn ampO LWPng stuff LWWWP -LWP::MediaTypes Rmpf Media types and mailcap processing LWWWP -LWP::Parallel RmpO Allows parallel http and ftp access with LWP MARCLANG -LWP::Protocol RmpO LWP support for URL schemes (http, file etc) LWWWP -LWP::RobotUA RmpO A UserAgent for robot applications LWWWP -LWP::Simple Rmpf Simple procedural interface to libwww-perl LWWWP -LWP::UA ampO LWPng stuff LWWWP -LWP::UserAgent RmpO A WWW UserAgent class LWWWP - -MIME:: -MIME::Base64 Rdhf Encode/decode Base 64 (RFC 2045) GAAS -MIME::QuotedPrint Rdpf Encode/decode Quoted-Printable GAAS -MIME::Decoder RdpO OO interface for decoding MIME messages ERYQ -MIME::Entity RdpO An extracted and decoded MIME entity ERYQ -MIME::Head RdpO A parsed MIME header ERYQ -MIME::IO ?dpO DEPRECATED: now part of IO:: ERYQ -MIME::Latin1 ?dpO DEPRECATED and removed ERYQ -MIME::Lite RdpO Single module for composing simple MIME msgs ERYQ -MIME::Parser RdpO Parses streams to create MIME entities ERYQ -MIME::Types adpr Returns the MIME type for a filename/suffix OKAMOTO -MIME::Words Rdpf Encode/decode RFC1522-escaped header strings ERYQ - -MIME::Lite:: -MIME::Lite::HTML bmpO Provide routine to transform HTML to MIME ALIAN - -Apache RmcO Interface to the Apache server API DOUGM - -Apache PerlHandler modules - -Apache:: -Apache::ASP bdpO Implement Active Server Pages CHAMAS -Apache::AdBanner cdpf Ad banner server CHOLET -Apache::AddrMunge bdpf Munge email addresses in webpages MJD -Apache::Archive bdpf Make linked contents pages of .tar(.gz) JPETERSON -Apache::AutoIndex Rdcf Lists directory content GOZER -Apache::AxKit RdcO XML Application Server for Apache MSERGEANT -Apache::BBS cdpO BBS like System for Apache MKOSSATZ -Apache::Cachet i OutputChain with caching MERLYN -Apache::CallHandler cdpf Map filenames to subroutine calls GKNOPS -Apache::Compress bdpO Compress content on the fly KWILLIAMS -Apache::Dir i OO (subclassable) mod_dir replacement DOUGM -Apache::Dispatch bmpf Call PerlHandlers as CGI scripts GEOFF -Apache::Embperl Rmcf Embed Perl in HTML GRICHTER -Apache::EmbperlChain bdpO Feed handler output to Embperl CHOLET -Apache::FTP i Full-fledged FTP proxy PMKANE -Apache::Filter RdpO OutputChain like functionality KWILLIAMS -Apache::Forward bdpO OutputChain like functionality MPB -Apache::Gateway bdpf A multiplexing gateway CCWF -Apache::GzipChain bmpf Compress files on the fly ANDK -Apache::Layer bdpf Layer content tree over one or more SAM -Apache::Magick bdpf Image conversion on-the-fly MPB -Apache::Mason bdpO Build sites w/ modular Perl/HTML blocks JSWARTZ -Apache::ModuleDoc bdpf Self documentation for Apache C modules DOUGM -Apache::NNTPGateway adpf A Web based NNTP (usenet) interface BOUBAKER -Apache::NavBar bdpO Navigation bar generator MPB -Apache::OWA bdpf Runs Oracle PL/SQL Web Toolkit apps SVINTO -Apache::OutputChain bmpO Chain output of stacked handlers JANPAZ -Apache::PageKit ampO Application framework w/ HTML::Template TJMATHER -Apache::PassFile bdpf Send file via OutputChain ANDK -Apache::PerlRun Smpf Run unaltered CGI scripts APML -Apache::PrettyPerl Rdpf Syntax highlighting for Perl files RA -Apache::PrettyText bdpf Re-format .txt files for client display CHTHORMAN -Apache::RandomLocation bdpf Random image display RKOBES -Apache::Registry Smpf Run unaltered CGI scripts APML -Apache::Reload RdpO Reload changed modules (extending StatINC) MSERGEANT -Apache::RobotRules cdpf Enforce robot rules (robots.txt) PARKER -Apache::SSI RmpO Implement server-side includes in Perl KWILLIAMS -Apache::SSIChain bmpO SSI on other modules output JANPAZ -Apache::Sandwich bmpf Layered document (sandwich) maker VKHERA -Apache::ShowRequest bdpf Show phases and module participation DOUGM -Apache::SimpleReplace ampf Simple replacement template tool GEOFF -Apache::Stage Rdpf Manage a document staging directory ANDK -Apache::TarGzip c Manage .tar.gz file ZENIN -Apache::TimedRedirect bdpf Redirect urls for a given time period PETERM -Apache::UploadSvr bdpO A lightweight publishing system ANDK -Apache::VhostSandwich cdpf Virtual host layered document maker MARKC -Apache::WDB bdpf Database query/edit tool using DBI JROWE -Apache::WebSQL cdpO Adaptation of Sybase's WebSQL GUNTHER -Apache::ePerl Rdpr Fast emulated Embedded Perl (ePerl) RSE -Apache::iNcom bdpf An e-commerce framework FRAJULAC - -Apache PerlInitHandler modules - -Apache:: -Apache::RequestNotes ampf Pass cookie & form data around pnotes GEOFF - -Apache PerlAuthenHandler modules - -Apache:: -Apache::AuthAny bdpf Authenticate with any username/password MPB -Apache::AuthenCache bmpf Cache authentication credentials JBODNAR -Apache::AuthCookie RdpO Authen + Authz via cookies KWILLIAMS -Apache::AuthenDBI bmpO Authenticate via Perl's DBI MERGL -Apache::AuthenGSS cdpf Generic Security Service (RFC 2078) DOUGM -Apache::AuthenIMAP bdpf Authentication via an IMAP server MICB -Apache::AuthenPasswdSrv bdpf External authentication server JEFFH -Apache::AuthenPasswd bdpf Authenticate against /etc/passwd DEP -Apache::AuthLDAP bdpf LDAP authentication module CDONLEY -Apache::AuthPerLDAP bdpf LDAP authentication module (PerLDAP) HENRIK -Apache::AuthenNIS bdpf NIS authentication DEP -Apache::AuthNISPlus bdpF NIS Plus authentication/authorization VALERIE -Apache::AuthenRaduis bdpf Authentication via a Radius server DANIEL -Apache::AuthenSmb bdpf Authenticate against NT server PARKER -Apache::AuthenURL bdpf Authenticate via another URL JGROENVEL -Apache::DBILogin bdpf Authenticate to backend database JGROENVEL -Apache::DCELogin bdpf Obtain a DCE login context DOUGM -Apache::PHLogin bdpf Authenticate via a PH database JGROENVEL -Apache::TicketAccess bdpO Ticket based access/authentication MPB - -Apache PerlAuthzHandler modules - -Apache:: -Apache::AuthzAge bmpf Authorize based on age APML -Apache::AuthzDCE cdpf DFS/DCE ACL based access control DOUGM -Apache::AuthzDBI bmpO Group authorization via Perl's DBI MERGL -Apache::AuthzGender bdpf Authorize based on gender MPB -Apache::AuthzNIS bdpf NIS authorization DEP -Apache::AuthzPasswd bdpf Authorize against /etc/passwd DEP -Apache::AuthzSSL bdpf Authorize based on client cert MPB -Apache::RoleAuthz i Role-based authorization DOUGM - -Apache PerlAccessHandler modules - -Apache:: -Apache::AccessLimitNum bmpf Limit user access by number of requests APML -Apache::BlockAgent bdpf Block access from certain agents MPB -Apache::DayLimit bmpf Limit access based on day of week MPB -Apache::IPThrottle cdpf Limit bandwith consumption by IP MERLYN -Apache::RobotLimit cdpf Limit access of robots PARKER -Apache::SpeedLimit bdpf Control client request rate MPB - -Apache PerlTypeHandler modules - -Apache:: -Apache::MIME bdcf Perl implementation of mod_mime MPB -Apache::MimeDBI bdpf Type mapping from a DBI database MPB -Apache::MimeXML bdpf mime encoding sniffer for XML files MSERGEANT - -Apache PerlTransHandler modules (May also include a PerlHandler) - -Apache:: -Apache::AdBlocker bdpf Block advertisement images MPB -Apache::AddHostPath adpf Prepends parts of hostname to URI RJENKS -Apache::AnonProxy bdpf Anonymizing proxy MPB -Apache::Checksum bdpf Manage document checksum trees MPB -Apache::DynaRPC i Dynamically translate URIs into RPCs DOUGM -Apache::LowerCaseGETs bdpf Lowercase URI's when needed PLISTER -Apache::MsqlProxy bmpf Translate URI's into mSQL queries APML -Apache::ProxyPass bdpf Perl implementation of ProxyPass MJS -Apache::ProxyPassThru bdpO Skeleton for vanilla proxy RMANGI -Apache::ProxyCache i Caching proxy DOUGM -Apache::StripSession bdpf Strip session info from URI MPB -Apache::Throttle bdpf Speed-based content negotiation DONS -Apache::TransLDAP bdpf Translate URIs to LDAP queries CDONLEY - -Apache PerlFixupHandler modules - -Apache:: -Apache::RefererBlock bdpf Block based on MIME type + Referer CHOLET -Apache::Timeit bmpf Benchmark PerlHandlers APML -Apache::Usertrack bdpf Perl version of mod_usertrack ABH - -Apache PerlLogHandler modules - -Apache:: -Apache::DBILogConfig bdpf Custom format logging via DBI JBODNAR -Apache::DBILogger bdpf Logging via DBI ABH -Apache::DumpHeaders bdpf Watch HTTP transaction via headers DOUGM -Apache::LogMail bdpf Log certain requests via email MPB -Apache::Traffic bdpf Logs bytes transferred, per-user basis MAURICE -Apache::WatchDog c Look for problematic URIs DOUGM - -Apache PerlChildInitHandler modules - -Apache:: -Apache::Resource Smpf Limit resources used by httpd children APML - -Apache Server Configuration - -Apache:: -Apache::ConfigLDAP i Config via LDAP and <Perl> MARKK -Apache::ConfigDBI i Config via DBI and <Perl> MARKIM -Apache::ModuleConfig SmcO Interface to configuration API APML -Apache::PerlSections SmpO Utilities for <Perl> sections APML -Apache::httpd_conf bmpO Methods to configure and run an httpd APML -Apache::src SmpO Finding and reading bits of source APML - -Apache Database modules - -Apache:: -Apache::DBI bmpO Persistent DBI connection mgmt. MERGL -Apache::Mysql bdpO Persistent connection mgmt. for Mysql NJENSEN - -Apache::Sybase:: -Apache::Sybase::DBlib bmpO Persistent DBlib connection mgmt. BMILLETT -Apache::Sybase::CTlib bapO Persistent CTlib connection mgmt. MDOWNING - -Interfaces and integration with Apache C structures and modules - -Apache:: -Apache::Backhand bdcr Bridge between mod_backhand + mod_perl DLOWE -Apache::CmdParms SmcO Interface to Apache cmd_parms struct APML -Apache::Command bmcO Interface to Apache command_rec struct APML -Apache::Connection SmcO Inteface to Apache conn_rec struct APML -Apache::Constants Smcf Constants defined in httpd.h APML -Apache::ExtUtils SmpO Utils for Apache:C/Perl glue APML -Apache::File SmcO Methods for working with files APML -Apache::Handler bmcO Interface to Apache handler_rec struct APML -Apache::Log SmcO ap_log_error interface APML -Apache::LogFile bmcO Interface to Apache's piped logs, etc. APML -Apache::Module bmcO Interface to Apache module struct APML -Apache::Scoreboard RdcO Perl interface to Apache's scoreboard.h DOUGM -Apache::Server SmcO Interface to Apache server_rec struct APML -Apache::SubProcess cmcO Interface to Apache subprocess API APML -Apache::Table SmcO Interface to Apache table struct + API APML -Apache::URI SmcO URI component parsing and unparsing APML -Apache::Util Smcf Interface to Apache's util*.c functions APML - -HTTP Method handler - -Apache:: -Apache::PATCH bdpf HTTP PATCH method handler MPB -Apache::PUT cdpf HTTP PUT method handler SORTIZ -Apache::Roaming bdpO PUT/GET/MOVE/DELETE (Netscape Roaming) JWIED - -Watchdog and Monitoring tools - -Apache:: -Apache::SizeLimit Smpf Graceful exit for large children APML -Apache::GTopLimit Rdpn Child exit on small shared or large mem STAS -Apache::Status Smpf Embedded interpreter runtime status APML -Apache::VMonitor Rdpn Visual System and Processes Monitor STAS - -Apache::Watchdog:: -Apache::Watchdog::RunAway Rdpn RunAway processes watchdog/terminator STAS - -Development and Debug tools - -Apache:: -Apache::DB amcO Hook Perl interactive DB into mod_perl DOUGM -Apache::Debug Rmpf mod_perl debugging utilities APML -Apache::DebugInfo ampO Per-request data logging GEOFF -Apache::DProf bmcf Hook Devel::DProf into mod_perl DOUGM -Apache::FakeRequest ampO Implement Apache methods off-line APML -Apache::Leak bmcf Memory leak tracking routines APML -Apache::Peek amcf Devel::Peek for mod_perl APML -Apache::SawAmpersand bmpf Make sure noone is using $&, $' or $` APML -Apache::SmallProf bmpf Hook Devel::SmallProf into mod_perl DOUGM -Apache::StatINC Smpf Reload require'd files when updated APML -Apache::Symbol bmcO Things for symbol things APML -Apache::Symdump bmpf Symbol table snapshots to disk APML -Apache::test Smpf Handy routines for 'make test' scripts APML - -Miscellaneous Apache modules - -Apache:: -Apache::Byterun i Run Perl bytecode modules DOUGM -Apache::Cookie amcO C version of CGI::Cookie APML -Apache::Icon bdcO Access to AddIcon* configuration DOUGM -Apache::Include Smpf mod_include + Apache::Registry handler APML -Apache::Mmap bdcf Share data via Mmap module FLETCH -Apache::ParseLog bdpO OO interface to Apache log files AKIRA -Apache::RegistryLoader SmpO Apache::Registry startup script loader APML -Apache::Request amcO CGI.pm functionality using API methods APML -Apache::Safe ampO Adaptation of "safecgiperl" APML -Apache::Session bmpO Maintain client <-> httpd session/state JBAKER -Apache::Servlet ampO Interface to the Java Servlet engine IKLUFT -Apache::SIG SmpO Signal handlers for mod_perl APML -Apache::State i Powerful state engine RSE -Apache::TempFile bdpf Manage temporary files TOMHUGHES -Apache::Upload amcO File upload class APML - -Netscape:: -Netscape::Cache bdpO Access Netscape cache files SREZIC -Netscape::History bdpO Class for accessing Netscape history DB NEILB -Netscape::HistoryURL bdpO Like a URI::URL, but with visit time NEILB -Netscape::Server adcO Perl interface to Netscape httpd API BSUGARS - -HyperWave:: -HyperWave::CSP cdpO Interface to HyperWave's HCI protocol GOSSAMER - -WebFS:: -WebFS::FileCopy Rdpf Get, put, copy, delete files located by URL BZAJAC - -WebCache:: -WebCache::Digest bdpf Internet Cache Protocol (RFCs 2186 and 2187) MHAMILTON - -ASP Rdpr Perl interface to ASP PerlScript TIMMY -Authorizenet bdpf Get Credit Card Info from authorizenet DLINCOLN -BizTalk RdpO Microsoft BizTalk Framework Toolkit SIMONJ -CGI_Lite MnpO Light-weight interface for fast apps SHGUN -CIPP RdpO Preprocessor for embedding Perl, SQL in HTML JRED -Catalog bmpO Manage/display resources catalog (URLs etc.) LDACHARY -PApp adch Multi-page-state-preserving web applications MLEHMANN -WDDX RdpO Allows distributed data exchange via XML GUELICH -WING RmhO Apache based IMAP/NNTP Gateway MICB -WOMP cdpO CGI App Dev Suite: authen/state/html SPADKINS - -FCGI Rdcr Fast CGI SKIMO -FCGI:: -FCGI::ProcManager bdpO A FastCGI process manager JURACH - -16) Server and Daemon Utilities - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Event bmch fast, generic event loop JPRIT -Event:: -Event::Stats Rmcf Collects statistics for Event JPRIT -Event::tcp bmpO TCP session layer library JPRIT - -EventServer RupO Triggers objects on i/o, timers & interrupts JACKS -::Functions Rupf Utility functions for initializing servers JACKS -::Gettimeofday Rupr gettimeofday syscall wrapper JACKS -::Signal Rupr signalhandler for the eventserver JACKS - -Server::Server:: -Server::Server::EventDriven RupO See 'EventServer' (compatibility maintained) JACKS - -Server::Echo:: -Server::Echo::MailPipe cup A process which accepts piped mail JACKS -Server::Echo::TcpDForking cup TCP daemon which forks clients JACKS -Server::Echo::TcpDMplx cup TCP daemon which multiplexes clients JACKS -Server::Echo::TcpISWFork cup TCP inetd wait process, forks clients JACKS -Server::Echo::TcpISWMplx cup TCP inetd wait process, multiplexes clients JACKS -Server::Echo::TcpISNowait cup TCP inetd nowait process JACKS -Server::Echo::UdpD cup UDP daemon JACKS -Server::Echo::UdpIS cup UDP inetd process JACKS - -Server::Inet:: -Server::Inet::Functions cdpf Utility functions for Inet socket handling JACKS -Server::Inet::Object cupO Basic Inet object JACKS -Server::Inet::TcpClientObj cupO A TCP client (connected) object JACKS -Server::Inet::TcpMasterObj cupO A TCP master (listening) object JACKS -Server::Inet::UdpObj cupO A UDP object JACKS - -Server::FileQueue:: -Server::FileQueue::Functions cupf Functions for handling files and mailboxes JACKS -Server::FileQueue::Object cupO Basic object JACKS -Server::FileQueue::DirQueue cupO Files queued in a directory JACKS -Server::FileQueue::MboxQueue cupO Mail queued in a mail box JACKS - -Server::Mail:: -Server::Mail::Functions cupf Functions for handling files and mailboxes JACKS -Server::Mail::Object cupO Basic mail object JACKS - -MailBot cdpO Archive server, listserv, auto-responder RHNELSON -Mud cdcO A multi-user online interactive game server GED - -NetServer:: -NetServer::Compiler idph State machine compiler for TCP/IP servers CHSTROSS -NetServer::Generic RdpO generic OOP class for internet servers CHSTROSS -NetServer::Portal bmpO Sets up a mini-server accessible via telnet JPRIT - -Time:: -Time::Warp Rmcf Change the start and speed of Event time JPRIT - -Spool:: -Spool::Queue i Generic printer spooling facilities RAM - -17) Archiving, Compression and Conversion - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Compress:: -Compress::Bzip2 Rdcf Interface to the Bzip2 compression library AZEMGI -Compress::LZO Rdcf Interface to the LZO compression library MFX -Compress::LZV1 RdcO Leight-weight Lev-Zimpel-Vogt compression MLEHMANN -Compress::Zlib RdcO Interface to the Info-Zip zlib library PMQS - -Convert:: -Convert::ASN1 adpO Standard en/decode of ASN.1 structures GBARR -Convert::BER adpO Class for encoding/decoding BER messages GBARR -Convert::BinHex anpO Convert to/from RFC1741 HQX7 (Mac BinHex) ERYQ -Convert::EBCDIC adpf ASCII to/from EBCDIC CXL -Convert::Recode Rdpf Mapping functions between character sets GAAS -Convert::SciEng bdpO Convert numbers with scientific notation COLINK -Convert::Translit MdpO String conversion among many character sets GENJISCH -Convert::UU bdpf UUencode and UUdecode ANDK -Convert::UUlib Rdcr Intelligent de- and encode (B64, UUE...) MLEHMANN - -AppleII:: -AppleII::Disk bdpO Read/write Apple II disk image files CJM -AppleII::ProDOS bdpO Manipulate files on ProDOS disk images CJM -AppleII::DOS33 i Manipulate files on DOS 3.3 disk images CJM -AppleII::Pascal i Manipulate files on Apple Pascal disk images CJM - -Archive:: -Archive::Tar adpO Read, write and manipulate tar files CDYBED -Archive::Zip RdpO Provides an interface to ZIP archive files NEDKONZ - -PPM Rdpf Perl Package Manager MURRAY - -RPM adcO RPM package management RJRAY -RPM:: -RPM::Constants adcO Constants for RPM package management RJRAY -RPM::Database adcO DB interface for RPM package management RJRAY -RPM::Headers adcO Headers for RPM package management RJRAY - -18) Images, Pixmap and Bitmap Manipulation, Drawing and Graphing - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -ElectricArc RdpO Generic diagram manipulation toolset SELKOVJR -GIFgraph RdpO Obsolete, see GD::Graph MVERB -Gimp Mmch Rich interface to write plugins for The Gimp MLEHMANN -GraphViz RdpO Interface to the GraphViz graphing tool LBROCARD -OpenGL adcf Interface to OpenGL drawing/imaging library FIJI -PGPLOT Rdof PGPLOT plotting library - scientific graphs KGB -PixDraw adcO Drawing and manipulating true color images KSB -RenderMan a Manipulate RenderMan objects GMLEWIS -T3D cdpO Realtime extensible 3D rendering GJB -ThreeD i Namespace root for all kinds of 3D modules ADESC - -GD adcO Interface to Gd Graphics Library LDS -GD:: -GD::Barcode bdpO Create barcode image with GD KWITKNR -GD::Graph RdpO Create charts using GD MVERB -GD::Text RdpO Classes for string handling with GD MVERB - -VRML RdpO VRML methods independent of specification HPALM -VRML:: -VRML::VRML1 RdpO VRML methods with the VRML 1.0 standard HPALM -VRML::VRML2 RdpO VRML methods with the VRML 2.0 standard HPALM -VRML::Color Rdpf color functions and X11 color names HPALM -VRML::Base RdpO common basic methods HPALM -VRML::Browser i A complete VRML viewer LUKKA - -Graphics:: -Graphics::Libplot RdcO Binding for C libplotter plotting library JLAPEYRE -Graphics::Plotter Rd+O Binding for C++ libplotter plotting library MAKLER -Graphics::Simple idcO Simple drawing primitives NEERI -Graphics::Turtle idp Turtle graphics package NEERI - -Image:: -Image::Colorimetry cdpO transform colors between colorspaces JONO -Image::DS9 adpO Interface to SAO DS9 image & analysis prog DJERIUS -Image::Grab RdpO Grabbing images off the Internet MAHEX -Image::Magick RdcO Read, query, transform, and write images JCRISTY -Image::ParseGIF RdpO Parse GIF images into component parts BENL -Image::Size Rdpf Measure size of images in common formats RJRAY -Image::Info RdpO Extract meta information from image files GAAS - -Chart:: -Chart::Base RdpO Business chart widget collection NINJAZ -Chart::Gdchart bdch based on Bruce V's C gdchart distribution MHEMPEL -Chart::Graph Rmpr front-end to gnuplot and XRT MHYOUNG -Chart::PNGgraph RdpO Package to generate PNG graphs, uses GD.pm SBONDS -Chart::Pie adpO Implements "new Chart::Pie()" KARLON -Chart::Plot bdcO Graph two-dimensional data (uses GD.pm) SMORTON -Chart::XMGR Rdph interface to XMGR plotting package TJENNESS - -Xmms bdcO Interactive remote control shell for xmms DOUGM -Xmms:: -Xmms::Config bdcO Perl interface to the xmms_cfg_* API DOUGM -Xmms::Remote bdcO Perl interface to the xmms_remote_* API DOUGM -Xmms::Plugin i Perl interface to the xmms plugin APIs DOUGM - -Flash:: -Flash::SWF cmpO Read/Write Macromedia Flash SWF files SABREN - -19) Mail and Usenet News - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Mail:: -Mail::Address adpf Manipulation of electronic mail addresses GBARR -Mail::Alias bdpO Manipulate E-mail aliases and alias files ZELT -Mail::Audit RdpO Toolkit for constructing mail filters SIMON -Mail::Cap adpO Parse mailcap files as specified in RFC 1524 GBARR -Mail::CheckUser bdpf Checking email addresses for validness ILYAM -Mail::Ezmlm bdpO Object methods for ezmlm mailing lists GHALSE -Mail::Field RdpO Base class for handling mail header fields GBARR -Mail::Folder adpO Base-class for mail folder handling KJOHNSON -Mail::Freshmeat RdpO Parses newsletters from http://freshmeat.net ASPIERS -Mail::Header RdpO Manipulate mail RFC822 compliant headers GBARR -Mail::Internet adpO Functions for RFC822 address manipulations GBARR -Mail::MH adcr MH mail interface MRG -Mail::Mailer adpO Simple mail agent interface (see Mail::Send) GBARR -Mail::POP3Client RdpO Support for clients of POP3 servers SDOWD -Mail::Procmail Rdpf Procmail-like facility for creating easy mai JV -Mail::Send adpO Simple interface for sending mail GBARR -Mail::Sender MdpO socket() based mail with attachments, SMTP JENDA -Mail::Sendmail Rdpf Simple platform independent mailer MIVKOVIC -Mail::UCEResponder i Spamfilter CHSTROSS -Mail::Util adpf Mail utilities (for by some Mail::* modules) GBARR -Mail::IMAPClient RdpO An IMAP Client API DJKERNEN - -Mail::Field:: -Mail::Field::Received RdpO Parses Received headers as per RFC822 ASPIERS - -News:: -News::Article adpO Module for handling Usenet articles AGIERTH -News::Gateway ampO Mail/news gatewaying, moderation support RRA -News::NNTPClient bdpO Support for clients of NNTP servers RVA -News::Newsrc adpO Manage .newsrc files SWMCD -News::Scan cdpO Gathers and reports newsgroup statistics GBACON - -NNTP:: -NNTP::Server i Support for an NNTP server JOEHIL - -NNML:: -NNML::Server adpO An simple RFC 977 NNTP server ULPFR - -IMAP:: -IMAP::Admin RdpO IMAP Administration EESTABROO - -Sendmail:: -Sendmail::Milter Rdch Write mail filters for sendmail in Perl CYING - -20) Control Flow Utilities (callbacks and exceptions etc) - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -AtExit Rdpr atexit() function to register exit-callbacks BRADAPP -Callback RdpO Define easy to use function callback objects MUIR -Religion adpr Control where you go when you die()/warn() KJALB - -Hook:: -Hook::PrePostCall adpO Add actions before and after a routine PVERD - -Memoize bdpr Automatically cache results of functions MJD -Memoize:: -Memoize::ExpireLRU Rdpr Provide LRU Expiration for Memoize BPOWERS - -21) File Handle, Directory Handle and Input/Output Stream Utilities - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -IO:: -IO::AtomicFile RdpO Write a file which is updated atomically ERYQ -IO::Dir cdpO Directory handle objects and methods GBARR -IO::File cdpO Methods for disk file based i/o handles GBARR -IO::Handle cdpO Base class for input/output handles GBARR -IO::Lines RdpO I/O handle to read/write to array of lines ERYQ -IO::Pipe cdpO Methods for pipe handles GBARR -IO::Ptty amcf Pseudo terminal interface functions RGIERSIG -IO::Pty cdpO Methods for pseudo-terminal allocation etc PEASE -IO::React RdpO OO Expect-like communication GARROW -IO::STREAMS cdcO Methods for System V style STREAMS control NI-S -IO::Scalar RdpO I/O handle to read/write to a string ERYQ -IO::ScalarArray RdpO I/O handle to read/write to array of scalars ERYQ -IO::Seekable cdpO Methods for seekable input/output handles GBARR -IO::Select adpO Object interface to system select call GBARR -IO::Socket cdpO Methods for socket input/output handles GBARR -IO::Stty bmpf POSIX compliant stty interface RGIERSIG -IO::Tee RdpO Multiplex output to multiple handles KENSHAN -IO::Wrap RdpO Wrap old-style FHs in standard OO interface ERYQ -IO::WrapTie RdpO Tie your handles & retain full OO interface ERYQ -IO::Zlib adpO IO:: style interface to Compress::Zlib TOMHUGHES - -FileHandle SupO File handle objects and methods P5P -FileCache Supf Keep more files open than the system permits P5P -DirHandle SupO Directory handle objects and methods CHIPS -SelectSaver SupO Save and restore selected file handle CHIPS -Selectable cdpO Event-driven I/O streams MUIR - -Log:: -Log::Agent adpO A general logging framework RAM -Log::Dispatch RdpO Log messages to multiple outputs DROLSKY -Log::Topics Rdpf Control flow of topic based logging messages JARW -Log::TraceMessages Rdpf Print developer's trace messages EDAVIS - -Log::Agent:: -Log::Agent::Logger cdpO Application-level logging interface RAM -Log::Agent::Rotate adpO Logfile rotation config and support RAM - -Expect RdpO Close relative of Don Libes' Expect in perl RGIERSIG - -22) Microsoft Windows Modules - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Win32:: -Win32::ADO adpf ADO Constants and helper functions MSERGEANT -Win32::ASP Rdpr Makes PerlScript ASP development easier WNODOM -Win32::AbsPath Rdpf relative paths to absolute, understands UNCs JENDA -Win32::AdminMisc Rdcf Misc admin and net functions DAVEROTH -Win32::COM cd+O Access to native COM interfaces JDB -Win32::ChangeNotify bdcO Monitor changes to files and directories CJM -Win32::Clipboard Rdch Interaction with the Windows clipboard ACALPINI -Win32::Console Rdch Win32 Console and Character mode functions ACALPINI -Win32::Event bdcO Use Win32 event objects for IPC CJM -Win32::EventLog adcf Interface to Win32 EventLog functions WIN32 -Win32::FUtils bdcf Implements missing File Utility functions JOCASA -Win32::FileOp Mdpf file operations + fancy dialogs, INI files JENDA -Win32::FileType RdpO modify Win32 fily type mapping JENDA -Win32::GD RdcO Win32 port of the GD extension (gif module) DAVEROTH -Win32::GUI bmch Perl-Win32 Graphical User Interface ACALPINI -Win32::GuiTest adcf SendKeys, FindWindowLike and more ERNGUI -Win32::IPC bdcO Base class for Win32 synchronization objects CJM -Win32::Internet RdcO Perl Module for Internet Extensions ACALPINI -Win32::Message bdcf Network based message passing DAVEROTH -Win32::Mutex bdcO Use Win32 mutex objects for IPC CJM -Win32::NetAdmin adcf Interface to Win32 NetAdmin functions WIN32 -Win32::NetResource adcf Interface to Win32 NetResource functions WIN32 -Win32::ODBC Rd+O ODBC interface for accessing databases DAVEROTH -Win32::OLE Rm+h Interface to OLE Automation JDB -Win32::Pipe Rd+O Named Pipes and assorted function DAVEROTH -Win32::Process adcf Interface to Win32 Process functions WIN32 -Win32::RASE Rdpf Dialup entries and connections on Win32 MBLAZ -Win32::Registry adcf Interface to Win32 Registry functions WIN32 -Win32::Semaphore bdcO Use Win32 semaphore objects for IPC CJM -Win32::SerialPort RdpO Win32 Serial functions/constants/interface BBIRTH -Win32::Shortcut Rd+O Manipulate Windows Shortcut files ACALPINI -Win32::Sound Rdch An extension to play with Windows sounds ACALPINI -Win32::WinError adcf Interface to Win32 WinError functions WIN32 -Win32::SystemInfo RdpO Memory and Processor information CJOHNSTON -Win32::API RdcO Perl Win32 API Import Facility ACALPINI - -WinNT cdcf Interface to Windows NT specific functions WIN32 -NT cdcf Old name for WinNT - being phased out WIN32 -Win95 i Interface to Windows 95 specific functions WIN32 - -Win32API:: -Win32API::CommPort RdpO Win32 Serial functions/constants/interface BBIRTH -Win32API::Console cdcf Win32 Console Window functions/consts TYEMQ -Win32API::File cdcf Win32 file/dir functions/constants TYEMQ -Win32API::Registry adcf Win32 Registry functions/constants TYEMQ -Win32API::WinStruct cdcf Routines for Win32 Windowing data structures TYEMQ -Win32API::Window cdcf Win32 Windowing functions/constants TYEMQ - -23) Miscellaneous Modules - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -ARS Mmhh Interface to Remedy's Action Request API JMURPHY -Agent cdpO Transportable Agent module SPURKIS -Archie Rdpf Archie queries via Prospero ARDP protocol GBOSS -BnP RdhO Build'n'Play all-purpose batch install. tool STBEY -Bundle i Namespace reserved for modules collections ANDK -CPAN RdpO Perl Archive browse and download ANDK -Gedcom bmpO Interface to genealogy Gedcom files PJCJ -Logfile RdpO Generic methods to analyze logfiles ULPFR -NetObj adpO Module loading in real time over TCP/IP JDUNCAN -Neural ad+O Generic simulation of neural networks LUKKA -Nexus cdcO Interface to Nexus (threads/ipc/processes) RDO -Pcap i An interface for LBL's packet capture lib AMOSS -Roman Rdpf Convert Roman numbers to and from Arabic OZAWA -SDDF cd+O Interface to Pablo Self Defining Data Format FIS - -AI:: -AI::Fuzzy RdpO Perl extension for Fuzzy Logic SABREN -AI::jNeural RdcO Jet's Neural Architecture JETTERO -AI::NeuralNet RdpO A simple back-prop neural net JBRYAN - -Astro:: -Astro::Coord Rdpf Transform telescope and source coordinates CPHIL -Astro::Misc Rdpf Miscellaneous astronomical routines CPHIL -Astro::MoonPhase Rdpf Information about the phase of the Moon. RPIKKARA -Astro::SLA Rdcf Interface to SLALIB positional astronomy lib TJENNESS -Astro::SunTime cdpf Calculate sun rise/set times ROBF -Astro::Time Rdpf General time conversions for Astronomers CPHIL -Astro::Sunrise RdpO Computes sunrise/sunset for a given day RKHILL - -Audio:: -Audio::CD bdcO Perl interface to libcdaudio (cd + cddb) DOUGM -Audio::Sox i sox sound library as one or more modules NI-S - -Audio::Play:: -Audio::Play::MPG123 RdcO Generic frontend for MPG123 MLEHMANN - -MPEG:: -MPEG::ID3v1Tag MdpO ID3v1 MP3 Tag Reader/Writer SVANZOEST -MPEG::ID3v2Tag bdpO OO, extensible ID3 v2.3 tagging module MDIMEO -MPEG::MP3Play RdhO Create your own MPEG audio player JRED - -MP3:: -MP3::Info bdpf Manipulate / fetch info from MP3 audio files CNANDOR -MP3::Tag bdpO Tag - Module for reading tags of mp3 files THOGEE - -BarCode:: -BarCode::UPC i Produce PostScript UPC barcodes JONO - -Bio i Utilities for molecular biology SEB - -Business:: -Business::Cashcow i??? Internet payment with the Danish PBS GKE -Business::CreditCard Rdpf Credit card number check digit test JONO -Business::ISBN RdpO Work with ISBN as objects BDFOY -Business::ISSN adpO Object and functions to work with ISSN SAPAPO -Business::OnlinePayment RdpO Ecommerce middleware JASONK -Business::UPC ???? manipulating Universal Product Codes ROBF -Business::US_Amort Mdph US-style loan amortization calculations SBURKE - -Chemistry:: -Chemistry::Elements RdpO Working with Chemical Elements BDFOY -Chemistry::Isotopes idpO extends Elements to deal with isotopes BDFOY - -Cisco:: -Cisco::Conf adpO Cisco router administratian via TFTP JWIED - -FAQ:: -FAQ::OMatic RdpO A CGI-based FAQ/help database maintainer JHOWELL - -FestVox i??? Build synthetic voices (cf. www.festvox.org) LENZO - -Finance:: -Finance::Quote RmpO Fetch stock prices over the Internet PJF -Finance::QuoteHist bdpO Historical stock quotes from multiple sites MSISK - -Games:: -Games::Cards adpO Tools to write card games in Perl AKARGER -Games::Dice cdpf Simulates rolling dice PNE -Games::Hex cdpO Object library for hexmap-based board games JHKIM -Games::WordFind bdpO Generate word-find type puzzles AJOHNSON -Games::Alak Rdpf a simple gomoku-like game SBURKE -Games::Dissociate Mdpf a Dissociated Press algorithm and filter SBURKE -Games::Worms RdpO A life simulator for Conway/Patterson worms SBURKE - -Geo:: -Geo::METAR Rdpf Process Aviation Weather (METAR) Data JZAWODNY -Geo::Storm_Tracker i Retrieves tropical storm advisories CARPENTER -Geo::WeatherNOAA Rdpf Current/forecast weather from NOAA MSOLOMON - -HP200LX:: -HP200LX::DB cdpO Handle HP 200LX palmtop computer database GGONTER -HP200LX::DBgui cdpO Tk base GUI for HP 200LX db files GGONTER - -LEGO:: -LEGO::RCX bdpO Control you Lego Mindstorm RCX computer JQUILLAN - -MIDI Mdph read/edit/compose MIDI files SBURKE -MIDI:: -MIDI::Realtime cdpO Interacts with MIDI devices in realtime FOOCHRE - -Penguin RdpO Remote Perl in Secure Environment AMERZKY -Penguin:: -Penguin::Easy RdpO Provides quick, easy access to Penguin API JDUNCAN - -Psion:: -Psion::Db idpO Handle Psion palmtop computer database files IANPX - -Remedy:: -Remedy::AR adcO Interface to Remedy's Action Request API RIK - -Router:: -Router::LG bdpO Execute commands on routers (based on lg.pl) CHRISJ - -Schedule:: See also Schedule:: in chapter 4 -Schedule::Match adpf Pattern-based crontab-like schedule TAIY - -Silly:: -Silly::StringMaths adpf Do maths with letters and strings SKINGTON - -SyslogScan:: -SyslogScan::SyslogEntry bdpO Parse UNIX syslog RHNELSON -SyslogScan::SendmailLine bdpO Summarize sendmail transactions RHNELSON - -Video::Capture:: -Video::Capture::V4l Mdch Video4linux framegrabber interface MLEHMANN - -Watchdog:: -Watchdog::Service adpO Look for service in process table PSHARPE -Watchdog::HTTPService adpO Test status of HTTP server PSHARPE -Watchdog::MysqlService adpO Test status of Mysql server PSHARPE - -24) Interface Modules to Commercial Software - -Name DSLI Description Info ------------- ---- -------------------------------------------- ---- -Resolute:: -Resolute::RAPS cd+O Interface to Resolute Software's RAPS CHGOETZE - -AltaVista:: -AltaVista::SearchSDK cdcf Perl Wrapper for AltaVista SDK functionality JTURNER - -Real:: -Real::Encode i Interface to Progressive Network's RealAudio KMELTZ - -HtDig RdpO Interface for the HtDig indexing system JTILLMAN -MQSeries RdcO IBM's MQSeries messaging product interface WPMOORE -PQI cdcO Perl Queuing Interface, to MQSeries, MSMQ SIMONJ -R3 bdcO Interface to SAP R/3 using RFCSDK SCHOEN - -Part 3 - Big Projects Registry - -This section of the Module List is devoted to listing "Big Projects". I -don't want to define Big (or even Project) here. Hopefully the items below -speak for themselves. Almost all are just ideas, though some have been -dabbled with and some are active projects. - -These are ideas for people with very strong skills and lots of time. Please -talk, and listen, to Larry and the perl5-porters _before_ starting to do any -work on projects which relate to the core implementation of Perl. - -Ask not when these will be implemented, ask instead how you can help -implement them. - -1) Items in the Todo File - -The Todo supplied with Perl lists over 50 items in categories ranging from -"Would be nice to have" to "Vague possibilities". - -Contacts: P5P - -2) Multi-threading - -This is really two projects. True threads (e.g., POSIX) using multiple -independant perl interpreter structures and simple timeslicing of 'tasks' -within a single perl interpreter. True threads requires operating system -support or an external thread library, simple timeslicing does not (and -should be portable to all platforms). - -Malcolm Beattie < mbeattie@sable.ox.ac.uk > has done extensive work in this -area and is folding this work into Perl now for version 5.005 or 5.006. - -Contacts: MICB P5P - -3) Object Management Group CORBA & IDL - -Work is underway on the COPE mailing list, led by Bart Schuller, to -implement a Perl binding for CORBA. See http://www.lunatech.com/cope/ - -Contacts: COPEML BARTS - -4) Expand Tied Array Interface - -LEN, PUSH, POP, SHIFT, UNSHIFT and a fallback to SPLICE are needed. -Complicated by very widespread use of arrays within perl internals. - -Contacts: P5P CHIPS - -5) Extend Yacc To Write XS Code - -To quote Larry, "The right way to integrate yacc with Perl would be to have -it spit out an XS module, presumably." Some version of yacc, like byacc, -should be converted to spit out an OO .xs and .pm implementing a parser. -Jake Donham's work so far is available in his CPAN directory -http://www.cpan.org/authors/id/JAKE . - -Contacts: JAKE NI-S P5P - -6) Approximate Matching Regular Expressions - -Add support into the core for approximate matching m/.../a (like the agrep -utility). - -Contacts: JHI - -Part 4 - Standards Cross-reference - -This section aims to provide a cross reference between standards that exist -in the computing world and perl modules which have been written to implement -or interface to those standards. - -It also aims to encourage module authors to consider any standards that -might relate to the modules they are developing. - -4.1) IETF - Internet Engineering Task Force (RFCs) - -Standard Description Module Name --------- ----------- ----------- -RFC821 Simple Mail Transfer Protocol Net::SMTP -RFC822 Internet Mail Header Mail::Header -RFC822 Internet Mail addresses Mail::Address -RFC867 Daytime Protocol Net::Time -RFC868 Time Protocol Net::Time -RFC959 File Transfer Protocol Net::FTP -RFC977 A minimal NNTP Server NNML::Server -RFC977 Network News Transfer Protocol Net::NNTP -RFC1035, RFC1183, RFC1706 - Domain names, implementation & specification Net::DNS -RFC1123 Date conversion routines HTTP::Date -RFC1319 MD2 Message-Digest Algorithm Digest::MD2 -RFC1321 MD5 Message-Digest Algorithm Digest::MD5 -RFC1350 Trivial File Transfer Protocol TFTP, Net::TFTP -RFC1413 Identification Protocol Net::Ident -RFC1592 Simple Network Management Protocol SNMP, Net::SNMP -RFC1738 Uniform Resource Locators URI::URL -RFC1777 Lightweight Directory Access Protocol Net::LDAP -RFC1861 Simple Network Pager Protocol Net::SNPP -RFC1866 Encode/decode HTML entities in a string HTML::Entities -RFC1939 Post Office Protocol 3 Net::POP3 -RFC1950-1952 - ZLIB, DEFLATE, GZIP Compress::Zlib -RFC1960 String Representation of LDAP Search Filters Net::LDAP::Filter -RFC2045-2049 - MIME - Multipurpose Internet Mail Extensions MIME::* -RFC2138 Terminal server authentification and accting RADIUS -RFC2229 Dictionary Server Net::Dict -RFC2518 HTTP Extensions for Distributed Authoring HTTP::DAV - -4.2) ITU - International Telegraph Union (X.*) - -Standard Description Module Name --------- ----------- ----------- -X.209 Basic Encoding Rules for ASN.1 Convert::BER - -4.3) ISO - International Standards Organization (ISO*) - -Standard Description Module Name --------- ----------- ----------- -ISO/R 2015-1971 - Date calculations for the Gregorian calendar Date::DateCalc -ISO639 Two letter codes for language identification Locale::Language -ISO3166 Two letter codes for country identification Locale::Country - -Part 5 - Who's Who and What's Where - -5.1) Information / Contact Reference Details (in alphabetical order) - -The following list of email addresses is based on the credentials stored on -the automated Perl Authors Upload Server (PAUSE). If any of the details is -not up to date, you're requested to visit -http://www.cpan.org/modules/04pause.html , where you will find a pointer to -a CGI script that lets you edit the database entries yourself. - -5.2) Perl Frequently Asked Questions (FAQ) - -The FAQ is available on all CPAN sites in the directory doc/FAQs (e.g., - - * http://www.cpan.org/doc/FAQs/ - -) as well as from the RTFM server where you can find all posted FAQs: - - * ftp://rtfm.mit.edu/pub/usenet/news.answers/perl-faq/ - * ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/lang/perl/ - -RTFM mirror sites: North America: - - * ftp://ftp.uu.net/usenet/news.answers - * ftp://mirrors.aol.com/pub/rtfm/usenet - * ftp://mirror.seas.gwu.edu/pub/rtfm - -Europe: - - * ftp://ftp.uni-paderborn.de/pub/FAQ - * ftp://ftp.sunet.se/pub/usenet - -Asia: - - * ftp://nctuccca.edu.tw/USENET/FAQ - * ftp://hwarang.postech.ac.kr/pub/usenet/news.answers - * ftp://ftp.hk.super.net/mirror/faqs diff --git a/doc/memo/TODO b/doc/memo/TODO deleted file mode 100644 index 1187f061..00000000 --- a/doc/memo/TODO +++ /dev/null @@ -1,2 +0,0 @@ -http://www.FreeBSD.org/tutorials/docproj-primer/writing-style.html - |
