diff options
| author | fukachan <fukachan> | 2001-01-19 12:54:13 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2001-01-19 12:54:13 +0000 |
| commit | 4377641665acbf1a4a83883241afe392e88ec112 (patch) | |
| tree | 7ed8f24cd168c95d329bcaf2958b6a63feac6bfb | |
| download | fml8-4377641665acbf1a4a83883241afe392e88ec112.tar.gz fml8-4377641665acbf1a4a83883241afe392e88ec112.tar.bz2 fml8-4377641665acbf1a4a83883241afe392e88ec112.zip | |
Initial revision
86 files changed, 34471 insertions, 0 deletions
diff --git a/3rdparty/index.ja.html b/3rdparty/index.ja.html new file mode 100644 index 00000000..41146932 --- /dev/null +++ b/3rdparty/index.ja.html @@ -0,0 +1,20 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> + ... title ... +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +このディレクトリは、あなたが自分のモヂュールを入れて製品を出荷したいな +ら、このディレクトリを用いると良いということで用意されている。 + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/cpan/dist/00_README b/cpan/dist/00_README new file mode 100644 index 00000000..9db6cc7d --- /dev/null +++ b/cpan/dist/00_README @@ -0,0 +1,2 @@ +archive CPAN original distributions + diff --git a/doc/design/opdyke-thesis.ps b/doc/design/opdyke-thesis.ps new file mode 100644 index 00000000..7e4c0bb9 --- /dev/null +++ b/doc/design/opdyke-thesis.ps @@ -0,0 +1,20107 @@ +%! +/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 new file mode 100644 index 00000000..6ea23334 --- /dev/null +++ b/doc/memo/00modlist.long.txt @@ -0,0 +1,3481 @@ +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 new file mode 100644 index 00000000..1983d1de --- /dev/null +++ b/doc/memo/01_good_modules @@ -0,0 +1,1401 @@ +::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 new file mode 100644 index 00000000..446c9239 --- /dev/null +++ b/doc/memo/99modlist.txt @@ -0,0 +1,3481 @@ +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/fml/INSTALL.sh b/fml/INSTALL.sh new file mode 100755 index 00000000..2d688363 --- /dev/null +++ b/fml/INSTALL.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +# Run this from the top-level fml source directory. + +PATH=/bin:/usr/bin:/usr/sbin:/usr/etc:/sbin:/etc +umask 022 + +### configurations ### +version=5.000 +prefix_dir=/usr/local +config_dir=/etc/fml +libexec_dir=$prefix_dir/libexec/fml +lib_dir=$prefix_dir/lib/fml +###################### + +if [ ! -d $config_dir ];then + echo "I cannot find $config_dir" + exit 1 +fi + +for dir in $config_dir/defaults $config_dir/defaults/$version +do + test -d $dir || mkdir $dir +done + +cp etc/main.cf $config_dir/main.cf +cp etc/default_config.cf $config_dir/defaults/$version + +echo debug now ... +ln -s $PWD/libexec $libexec_dir/$version +ln -s $PWD/lib $lib_dir/$version + +echo "please link" +echo "% ln -s $PWD/etc/config.cf /var/spool/ml/elena/config.cf" + +exit 0 diff --git a/fml/Makefile b/fml/Makefile new file mode 100644 index 00000000..18eaf07c --- /dev/null +++ b/fml/Makefile @@ -0,0 +1,40 @@ +PERL = perl -w -I ./lib/fml5 -I ./lib/CPAN -I ./lib/3RDPARTY -I ./lib + +all: test + +scan: + @ cvs -n update 2>&1 |grep -v : || echo '' + +update: + @ cvs update -dAP|grep -v : || echo '' + +test: test2 + +test1: + @ cat w/example |\ + perl -w libexec/distribute etc/default_config.cf etc/config.cf + +test2: + @ cat w/example |\ + perl -w libexec/fml.pl /var/spool/ml/elena + +test3: + @ echo '-- test in the case where Socket6 fail' + @ cat w/example |\ + /usr/pkg/bin/perl -w libexec/fml.pl /var/spool/ml/elena + +check: + @ for x in `find lib* -type f -print|grep pm|grep -v CPAN` ; do $(PERL) -c $$x || echo '' ;done + +clean: + @ find . |grep '~' |perl -nple unlink + +link: + rm -f FML Netlib IO + ln -s lib/fml5/FML . + ln -s lib/fml5/Netlib . + ln -s lib/fml5/IO . + (cd libexec; ln -s fmlwrapper fml.pl) + +hier: + perl bin/show_hierarchy.pl FML/libkern.pl | uniq diff --git a/fml/TODO b/fml/TODO new file mode 100644 index 00000000..a91bf2b6 --- /dev/null +++ b/fml/TODO @@ -0,0 +1,9 @@ +* general + + queue manager + +* SMTP + + outgoing address + + direct exec $program on the disk NOT IPC. diff --git a/fml/bin/fmldoc b/fml/bin/fmldoc new file mode 100755 index 00000000..48552a86 --- /dev/null +++ b/fml/bin/fmldoc @@ -0,0 +1,27 @@ +#!/usr/local/bin/perl +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. +# +# $FML$ +# + +=head1 NAME + +fmldoc -- wrapper for pod2man + +=head1 SYNOPSIS + +fmldoc filename + +=head1 DESCRIPTION + +=cut + +for $file (@ARGV) { + $file =~ s@::@/@g; + system "pod2man $file | nroff -man |less"; +} + +1; diff --git a/fml/bin/show_hierarchy.pl b/fml/bin/show_hierarchy.pl new file mode 100755 index 00000000..ce6cd775 --- /dev/null +++ b/fml/bin/show_hierarchy.pl @@ -0,0 +1,142 @@ +#!/usr/local/bin/perl +# +# $Id$ +# + +use lib qw(./lib/3RDPARTY ./lib/fml5 ./lib/CPAN ./lib); +use strict; +use vars qw($Count %Count $debug $verbose %IgnoreList); + +%IgnoreList = ( + 'Carp' => 1, + 'Exporter' => 1, + 'FileHandle' => 1, + 'DynaLoader' => 1, + 'AutoLoader' => 1, + ); + +for (@ARGV) { load( $_ );} + + +sub load +{ + my ($f) = @_; + my $name = $f; + + return if $IgnoreList{ $name }; + + $Count++; + if ($Count > 32) { die("infinite loop!\n");} + + $f =~ s@::@/@g; + for my $dir (@INC) { + if (-f "$dir/$f.pm") { + $f = "$dir/$f.pm"; + last; + } + if (-f "$dir/$f.pl") { + $f = "$dir/$f.pl"; + last; + } + } + + unless (-f $f) { + P( "not found: $f" ) if $debug;; + $Count--; + return; + } + + + if ( $Count{ $f } ) { + P( "$f is recursive" ) if $debug;; + $Count--; + return; + } + else { + $Count{ $f } = 1; + } + + use FileHandle; + my $fh = new FileHandle $f; + print "--- open $f\n" if $debug; + + + ### dynamic scope to count up recursive conditions + local(%Count) if $Count == 2; + + + + if (defined $fh) { + my $file = ''; + my $comment = ''; + my $current_function = ''; + my %function_hach = (); + my $pat = '$0 eq __FILE__'; + + while (<$fh>) { + last if /$pat/; + last if /__END__/; + + next if /^\s*\#/; + next if /^\s*Log/; + + # ignore comments + $comment = 1 if /^=/; + $comment = 0 if /^=cut/; + next if $comment; + + chop; + + if (/^sub (\S+)/) { + $current_function = $1; + } + + # ignore these since they are too many. + if (/(use|require)\s+(Carp|Exporter|DynaLoader|AutoLoader)/) { + next; + } + + if (/(use|require)\s+([A-Z]\S+[a-zA-Z0-9])/) { + unless ( $function_hach{ $current_function } ) { + if ($verbose) { + &P(); + &P( "${name}::". $current_function ); + } + $function_hach{ $current_function } = 1; + } + + &P() if $Count == 1; + &P() if $Count == 2; + $verbose ? &P( $_ , $. ) : &P( $_ ); + $file = $2; + $file =~ s/\"//g; + $file =~ s/\'//g; + if ($file =~ /^[a-z]/) { + ; + } + else { + P( "\t($Count)load $file" ) if $debug; + load($file); + } + } + } + + $fh->close if defined $fh; + } + + $Count--; +} + + +sub P +{ + my ($s, $lc) = @_; + + $s =~ s/^\s+//o; + print " " x ( $Count - 1 ); + printf "%4d> ", $lc if $lc; + print $s, "\n"; +} + + +1; diff --git a/fml/bin/show_modules.sh b/fml/bin/show_modules.sh new file mode 100755 index 00000000..ce682495 --- /dev/null +++ b/fml/bin/show_modules.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +for x in libexec/fml.pl FML/*pm +do + sed '/=head1/,/=cut/d' $x |less +done diff --git a/fml/curproc.ja.html b/fml/curproc.ja.html new file mode 100644 index 00000000..6e144db7 --- /dev/null +++ b/fml/curproc.ja.html @@ -0,0 +1,44 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +$curproc (current process struct) 構造体のうちわけ +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<CENTER> +<EM>$curproc</EM> +(current process struct) 構造体のうちわけ +</CENTER> + +<PRE> + +$curproc FML::Process::Kernel オブジェクト + + config FML::Config オブジェクト + + credential FML::Credential オブジェクト + + incoming_mail (単なるキーワード) + ヘッダ FML::Header オブジェクト + メール本文 FML::Body オブジェクト + + article (単なるキーワード) + ヘッダ FML::Header オブジェクト + メール本文 FML::Body オブジェクト + + reply_messages (単なるキーワード) + +</PRE> + +オペレーションは各オブジェクトのメソッドが責任を持って実行する。 + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/00_IDEA b/fml/doc/00_IDEA new file mode 100644 index 00000000..c09f60d9 --- /dev/null +++ b/fml/doc/00_IDEA @@ -0,0 +1,264 @@ + fml5 project + + +○ 基本理念 + + (仮称) fml5 == Fml Modular Listmanager based on perl 5 + (recursive definition) + + sendmail -> postfix 的な置き換えプログラム + 例えば + /etc/aliaes や .forward はそのまま使いつづけられる + しかし sendmail.cf は解釈しないといったイメージ + + /var/spool/ml + /var/spool/ml/ML名 + + という構造は残したいとおもうが、 + それ以外の互換性を保証するかはかなり不明 + + Q: ? ~ユーザ名/fml/ML名 + suEXEC みたいなものかい? + + ユーザが死にそうにいるサーバ上では uniqueness をチェッ + クするのがとても大変そう? + + +○ fml.pl は wrapper で + + /usr/local/libexec/fml/$VERSION/ ... + + LDAP とか SQL をしゃべれてほしいですな > Netscape + + +○ メインプログラムディレクトリ階層の例 + ( 現在の /usr/local/local/fml にあたるもの ) + ports, packages, RPM, .deb フレンドリィに(?) + + /usr/local/libexec/fml/ + + /usr/local/libexec/fml/distribute (配送プログラム) + /usr/local/libexec/fml/command (コマンド処理プログラム) + /usr/local/libexec/fml/mead (エラー解析) + /usr/local/libexec/fml/confirmd + + 注: --ctladdr はつかわない。できるだけ DO NOT PARSE + でないと機械的な処理がしにくいため + # 例えば CGI では include-ctl ファイルの編集の際 + s/distribute/command/g + するだけの方が楽などといった具合(?) + + /usr/local/libexec/fml/emul/ + + /usr/local/libexec/fml/emul/fml.pl + --ctladdr なしは /usr/local/libexec/fml/distribute を + --ctladdr つきは /usr/local/libexec/fml/command を実行する + + /usr/local/libexec/fml/emul/XXX + 例: emul/listserv + + + /usr/local/lib/fml/ + ドキュメントや perl module などをおく ? + + /usr/local/lib/fml/doc/text/ + /usr/local/lib/fml/doc/html/ + /usr/local/lib/fml/doc/sgml/ + /usr/local/lib/fml/doc/pod/ + /usr/local/lib/fml/doc/man/ + /usr/local/lib/fml/doc/jman/ + + /usr/local/lib/fml/lib/base/Proc.pm + /usr/local/lib/fml/lib/CPAN/Mail/ + /usr/local/lib/fml/lib/Jcode/Jcode.pm + /usr/local/lib/fml/lib/gnu/ + /usr/local/lib/fml/lib/3rdparty/ + + /usr/local/lib/fml/messages/ + /usr/local/lib/fml/makefml/ + + /usr/local/lib/fml/examples/ + /usr/local/lib/fml/examples/www/ + /usr/local/lib/fml/examples/databases/ + + /usr/local/lib/fml/contrib/ + + +○ 基本設定の例 + + ( makefml が使うため, virtual domain/host を考慮する ) + + /etc/fml/$domain/fml.cf + /etc/fml/$domain/cgi.cf + + こうすれば + # makefml newml elena@fml.org + # makefml newml elena@nuinui.net + といった操作でバーチャルドメインの場合に簡単にできないか? + + elena ML + /var/spool/ml/elena/設定ファイル (仮称: config.cf ) + # もっと良い名前募集中 + + + :include:/var/spool/ml/elena は + + "| /usr/local/libexec/fml/distribute /var/spool/ml/elena" + + :include:/var/spool/ml/elena-ctl は + + "| /usr/local/libexec/fml/command /var/spool/ml/elena" + + を呼び出す。 + + Q: 実は実体は1つで、$0 で処理が分かれるようにしていてもよい + + +○ 再利用可能性 + + たとえば confirmation module の例 + + subscribe エンジン ---> confirmation module + モデレータ ---> confirmation module + confirmd ---> confirmation module + + /usr/local/lib/fml/lib/base/Confirm.pm + + +○ 設定ファイル + + 問題点 + perl でかくと parser がかけない(perl が柔軟過ぎるから) + 1/0 はいやん、yes/no のほうがまし + 配列が表現できない + 型チェックをしたいのだが… + + + config.cf の例 # 段落区切り ( postfix とおなじ形式で ) + + # これは自動設定されるはず + # myhomedir = /var/spool/ml/elena + + myfqdn = ahodori.fml.org + mydomain = fml.org + + mail_list = elena@$mydomain + control_address = elena-ctl@$mydomain + + # メンバーリスト関係 + members_maps = $myhomedir/members + admin_members_maps = $myhomedir/members-admin + + # definition of recipients: fml uses recipient lists in this order + # [a-z]+: のうち file: だけは省略しても良い + # これで配列の表現ができる + recipients_maps = $myhomedir/recipients + file:$myhomedir/actives + mysql:$sysconfdir/mysql.cf + + + # makefml add の際にはどの maps をアップデートするか? + # たとえばファイルに追加であって、mysql へではない + # XXX この名前づけルールは良くないと思う > postfix + # XXX もっとよい名前を + recipient_database = $myhomedir/recipients + + + # かならず use_* と *_type がこんび(か?) + use_verps = yes + verps_type = qmail + + + # 配送モード ( REJECT_POST_HANDLER をやめよう ) + # distribute_mode = forward + distribute_mode = forward_if_moderator_allow + + # $PERMIT_POST_FROM + allow_post_from = reject_system_accounts + members_only + reject + + # $PERMIT_COMMAND_FORM (?) + allow_command_from = reject_system_accounts + members_only + ignore + + # + distribute_restrictions = reject_system_accounts + members_only + reject + + command_restrictions = reject_system_accounts + members_only + reject + + + # 逆にモデレータ は use_moderator (にすると変な例?) + use_moderator = yes + moderator_type = otp + moderator_maps = $myhomedir/moderators + + # LDAP + LDAP::HOST = + LDAP::PORT = + + + +○ フック? + + 別案1 + + # hooks + hooks = $myhomedir/hooks.ph + + 別案2 + + =head1 configurations + + postfix スタイル(なんですよ、これは) + + =head1 hooks + =cut + + # 現在の LOCAL_CONFIG で別れ目になる行 + # HOOK + + +○ 多国語化 + + 「developpers はメッセージの他国語化は前提にしてくれればいいだ + けで、べつに英語の見本を書かなくてもいいですよ〜ん」 + + この時代、日本人が運用していてもその ML のメンバーが外国人のば + あいはあります。だからサポートしたいです。 + + また、IETF では来年あたりに、エラーメッセージなどの多国語化問 + 題とかあるので、MLM (MTA もどき)であっても、多国語かは必要とお + もいます。#なにをもってえらーめっせーじかによりますけど… + + +○ 設定ファイルのロード順 + + + 現在の cf ですら設定してる項目が多すぎる + 「実はこんな項目もconfig.phで設定されちゃっているのね」はだめ + + あどれす + POST_RESTRICTION + COMMAND_RESTRICTION + REGISTRATION_TYPE auto_confirmation (とかか?) + + 以外はデフォルトのままにしたいなぁ。 + ぼく、差分だけが一画面くらいあるだけなのが希望ですぅ。 + + ということは + + use FML::LoadConfig; + my $rcf = new FML::LoadConfig; + $rcf->load( /usr/local/fml/lib/$VERSION/etc/default_config.cf ); + $rcf->load( /etc/fml/$DOMAIN/default_config.cf ); + $rcf->load( /var/spool/ml/elena/config.cf ); + + とかいうローディングをしないといけないような気がする + + * メニューで明示的に変更すると、それだけは新たに付け加わる > config.cf diff --git a/fml/doc/__template.ja.html b/fml/doc/__template.ja.html new file mode 100644 index 00000000..5a8af747 --- /dev/null +++ b/fml/doc/__template.ja.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> + ... title ... +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/architecture.gif b/fml/doc/architecture.gif Binary files differnew file mode 100644 index 00000000..4f185758 --- /dev/null +++ b/fml/doc/architecture.gif diff --git a/fml/doc/architecture.html b/fml/doc/architecture.html new file mode 100644 index 00000000..f5e59edc --- /dev/null +++ b/fml/doc/architecture.html @@ -0,0 +1,20 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> + ... title ... +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<CENTER> +<IMG SRC="architecture.gif" ALIGH=CENTER> +</CENTER> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/components.ja.html b/fml/doc/components.ja.html new file mode 100644 index 00000000..748e632d --- /dev/null +++ b/fml/doc/components.ja.html @@ -0,0 +1,32 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +コンポーネント +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> +<PRE> + + fml/{distribute,command, ... } + ||| + -------- 乖離層 -------- + ||| + FML::BaseSystem + | | + FML::Config | + | | logging() + | | | | + file DBMS file syslog(3) +</PRE> + +FML::BaseSystem は設定の保守とログとりをサポートする最低限の基本システ +ムのクラスといえる。 + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/dirhier.ja.html b/fml/doc/dirhier.ja.html new file mode 100644 index 00000000..151368de --- /dev/null +++ b/fml/doc/dirhier.ja.html @@ -0,0 +1,53 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +ディレクトリ構造 +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<P> 実際にインストールされる場所は、次のような場所。 + <PRE> + /etc/fml/ + /usr/local/lib/fml/$VERSION/ + /usr/local/libexec/fml/$VERSION/ + /usr/share/doc/fml/$VERSION/ + </PRE> + +<TABLE BORDER=4> + <TR> + <TD> ディレクトリ + <TD> 説明 + + <TR> + <TD> doc/ + <TD> ドキュメント + + <TR> + <TD> etc/ + <TD> configurations + + <TR> + <TD> lib/ + <TD> + <A HREF="../lib/index.ja.html"> + ベンダーごとのサブディレクトリ + </A> + + <TR> + <TD> libexec/ + <TD> + 実行されるプログラムの実体。 + もっともすぐにモジュールを + 呼び出すので wrapper というべきだろう。 + +</TABLE> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/index.ja.html b/fml/doc/index.ja.html new file mode 100644 index 00000000..160cc67c --- /dev/null +++ b/fml/doc/index.ja.html @@ -0,0 +1,29 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +fml5 documents +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<UL> + <LI> + <A HREF="interfaces.ja.html"> + モジュール間インターフェイス + </A> + + <LI> + <A HREF="modules.ja.html"> + モジュール's + </A> + +</UL> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/interfaces.ja.html b/fml/doc/interfaces.ja.html new file mode 100644 index 00000000..aad5871e --- /dev/null +++ b/fml/doc/interfaces.ja.html @@ -0,0 +1,67 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +インターフェイス仕様 +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<CENTER> +インターフェイス仕様 (原案のメモ(注: 単なる走り書き)) +</CENTER> + +<P> <EM>基本的なスタイル</EM> +<UL> + <LI> + Perl ではポリモーフィズムと実行時バインディングができることに + は重視すること。多重継承などに頭を使うより + ポリモーフィズムと実行時バインディングによる + コンポーネント指向ぽい方向性を模索する。 + + <LI> + Perl 5 のパッケージを使った、オブジェクトぽい書き方は + 変数自身が自分のパッケージをしっているので、 + 単にパッケージ修飾(例: :: )を使わなくてもよいくらいに + 思う方がよい。 + + <LI> + そのために、 + 再利用性と抽象度を高くしたインターフェイスは + オブジェクトぽい書きかたが良さそう。 + + <LI> + perl 5 だと必然的にオブジェクトぽくなってしまうが、 + オブジェクト、オブジェクト、オブジェクトし過ぎないように + バランス感覚に注意しよう。 + + <LI> + 他人のモジュールを使う場合はともかく、 + 自分達で書くモジュールでの + ”深い”継承はできるだけ避けたい。 + 何でも深くすればよいというものではないでしょう。 +</UL> + +<P> <EM>メイン → モジュールの基本的な形の例:</EM> + libexec/ や libkern.pl にある関数は、 + main:: に記述される部分は基本的なフローを記述している。 + これらは基本的な枠組を示すものであるため、 + $CurProc (C でいえば struct *curproc にあたるもの) + を受け渡す、構造化プログラミング的な書き方をしている。 + <PRE> + + </PRE> + +<P> <EM>モジュール → モジュール </EM> + <BR> + しかし、そのひとつ下の層、そしてさらにその下では、 + 再利用性とポリモーフィズムに傾いた方がよさそうにおもえる。 + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/menubar.ja.html b/fml/doc/menubar.ja.html new file mode 100644 index 00000000..222b2889 --- /dev/null +++ b/fml/doc/menubar.ja.html @@ -0,0 +1,79 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +fml5 homepage menubar +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + + +<P> ある程度形のあるもの +<UL> + <LI> + <A HREF="../libexec/boot.ja.html" TARGET="right"> + ブートの仕方 + </A> +</UL> + +<P> 構想 +<UL> + <LI> + <A HREF="objects.ja.html" TARGET="right"> + 目的 + </A> + + <LI> + <A HREF="refactoring.ja.html" TARGET="right"> + アイデアのまとめ + </A> + + <LI> + <A HREF="components.ja.html" TARGET="right"> + コンポーネント指向 + </A> + + <LI> + <A HREF="architecture.html" TARGET="right"> + アーキテクチャ + </A> + + <LI> + <A HREF="../curproc.ja.html" TARGET="right"> + プロセス構造体 + </A> + + <LI> + <A HREF="interfaces.ja.html" TARGET="right"> + モジュール間インターフェイス案 + </A> + + <LI> + モジュール例 + <BR> + <A HREF="../lib/fml5/FML/index.ja.html" TARGET="right"> + FML::* クラス + </A> + <BR> + <A HREF="terms.ja.html" TARGET="right"> + FML::* 用語集 + </A> + + <LI> + <A HREF="dirhier.ja.html" TARGET="right"> + ディレクトリの階層構造 + </A> + + <LI> + <A HREF="releng.ja.html" TARGET="right"> + リリースエンジニアリング + </A> +</UL> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/modules.ja.html b/fml/doc/modules.ja.html new file mode 100644 index 00000000..83819912 --- /dev/null +++ b/fml/doc/modules.ja.html @@ -0,0 +1,51 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> + ... title ... +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + + +<P>今あるモジュールの説明 + +<TABLE BORDER=4> + <TR> + <TD> モジュール + <TD> 説明 + + + <TR> + <TD> FML::LoadConfig + <TD> 設定ファイルを読み込みハッシュに入れる。 + + + <TR> + <TD> FML::File + <TD> + ログファイルに記録するインタフェイス。 + 将来は syslog(3) へとばすことができるとなおよい。 + まず間違いなくほとんど全てのルーティンが + use するべきもの。これをしないと Log() が + 使えないから :-) + + <TR> + <TD> FML::Date + <TD> + いろいろな型の日付関連のフォーマッティングのため + + <TR> + <TD> FML::String + <TD> 文字列操作関数へのインターフェイス + +</TABLE> + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/objects.ja.html b/fml/doc/objects.ja.html new file mode 100644 index 00000000..873da858 --- /dev/null +++ b/fml/doc/objects.ja.html @@ -0,0 +1,62 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +目的 +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<P> fml5 プロジェクトの目的 + +<UL> + <LI> <A HREF="refactoring.ja.html">再構想 (refactoring)</A> + <LI> <A HREF="releng.ja.html">新リリースエンジニアリング</A> + <LI> 設定ファイルとメニュープログラムの負荷を少なく + <LI> 乖離層 + <UL> + <LI> バージョンアップを簡単にできるように + <LI> CPAN モジュール使いまくり + <BR> + (ただし、できるだけ直接使うより、 + 一層被せておくほうがよい) + <LI> 3rd party 用ディレクトリ + </UL> + + <LI> 統一化されたメンバーリストなどへのアクセスをできるだけ抽象化する。 + <UL> + <LI> ファイル + <LI> /etc/group + <LI> NIS + <LI> SQL + <LI> LDAP + <LI> SSRP (?) + </UL> + 実際には効率の問題もあり、 + あらゆる抽象化は重たくなってしまう。そこで、 + 全部は抽象化できずに SMTP ライブラリにも一部いってしまうが、 + この二箇所におしこめること。 + + <LI> CUI (makefml) インターフェイスおよび CGI インターフェイス + <BR> + これは従来通りのもの。 + <BR> + ただしより統合化され、 + よりメニューなどが書きやすいものであるように + + <LI> IPv4/IPv6 ready +</UL> + +<!-- =================================================================== --> + +<CENTER> +アーキテクチャア・イメージ +<IMG SRC="architecture.gif" ALIGH=CENTER> +</CENTER> + +</BODY> +</HTML> diff --git a/fml/doc/refactoring.ja.html b/fml/doc/refactoring.ja.html new file mode 100644 index 00000000..a7ec77c4 --- /dev/null +++ b/fml/doc/refactoring.ja.html @@ -0,0 +1,137 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +fml5 [ fml リファクトリング プロジェクト (Refactroing Project) ] +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> + +<CENTER> +fml5 [ fml リファクトリング プロジェクト (Refactroing Project) ] +</CENTER> + +<P> いくつかのアイデア + +<TABLE BORDER=4> + <TR> + <TD> status + <TD> <EM>項目</EM> + <TD> 備考 + + <TR> + <TD> + <TD> <EM>ライセンス</EM> + <BR> + ライセンスを Perl 準拠へ変更する + <TD> + + <TR> + <TD> + <TD> <EM>イメージ/モティーフ</EM> + <BR> + fml4 から fml5 へは、sendmail から postfix への移行のようなイメージで + <BR> + 最低限の config.ph コンバータは用意する。 + + <TR> + <TD> + <TD> + <EM> メインプログラムの wrapper (乖離層) </EM> + バージョン管理やデバッグを簡単にするための乖離層 + <PRE> + fml.pl --- /etc/fml/wrapper.cf ---> fml/$VERSION/libexec/distribute + </PRE> + + <TR> + <TD> + <TD> + <EM>再利用性</EM> + <BR> + 自主開発はできるだけ避ける。 + <BR> + 可能な限りあらゆる CPAN モジュールなどを使う。 + また、利用する場合にも乖離層を設ける。 + <PRE> + FML::モジュール → 乖離層 → CPAN/モジュール + </PRE> + <TD> + <A HREF="interfaces.ja.html">インターフェイス仕様</A> + + <TR> + <TD> + <TD> <EM>設定ファイル形式</EM> + <UL> + <LI> cf と config.ph を統合化する + <LI> 配列を表現できる形式 + <LI> メニュープログラムが楽できるフォーマットを + <LI> 原則として”設定ファイル”という名のものは + どれも同じフォーマットとする。 + </UL> + <TD> + + <TR> + <TD> + <TD> + <EM> 変数名ルールの統一 </EM> + <UL> + <LI> USE_機能 + <LI> 機能_TYPE + <LI> 機能_ATTRIBUTES + </UL> + <BR> + ”USE_ほえ”および”ほえ_TYPE”形式か? + また、NOT_USE などは禁止する( default_config に書くこと)。 + <BR> + attribute にあたるものが + 群れになってしまうのはしょうがない。しかし、 + 配列表現が可能なため、現在の ifdef の群れで表現する + ようなことが少なくなるはず。 + + <TR> + <TD> + <TD> + <EM> 関数名ルールの統一 </EM> + <BR> + main:: スペースに出てくるものは従来通り X11 風準拠に。 + <BR> + メソッドは他のモジュールにあるようなそれっぽい小文字の名前をつける。 + <BR> + lisp 的要素を廃止する。 + <BR> + 参考文献 Perl Cookbook として、 + そこにあるようなシンタックス風を推奨する?例: + <PRE> + MemberP() -> IsMember() + </PRE> + + + <TR> + <TD> + <TD> + <EM> queue manager </EM> + <BR> + 再送処理のため (e.g. smtpfeed ) + + <TR> + <TD> + <TD> + <EM> tools </EM> + <BR> + BSD make を使わない。 + <BR> + C 言語ではないので、autoconf は特には必要ないと思う。 + しかしながら configure という名前のスクリプトを(フェイクでも) + 用意することはよいことかもしれない。 + そのスクリプトは例えば + IPv6 ready か否かを決めるために使われるだろう。 + + +</TABLE> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/releng.ja.html b/fml/doc/releng.ja.html new file mode 100644 index 00000000..e011eae7 --- /dev/null +++ b/fml/doc/releng.ja.html @@ -0,0 +1,51 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> + ... title ... +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<P> + アーキテクトでも、デベロッパーに偏ってもいけない。 + 抽象化に萌過ぎても、オブジェクト指向分析に燃え過ぎてもいけない。 + 中庸であり、一カ月単位でフィードバックしながら + プロジェクトの計画とコードレビューを行なうこと。 + + +<P> 月単位でのリリースエンジニアリングの原案 + +<TABLE> + <TR> + <TD> 最初の 4〜5日 + <TD> 計画を練り直す。 + <BR> + リリースエンジニアリングプロセス中の + 20 %程度はこの計画に費やすこと + + <TR> + <TD> 2〜3 週間 + <TD> コードを書く + + <TR> + <TD> 最終週 + <TD> ドキュメントを見直す、およびコードレビュー + + <TR> + <TD> 月の切れ目 + <TD> まぁまぁ大丈夫ぽい snapshot を出してみる。 + alpha-0, + alpha-1, + alpha-2, ... + +</TABLE> + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/doc/terms.ja.html b/fml/doc/terms.ja.html new file mode 100644 index 00000000..3e5dbb2c --- /dev/null +++ b/fml/doc/terms.ja.html @@ -0,0 +1,72 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +関数名および変数名に関連した用語のまとめ +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<CENTER> +関数名および変数名に関連した用語のまとめ +</CENTER> + +<TABLE BORDER=4> + <TR> + <TD> 用語/単語の省略形 + <TD> 説明 + + <TR> + <TD> STR + <TD> 文字列 ( string ) の略 + + <TR> + <TD> 日本語コードの略称 + <TD> JIS SJIS EUC などおなじみのもの… + + <TR> + <TD> 2 + <TD> + to と発音が一緒のため省略形としてよく使う。 + 類似品として 4 ( for の意味)もある + <BR> + 例: STR2EUC (STRing to EUC の略) + <BR> + <PRE> + use String qw(STR2EUC); + $euc_string = &STR2EUC($string); + </PRE> + + <TR> + <TD> 4 + <TD> for と発音が同じために用いる。 + <BR> + 例: まだなし + + <TR> + <TD> fh + <TD> ファイルハンドラ( file handler ) + + <TR> + <TD> dh + <TD> ディレクトリハンドラ( directory handler ) + + <TR> + <TD> _なになに + <TD> 慣習的にパッケージ、クラス、オブジェクト内部で使う + 変数や関数名に _ ではじまるキーワードを使う。 + + <TR> + <TD> CurProc もしくは curproc + <TD> ”current process 構造体”の略 + + +</TABLE> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/etc/config.cf b/fml/etc/config.cf new file mode 100644 index 00000000..b214c882 --- /dev/null +++ b/fml/etc/config.cf @@ -0,0 +1,64 @@ +=head1 configurations + +DOMAIN = fml.org +FQDN = ahodori.fml.org + +ml_home_dir = /var/spool/ml/elena + + +=head2 ロック + +lock_dir = $ml_home_dir/var/lock + +lock_file = $lock_dir/simplelock + +lock_type = flock + + +=head2 アクセス制御 + +# 配列表現には本質的に + +# 現在の PERMIT_POST_FROM と REJECT_ADDR をがったいしたもの +POST_RESTRICTIONS = reject_system_accounts + permit_members_only + reject + +# 現在の PERMIT_COMMAND_FROM と REJECT_ADDR をがったいしたもの +COMMAND_RESTRICTIONS = reject_system_accounts + permit_members_only + reject + +member_maps = file:$ml_home_dir/members + +#recipient_maps = file:w/members +# unix.group:fml +recipient_maps = file:w/members + +recipient_limit = 2 + +mta = [::1]:25 + 127.0.0.1:25 + 192.168.148.193:25 + 192.168.148.194:25 + +=head2 すぷーる + +sequence_file = $ml_home_dir/seq + +use_spool = yes + +spool_dir = $ml_home_dir/spool + +spool_type = plane + + +=head1 hooks +=cut + +# 現在の LOCAL_CONFIG で別れ目になる行 +# HOOK + +print "run hooks here.\n"; + +1; diff --git a/fml/etc/default_config.cf b/fml/etc/default_config.cf new file mode 100644 index 00000000..01769ee2 --- /dev/null +++ b/fml/etc/default_config.cf @@ -0,0 +1,24 @@ +### +### basic logging +### +# logfile +logfile = /tmp/log + + +### +### Section: Header Manipulations +### + +header_checks = validate_message_id + verify_unique_x_ml_info + verify_unique_list_post + +header_rewrite_rules = add_rfc2369 + + + + +### +### default_config.cf file ends here. +### +=cut diff --git a/fml/etc/defaults/acl.cf.ja b/fml/etc/defaults/acl.cf.ja new file mode 100644 index 00000000..1dec98b0 --- /dev/null +++ b/fml/etc/defaults/acl.cf.ja @@ -0,0 +1,27 @@ +=head2 アクセス制御 + +# 配列表現には本質的に + +# 現在の PERMIT_POST_FROM と REJECT_ADDR をがったいしたもの +POST_RESTRICTIONS = reject_system_accounts + permit_members_only + reject + +# 現在の PERMIT_COMMAND_FROM と REJECT_ADDR をがったいしたもの +COMMAND_RESTRICTIONS = reject_system_accounts + permit_members_only + reject + +member_maps = file:$ml_home_dir/members + +#recipient_maps = file:w/members +# unix.group:fml +recipient_maps = file:w/members + +recipient_limit = 2 + +mta = [::1]:25 + 127.0.0.1:25 + 192.168.148.193:25 + 192.168.148.194:25 + diff --git a/fml/etc/defaults/basic.cf.ja b/fml/etc/defaults/basic.cf.ja new file mode 100644 index 00000000..2b4eb6ea --- /dev/null +++ b/fml/etc/defaults/basic.cf.ja @@ -0,0 +1,8 @@ +=head1 configurations + +DOMAIN = fml.org +FQDN = ahodori.fml.org + +ml_home_dir = /var/spool/ml/elena + + diff --git a/fml/etc/defaults/config.cf.ja b/fml/etc/defaults/config.cf.ja new file mode 100644 index 00000000..8ada6bbb --- /dev/null +++ b/fml/etc/defaults/config.cf.ja @@ -0,0 +1,11 @@ +# import *.cf here + +=head1 hooks +=cut + +# 現在の LOCAL_CONFIG で別れ目になる行 +# HOOK + +print "run hooks here.\n"; + +1; diff --git a/fml/etc/defaults/lock.cf.ja b/fml/etc/defaults/lock.cf.ja new file mode 100644 index 00000000..c7ee39d0 --- /dev/null +++ b/fml/etc/defaults/lock.cf.ja @@ -0,0 +1,8 @@ +=head2 ロック + +lock_dir = $ml_home_dir/var/lock + +lock_file = $lock_dir/simplelock + +lock_type = flock + diff --git a/fml/etc/defaults/spool.cf.ja b/fml/etc/defaults/spool.cf.ja new file mode 100644 index 00000000..92f744fa --- /dev/null +++ b/fml/etc/defaults/spool.cf.ja @@ -0,0 +1,10 @@ + +=head2 すぷーる + +sequence_file = $ml_home_dir/seq + +use_spool = yes + +spool_dir = $ml_home_dir/spool + +spool_type = plane diff --git a/fml/etc/main.cf b/fml/etc/main.cf new file mode 100644 index 00000000..fc2961ec --- /dev/null +++ b/fml/etc/main.cf @@ -0,0 +1,25 @@ +version = 5.000 + +config_dir = /etc/fml + +prefix_dir = /usr/local + +libexec_dir = $prefix_dir/libexec/fml/$version + +lib_dir = $prefix_dir/lib/fml/$version/3RDPARTY + $prefix_dir/lib/fml/$version/fml5 + $prefix_dir/lib/fml/$version/CPAN + $prefix_dir/lib/fml/$version + +# site local +local_lib_dir = $prefix_dir/lib/fml/site_local + + +# default_config.cf +default_config = $config_dir/defaults/$version/default_config.cf + +# default domain +default_domain = fml.org + +# domain specific configurations +domain_default_config = $config_dir/domains/__domain__/config.cf diff --git a/fml/index.ja.html b/fml/index.ja.html new file mode 100644 index 00000000..b42a823f --- /dev/null +++ b/fml/index.ja.html @@ -0,0 +1,21 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +fml 5 project home page +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<FRAMESET COLS="25%,*" BORDERSPACING=0 FRAMEBORDER=0 BODER=0 BORDERCOLOR="#E6E6FA"> + <FRAME SRC="doc/menubar.ja.html" NAME="left"> + <FRAME SRC="doc/objects.ja.html" NAME="right"> + <NOFRAMES> + <A HREF="doc/index.ja.html"> + fml5 project doc/ + </A> + (if your browser not support frameset). + </NOFRAMES> +</FRAMESET> +</HTML> diff --git a/fml/lib/FML/.listup b/fml/lib/FML/.listup new file mode 100755 index 00000000..c36f01a0 --- /dev/null +++ b/fml/lib/FML/.listup @@ -0,0 +1,6 @@ +#!/bin/sh + +find . |\ +grep pm |\ +sed 's@./@@' |\ +awk '{print "<LI><A HREF=" $0 ">FML::" $0 "</A>"}' diff --git a/fml/lib/FML/@template b/fml/lib/FML/@template new file mode 100644 index 00000000..81d97312 --- /dev/null +++ b/fml/lib/FML/@template @@ -0,0 +1,4 @@ +# Descriptions: +# Arguments: $self $args +# Side Effects: +# Return Value: none diff --git a/fml/lib/FML/Article.pm b/fml/lib/FML/Article.pm new file mode 100644 index 00000000..aa241e91 --- /dev/null +++ b/fml/lib/FML/Article.pm @@ -0,0 +1,174 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::Article; + +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +require Exporter; + + +# Descriptions: constructor +# Arguments: $self $curproc +# Side Effects: none +# Return Value: FML::Article object +sub new +{ + my ($self, $curproc) = @_; + my ($type) = ref($self) || $self; + my $me = {}; + bless $me, $type; + + $me->_setup_article_template($curproc); + $me->{ curproc } = $curproc; + + return $me; +} + + +# Descriptions: prepare article template to distribute +# Arguments: $self $curproc +# Side Effects: build $curproc->{ article } +# Return Value: none +sub _setup_article_template +{ + my ($self, $curproc) = @_; + + # setup article to distribute + my $msg = $curproc->{'incoming_mail'}; + + # create an article template by duplicating the incoming message + $curproc->{ article }->{ header } = $msg->{'header'}->dup(); + $curproc->{ article }->{ body } = $msg->{'body'}; + + use FML::Log qw(Log); + Log( ref( $curproc->{ article }->{ header } ) ); + + # initialize the header object + use FML::Header; + $curproc->{'article'}->{'header'}->check; + $curproc->{'article'}->{'header'}->rewrite; +} + + +# Descriptions: determine article id (sequence number) +# Arguments: $self +# Side Effects: record the current article sequence number +# Return Value: number (sequence identifier) +sub gen_article_id +{ + my ($self) = @_; + my $curproc = $self->{ curproc }; + my $config = $curproc->{ config }; + my $seq_file = $config->{ sequence_file }; + my $id = 0; + + use IO::File::Atomic; + my ($rh, $wh) = IO::File::Atomic->rw_open($seq_file); + + # read the current sequence number + if (defined $rh) { + $id = $rh->getline; + $rh->close; + } + + # increment $id. The incremented number is the current article ID. + $id++; + + # save $id + print $wh $id, "\n"; + $wh->close; + + # return value + $curproc->{ pcb }->{ article_id } = $id; + $id; +} + + +sub id +{ + my ($self) = @_; + my $curproc = $self->{ curproc }; + return $curproc->{ pcb }->{ article_id }; +} + + +# Descriptions: spool in the article +# Arguments: $self $curproc +# Side Effects: +# Return Value: none +sub spool_in +{ + my ($self, $id) = @_; + + # configurations + my $curproc = $self->{ curproc }; + my $config = $curproc->{ config }; + my $spool_dir = $config->{ spool_dir }; + + print "yes: ", $config->yes( 'use_spool' ) , "\n"; + + if ( $config->yes( 'use_spool' ) ) { + unless (-d $spool_dir) { + use File::Path; + mkpath( $spool_dir, 0, 0700 ); + } + + my $file = $spool_dir . "/" . $id; + use FileHandle; + my $fh = new FileHandle; + $fh->open($file, "w"); + if (defined $fh) { + $curproc->{ article }->{ header }->print($fh); + print $fh "\n"; + print $fh ${ $curproc->{ article }->{ body } }; + $fh->close; + } + } + else { + Log("not spool"); + } +} + + + +=head1 NAME + +FML::Article - article manipulation components + +=head1 SYNOPSIS + +... not yet documented ... + +=head1 DESCRIPTION + +... not yet documented ... + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +FML::Article.pm appeared in fml5. + +=cut + + + +1; diff --git a/fml/lib/FML/Auth/Confirm.pm b/fml/lib/FML/Auth/Confirm.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Auth/Confirm.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Auth/MailFromAuth.pm b/fml/lib/FML/Auth/MailFromAuth.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Auth/MailFromAuth.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Auth/Moderate.pm b/fml/lib/FML/Auth/Moderate.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Auth/Moderate.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Auth/PGPAuth.pm b/fml/lib/FML/Auth/PGPAuth.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Auth/PGPAuth.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Body.pm b/fml/lib/FML/Body.pm new file mode 100644 index 00000000..74bd5893 --- /dev/null +++ b/fml/lib/FML/Body.pm @@ -0,0 +1,81 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::Body; + +=head1 NAME + +FML::Body - mail body manipulators + +=head1 SYNOPSIS + +... not yet documentd ... + +=head1 DESCRIPTION + +... not yet documentd ... + +... not yet documentd ... + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +FML::Body.pm appeared in fml5. + +=cut + +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +require Exporter; +@ISA = qw(Exporter); + + +sub new +{ + my ($self, $r_body) = @_; + my ($type) = ref($self) || $self; + return bless $r_body, $type; +} + + +sub size +{ + my ($self) = @_; + length($self); +} + + +sub is_empty +{ + my ($self) = @_; + my $size = $self->size; + + if ($size == 0) { return 1;} + if ($size <= 8) { + if ($self =~ /^\s*$/) { return 1;} + } + + # false + return 0; +} + + +1; diff --git a/fml/lib/FML/CGI/Functions.pm b/fml/lib/FML/CGI/Functions.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/CGI/Functions.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Config.pm b/fml/lib/FML/Config.pm new file mode 100644 index 00000000..14cf4114 --- /dev/null +++ b/fml/lib/FML/Config.pm @@ -0,0 +1,275 @@ +#-*- perl -*- +# Copyright (C) 2000 Ken'ichi Fukamachi +# +# $Id$ +# $FML$ # 注意: cvs のタグを $FML$ にする +# + +package FML::Config; + +use vars qw(%_fml_config); +use strict; +use Carp; + + +sub new +{ + my ($self) = @_; + my $me = \%_fml_config; + return bless $me, $self; +} + + +sub dump_variables +{ + my ($k, $v); + while (($k, $v) = each %_fml_config) { + print "${k}: $v\n"; + } +} + + +sub _log +{ + my ($self, $msg) = @_; + $self->{ _error_message } = $msg; +} + + +sub error +{ + my ($self) = @_; + $self->{ _error_message }; +} + + +sub get +{ + my ($self, $key) = @_; + $self->{ $key }; +} + + +sub set +{ + my ($self, $key, $value) = @_; + $self->{ $key } = $value; +} + + +sub overload +{ + my ($self, $file) = @_; + $self->load_file($file); +} + + +sub load_file +{ + my ($self, $file) = @_; + my (@_fml_config) = (); + + # open the $file by using FileHandle.pm + use FileHandle; + my $fh = new FileHandle $file; + + if (defined $fh) { + my ($key, $value, $comment); + + while (<$fh>) { + # end of postfix format + last if /^=cut/; + + # here we go + chop; + + # reset { key => value } + if (/^\s*$/) { + if ($key) { + $_fml_config{$key} = $value; + } + + undef $key; undef $value; undef $comment; + } + + # ignore special keywords of pod formats + next if /^=/; + + if (/^([A-Za-z]\w+)\s+=\s*(.*)/) { + ($key, $value) = ($1, $2); + + # record the keyword order + push(@_fml_config, $key); + } + elsif (/^\s+(.*)/ && $key) { + $value .= " ".$1; + } + else { + $comment .= $_; + } + } + $fh->close; + } + else { + $self->_log("Error: cannot open $file"); + } + + # expand variable name e.g. $dir/xxx -> /var/spool/ml/elena/xxx + _expand_variables( \%_fml_config , \@_fml_config ); +} + + +sub _expand_variables +{ + my ($config, $order) = @_; + my $max = 0; + my $org = ''; + + # expand $xxx style variables + no strict 'refs'; + for my $x ( @$order ) { $$x = $config->{ $x };} + + KEY: + for my $x ( @$order ) { + next KEY unless $config->{ $x } =~ /\$/o; + + $max = 0; + + # we need a loop to expand nested variables, for example, + # a = $x/y and b = $a/c/0 + EXPAND_LOOP: + while ($max++ < 16) { + $org = $config->{ $x }; + $config->{ $x } =~ s/\$([a-z_]+)/${$1}/g; + last EXPAND_LOOP if $org eq $config->{ $x }; + } + } +} + + +sub yes +{ + my ($self, $key) = @_; + $_fml_config{$key} eq 'yes' ? 1 : 0; +} + + +sub no +{ + my ($self, $key) = @_; + $_fml_config{$key} eq 'no' ? 1 : 0; +} + + +sub FETCH +{ + my ($self, $key) = @_; + return $_fml_config{$key}; +} + + +sub STORE +{ + my ($self, $key, $value) = @_; + $_fml_config{$key} = $value; +} + + +sub DELETE +{ + my ($self, $key) = @_; + delete $_fml_config{$key}; +} + + +sub CLEAR +{ + my ($self) = @_; + undef %_fml_config; +} + + +=head1 NAME + +FML::Config -- fml5 configuration holding object + +=head1 SYNOPSIS + + $config = new FML::Config; + + # get the current value + $config->{recipient_maps}; + + # set the new value + $config->{recipient_maps} = 'mysql:toymodel'; + + # function style to get/set the value for the key "recipient_maps" + $config->get('recipient_maps'); + $config->set('recipient_maps', 'mysql:toymodel'); + + +=head1 DESCRIPTION + + +=head1 METHOD + +=item Init( ref_to_curproc ) + +special method only used in the initialization phase. +This method binds $curproc and the %_fml_config memory area. + +=item load_file( filename ) + +read the configuration file, split key and value and set them to +%_fml_config. + +=item get( key ) + +=item set( key, value ) + +=item dump_variables() + +show all {key => value} for debug. + +=head1 DATA STRUCTURE + +C<%CurProc> holds the CURrent PROCess information. +The hash holds several references to other data structures, +which are mainly hashes. + + $CurProc = { + # configurations + config => { + key => value, + }, + + # emulator mode though fml mode in fact + emulator => $emulator, + + # struct incoming_mail holds the mail input from STDIN. + incoming_mail => $r_msg, + article => $r_msg, + }; + +We use r_variable_name syntax where "r_" implies "reference to" here. +C<$r_msg> is the reference to "struct message". + + $r_msg = { + r_header => \$header, + r_body => \$body, + info => { + mime-version => 1.0, + content-type => { + charset => ISO-2022-JP, + }, + size => $size, + }, + }; + +where $header is the object returned by Mail::Header class (CPAN +module) and the $body is the reference to the mail body region on +memory which locates within FML::Parse name space. + +=cut + +1; diff --git a/fml/lib/FML/Credential.pm b/fml/lib/FML/Credential.pm new file mode 100644 index 00000000..74a6bf99 --- /dev/null +++ b/fml/lib/FML/Credential.pm @@ -0,0 +1,82 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::Credential; + +use strict; +use vars qw(%Credential @ISA @EXPORT @EXPORT_OK); +use Carp; + +require Exporter; +@ISA = qw(Exporter); + + +sub new +{ + my ($self) = @_; + my ($type) = ref($self) || $self; + my $me = \%Credential; + return bless $me, $type; +} + + +sub is_member +{ + 1; +} + + +sub get +{ + my ($self, $key) = @_; + $self->{ $key }; +} + + +sub set +{ + my ($self, $key, $value) = @_; + $self->{ $key } = $value; +} + + +=head1 NAME + +FML::Credential.pm - what is this + + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +FML::Credential.pm appeared in fml5. + +=cut + + +1; diff --git a/fml/lib/FML/Date.pm b/fml/lib/FML/Date.pm new file mode 100644 index 00000000..028d02fe --- /dev/null +++ b/fml/lib/FML/Date.pm @@ -0,0 +1,149 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# +# $Id$ +# $FML$ +# + +package FML::Date; + +=head1 NAME + +FML::Date - utilities for date and time + +=head1 SYNOPSIS + + + use FML::Date; + $date = new FML::Date time; + + # get the date in $style format + $date->{ logfile_style } + $date->logfile_style + +=head1 DESCRIPTION + +The style you use follows: + + style example + ---------------------------------------------- + logfile_style 01/01/07 21:06:19 + mail_header_style Sun, 7 Jan 2001 21:06:19 +0900 + YYYYMMDD 20010107 + current_time 200101072106 + precise_current_time 20010107210619 + + +=head1 METHOD + +You can also method like $date->$style() style. + +=item logfile_style() + +=item mail_header_style() + +=item YYYYMMDD() + +=item current_time() + +=item precise_current_time() + +=cut + +require Exporter; +use vars qw($TimeZone); +@ISA = qw(Exporter); + +use strict; +use Carp; + + +sub new +{ + my ($class, $time) = @_; + my $type = _date($time); + return bless $type, $class; +} + + +sub _date +{ + my ($time) = @_; + my ($date) = {}; + + # use the current UTC if $time is not given. + $time ||= time; + + my @WDay = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); + my @Month = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); + + $TimeZone ||= '+0900'; + my ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[0..6]; + + $date->{'logfile_style'} = + sprintf("%02d/%02d/%02d %02d:%02d:%02d", + ($year % 100), $mon + 1, $mday, $hour, $min, $sec); + + $date->{'mail_header_style'} = + sprintf("%s, %d %s %d %02d:%02d:%02d %s", + $WDay[$wday], $mday, $Month[$mon], + 1900 + $year, $hour, $min, $sec, $TimeZone); + + $date->{'YYYYMMDD'} = + sprintf("%04d%02d%02d", 1900 + $year, $mon + 1, $mday); + + $date->{'current_time'} = + sprintf("%04d%02d%02d%02d%02d", + 1900 + $year, $mon + 1, $mday, $hour, $min); + + $date->{'precise_current_time'} = + sprintf("%04d%02d%02d%02d%02d%02d", + 1900 + $year, $mon + 1, $mday, $hour, $min, $sec); + + return $date; +} + + +sub logfile_style +{ + my ($self, $time) = @_; + my $p = _date($time || time); + $p->{'logfile_style'}; +} + + +sub mail_header_style +{ + my ($self, $time) = @_; + my $p = _date($time || time); + $p->{'mail_header_style'}; +} + + +sub YYYYMMDD +{ + my ($self, $time) = @_; + my $p = _date($time || time); + $p->{'YYYYMMDD'}; +} + + +sub current_time +{ + my ($self, $time) = @_; + my $p = _date($time || time); + $p->{'current_time'}; +} + + +sub precise_current_time +{ + my ($self, $time) = @_; + my $p = _date($time || time); + $p->{'precise_current_time'}; +} + + +1; diff --git a/fml/lib/FML/Debug.pm b/fml/lib/FML/Debug.pm new file mode 100644 index 00000000..1d17c3a5 --- /dev/null +++ b/fml/lib/FML/Debug.pm @@ -0,0 +1,46 @@ +#-*- perl -*- +# +# Copyright (C) 2000-2001 Ken'ichi Fukamachi +# All rights reserved. +# +# $FML$ +# + +package FML::Debug; + +=head1 NAME + +FML::Debug -- debug utilities + +=head1 SYNOPSIS + + use FML::Debug; + FML::Debug->show_structure( $variable ); + +=head1 METHOD + +=item show_structure() + +It shows the data structure for the given variable. + +=cut + + +sub new +{ + my ($self) = @_; + my ($type) = ref($self) || $self; + my $me = {}; + bless $me, $self, +} + + +sub show_structure +{ + my ($class, $ref) = @_; + use Data::Dumper; + print Dumper( $ref ); +} + + +1; diff --git a/fml/lib/FML/Encrypt/Crypt.pm b/fml/lib/FML/Encrypt/Crypt.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Encrypt/Crypt.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Encrypt/GPG1.pm b/fml/lib/FML/Encrypt/GPG1.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Encrypt/GPG1.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Encrypt/PGP2.pm b/fml/lib/FML/Encrypt/PGP2.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Encrypt/PGP2.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Encrypt/PGP5.pm b/fml/lib/FML/Encrypt/PGP5.pm new file mode 100644 index 00000000..c5e9e29d --- /dev/null +++ b/fml/lib/FML/Encrypt/PGP5.pm @@ -0,0 +1,31 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 AUTHOR + +=head1 HISTORY + +=cut + +use strict; +use Carp; + + +1; diff --git a/fml/lib/FML/Header.pm b/fml/lib/FML/Header.pm new file mode 100644 index 00000000..37875a87 --- /dev/null +++ b/fml/lib/FML/Header.pm @@ -0,0 +1,91 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::Header; + +=head1 NAME + +FML::Header - header manipulators + +=head1 SYNOPSIS + + $header = use FML::Header $r_header; + $header->rewrite; + +(... not yet mature ...) + + +=head1 DESCRIPTION + +=head1 METHOD + +=item rewrite + +=item check + + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +FML::Header.pm appeared in fml5. + +=cut + +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD); +use Carp; +use Mail::Header; +use FML::Log qw(Log); + +require Exporter; +@ISA = qw(Exporter Mail::Header); + + +sub new +{ + my ($self, $args) = @_; + $self->SUPER::new($args); +} + +sub DESTROY {} + +sub AUTOLOAD +{ + my ($self, $args) = @_; + Log("Error: $AUTOLOAD is not defined"); +} + + +sub rewrite +{ + my ($self) = @_; +} + + +sub check +{ + my ($self) = @_; + + print "From: ", $self->get('from'); + print "Message-Id: ", $self->get('message-id'); +} + + +1; diff --git a/fml/lib/FML/Lock.pm b/fml/lib/FML/Lock.pm new file mode 100644 index 00000000..f627c4c4 --- /dev/null +++ b/fml/lib/FML/Lock.pm @@ -0,0 +1,174 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# +# $Id$ +# $FML$ +# + +package FML::Lock; + +use vars qw(%LockedFileHandle %FileIsLocked @ISA $Error); +use strict; +use Carp; + +require Exporter; +@ISA = qw(Exporter); + + +# constants +use POSIX qw(EAGAIN ENOENT EEXIST O_EXCL O_CREAT O_RDONLY O_WRONLY); +sub LOCK_SH {1;} +sub LOCK_EX {2;} +sub LOCK_NB {4;} +sub LOCK_UN {8;} + + +sub new +{ + my ($self) = @_; + my ($type) = ref($self) || $self; + my $me = {}; + return bless $me, $type; +} + + +sub _error_why +{ + my $msg = @_; + $Error = $msg; +} + + +sub error +{ + my ($self) = @_; + $Error; +} + + +sub lock +{ + my ($self, $args) = @_; + + my $file = $args->{ file }; + _simple_flock($file); +} + + +sub unlock +{ + my ($self, $args) = @_; + + my $file = $args->{ file }; + _simple_funlock($file); +} + + + +sub _simple_flock +{ + my ($file) = @_; + + use FileHandle; + my $fh = new FileHandle $file; + + if (defined $fh) { + $LockedFileHandle{ $file } = $fh; + + my $r = 0; # return value + eval q{ + $r = flock($fh, &LOCK_EX); + }; + _error_why($@) if $@; + + if ($r) { + $FileIsLocked{ $file } = 1; + return 1; + } + } + else { + _error_why("cannot open $file"); + } + + return 0; +} + + +sub _simple_funlock +{ + my ($file) = @_; + + return 0 unless $FileIsLocked{ $file }; + return 0 unless $LockedFileHandle{ $file }; + + my $fh = $LockedFileHandle{ $file }; + + my $r = 0; # return value + eval q{ + $r = flock($fh, &LOCK_UN); + }; + _error_why($@) if $@; + + if ($r) { + delete $FileIsLocked{ $file }; + delete $LockedFileHandle{ $file }; + return 1; + } + + return 0; +} + + +=head1 NAME + +FML::Lock.pm - several interfaces to open several files + + +=head1 SYNOPSIS + +To import Lock(), + + use FML::Lock qw(Lock); + &Lock( $Lock_message ); + + +=head1 DESCRIPTION + +FML::Lock.pm contains several interfaces for several files, +for example, Lockfiles, sysLock() (not yet implemented). + +=item Lock( $message ) + +The argument is the message to Lock. + + + +=head1 SEE ALSO + +L<FML::Date>, +L<FML::Config>, +L<FML::BaseSystem>, +L<FileHandle> + +=head1 AUTHOR + +Ken'ichi Fukamachi <F<fukachan@fml.org>> + + +=head1 COPYRIGHT + +Copyright (C) 2000 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + + +=head1 HISTORY + +FML::Lock.pm appeared in fml5. + + +=cut + +1; diff --git a/fml/lib/FML/Log.pm b/fml/lib/FML/Log.pm new file mode 100644 index 00000000..b6e805a2 --- /dev/null +++ b/fml/lib/FML/Log.pm @@ -0,0 +1,118 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# +# $Id$ +# $FML$ +# + +package FML::Log; +require Exporter; + +@ISA = qw(Exporter); +@EXPORT = qw(Log); +@EXPORT_OK = qw(Log); + +use strict; +use Carp; +use FML::Config; +use FML::Date; + + +# usage: &Log( message, { logfile => $logfile } ); +# return: none +# +sub Log +{ + my ($mesg, $args) = @_; + my $config = new FML::Config; + + # parse arguments + my $logfile = $args->{ logfile }; + my $facility = $args->{ facility }; + my $level = $args->{ level }; + + # invalid calling + $mesg || return undef ; + + # reference to "date" object + my $rdate = new FML::Date; + + # open the $file by using FileHandle.pm + use FileHandle; + + # When the second argument is not defined, use the default logfile. + my $file = $logfile || $config->{ logfile } || '/dev/stderr'; + my $fh = new FileHandle ">> $file"; + + if (defined $fh) { + print $fh $rdate->{'logfile_style'}, " ", $mesg, "\n"; + } + else { + croak "Error: cannot open $file\n"; + } +} + + + +=head1 NAME + +FML::Log.pm - several interfaces to open several files + + +=head1 SYNOPSIS + +To import Log(), + + use FML::Log qw(Log); + &Log( $log_message ); + +or specify arguments in the hash reference + + use FML::Log qw(Log); + &Log( $log_message , { + logfile => $logfile, + facility => $facility, + level => $level, + }); + + +=head1 DESCRIPTION + +FML::Log.pm contains several interfaces for several files, +for example, logfiles, syslog() (not yet implemented). + +=item Log( $message ) + +The argument is the message to log. + + + +=head1 SEE ALSO + +L<FML::Date>, +L<FML::Config>, +L<FML::BaseSystem>, +L<FileHandle> + +=head1 AUTHOR + +Ken'ichi Fukamachi <F<fukachan@fml.org>> + + +=head1 COPYRIGHT + +Copyright (C) 2000 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + + +=head1 HISTORY + +FML::Log.pm appeared in fml5. + + +=cut + +1; diff --git a/fml/lib/FML/Makefile b/fml/lib/FML/Makefile new file mode 100644 index 00000000..08cebdec --- /dev/null +++ b/fml/lib/FML/Makefile @@ -0,0 +1,4 @@ +all: anal + +anal: + @ find . | sort | grep -v CVS | sed 's@./@@' diff --git a/fml/lib/FML/Messages.pm b/fml/lib/FML/Messages.pm new file mode 100644 index 00000000..4ad94412 --- /dev/null +++ b/fml/lib/FML/Messages.pm @@ -0,0 +1,60 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::Messages; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +require Exporter; + + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=head1 AUTHOR + +=head1 COPYRIGHT + +Copyright (C) 2001 __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. + +=head1 HISTORY + +FML::__MODULE_NAME__.pm appeared in fml5. + +=cut + + +@ISA = qw(Exporter); +@EXPORT_OK = qw(Log); + + +sub new +{ + my ($self) = @_; + my ($type) = ref($self) || $self; + return bless {}, $type; +} + + +1; diff --git a/fml/lib/FML/Parse.pm b/fml/lib/FML/Parse.pm new file mode 100644 index 00000000..c57bd028 --- /dev/null +++ b/fml/lib/FML/Parse.pm @@ -0,0 +1,126 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::Parse; + + +=head1 NAME + +FML::Parse - parse the incoming message/mail to the header and body. + +=head1 SYNOPSIS + + ($r_header, $r_body) = new FML::Parse \*STDIN; + +=head1 DESCRIPTION + +FML::Parse parses the incoming mail. The target to parse is given the +argument os new() constructor. + +$r_header is the reference to the header object, which is returned by +Mail::Header class. $r_body is reference to the scalar mail body +variable, which is alloced in FML::Parse name space. + +=head1 METHOD + +=item new( fd ) + +C<fd> is the file handle. +Normally C<fd> is the handle for STDIN channel. + +=head1 SEE ALSO + +L<Mail::Header>, + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +FML::Parse.pm appeared in fml5. + +=cut + + +use lib qw(./lib/fml5 ./lib/CPAN ./lib/3RDPARTY ./lib); +use vars qw($InComingMessage); +use strict; +use Carp; +use FML::Header; +use FML::Body; +use FML::Config; +use FML::Log qw(Log); + + +sub new +{ + my ($self, $fd) = @_; + my $me = {}; + bless $me, $self; + + # return ( $ref_to_mail_header, $ref_to_mail_body, $error_code); + return $me->_parse($fd); +} + + +# return ( $ref_to_mail_header, $ref_to_mail_body, $error_code); +sub _parse +{ + my ($self, $fd) = @_; + my ($header, $header_size); + my $body_size; + my $total_buffer_size; + my ($p, $buf); + + # extract header and put it to $header + while ($p = sysread($fd, $_, 1024)) { + $total_buffer_size += $p; + $buf .= $_; + if (($p = index($buf, "\n\n", 0)) > 0) { + $header = substr($buf, 0, $p + 1); + $header_size = $p + 1; + $InComingMessage = substr($buf, $p + 2); + last; + } + } + + # extract mail body and put it to $FML::Parse::InComingMessage + while ($p = sysread($fd, $_, 1024)) { + $total_buffer_size += $p; + $InComingMessage .= $_; + } + + # read the message (mail body) from the incoming mail + $body_size = length($InComingMessage); + + Log("read total=$total_buffer_size header=$header_size body=$body_size"); + + my @h = split(/\n/, $header); + my $x; + for $x (@h) { $x .= "\n";} + + # extract each field from the header array + my $r_header = new FML::Header \@h, Modify => 0; + my $r_body = new FML::Body \$InComingMessage; + + # return ( $ref_to_mail_header, $ref_to_mail_body, $error_code); + return ($r_header, $r_body, 0); +} + + +1; diff --git a/fml/lib/FML/Process/Distribute.pm b/fml/lib/FML/Process/Distribute.pm new file mode 100644 index 00000000..397ce453 --- /dev/null +++ b/fml/lib/FML/Process/Distribute.pm @@ -0,0 +1,173 @@ +#!/usr/local/bin/perl -w +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. +# +# $FML$ +# + +package FML::Process::Distribute; + +use vars qw($debug @ISA @EXPORT @EXPORT_OK); +use strict; +use Carp; + +use FML::Process::Kernel; +use FML::Log qw(Log); +use FML::Config; + +require Exporter; +@ISA = qw(FML::Process::Kernel Exporter); + + +sub new +{ + my ($self, $args) = @_; + my $type = ref($self) || $self; + my $curproc = new FML::Process::Kernel $args; + return bless $curproc, $type; +} + + +sub prepare +{ + my ($self, $args) = @_; + $self->SUPER::prepare($args); +} + + +sub run +{ + my ($curproc, $args) = @_; + + $curproc->verify_sender_credential(); + + $curproc->lock(); + { + # user credential + my $cred = $curproc->{ credential }; + + # Q: the mail sender is a ML member? + if ($cred->is_member) { + # A: If so, we try to distribute this article. + _distribute( $curproc ); + } + } + $curproc->unlock(); +} + + +sub finish +{ + my ($curproc, $args) = @_; + + $curproc->inform_reply_messages(); +} + + +# $article->header_rewrite; +# $article->increment_id; +# $article->spool; +# distribute( $article ); +sub _distribute +{ + my ($curproc, $args) = @_; + + # use FML::Debug; FML::Debug->show_structure( $curproc ); # XXX DEBUG + + # create aritcle to distribute + use FML::Article; + my $article = new FML::Article $curproc; + + # spool in + my $id = $article->gen_article_id; + $article->spool_in( $id ); + + # distribute article + use Netlib::SMTP; + my $fp = sub { Log(@_);}; # pointer to the log function + my $service = new Netlib::SMTP { + log_function => $fp, + socket_timeout => 2, + }; + if ($service->error) { Log($service->error); return;} + + my $fileobj; + my $body = $curproc->{'article'}->{'body'}; + my $header = $curproc->{'article'}->{'header'}; + my $config = $curproc->{'config'}; + + my $ra_rcpt = [ + 'fukachan-1@elena.sapporo.iij.ad.jp', + 'fukachan-2@elena.sapporo.iij.ad.jp', + 'fukachan-3@elena.sapporo.iij.ad.jp', + 'fukachan-4@elena.sapporo.iij.ad.jp', + 'fukachan-5@elena.sapporo.iij.ad.jp', + ]; + + undef $ra_rcpt; + $ra_rcpt = [ 'fukachan@nuinui.net' ]; + + $service->deliver( + { + 'mta' => $config->{'mta'}, + + 'smtp_sender' => 'rudo', + 'recipient_array' => $ra_rcpt, + 'recipient_maps' => $config->{recipient_maps}, + 'recipient_limit' => $config->{recipient_limit}, + + 'header' => $header, + 'body' => $body, + }); + if ($service->error) { Log($service->error); return;} +} + + + +=head1 NAME + +distribute -- fml5 article distributer program. + +=head1 SYNOPSIS + + distribute [-d] config.cf + +=head1 DESCRIPTION + +libexec/fml.pl, the wrapper, executes this program. For example, The +incoming mail to elena@fml.org kicks off libexec/distribute via +libexec/fml.pl, whereas mail to elena-ctl@fml.org kicks off +libexec/command finally. + + incoming_mail => + elena@fml.org => fml.pl => libexec/distribute + elena-ctl@fml.org => fml.pl => libexec/command + elena-admin@fml.org => forwarded to administrator(s) + OR + => libexec/mead + +C<-d> + debug on. + +=head1 FLOW AROUND COMPONENTS + + | <=> FML::BaseSystem + | load configuration files + | start logging service + | + | STDIN => FML::Parse + | $CurProc->{'incoming_mail'} <= + | $CurProc->{'credential'} + | + | (lock) + | prepare article + | $CurProc->{'article'} is spooled in. + | $CurProc->{'article'} <=> Service::SMTP + | (unlock) + V + +=cut + +1; diff --git a/fml/lib/FML/Process/Kernel.pm b/fml/lib/FML/Process/Kernel.pm new file mode 100644 index 00000000..ce692a7f --- /dev/null +++ b/fml/lib/FML/Process/Kernel.pm @@ -0,0 +1,197 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::Process::Kernel; + +use strict; +use Carp; +use FML::Parse; +use FML::Header; +use FML::Config; +use FML::Log qw(Log); +use FML::Lock; +use FML::Messages; + + +sub new +{ + my ($self, $args) = @_; + my ($curproc) = {}; # alloc memory as the struct current_process. + + # bind FML::Config object to $curproc + use FML::Config; + $curproc->{ config } = new FML::Config; + + bless $curproc, $self; + + # initialize + my $main_config = $args->{ main_config }; + my $ra_cf = $args->{ cf_list }; + $curproc->load_config_files( $ra_cf ); + + return $curproc; +} + + +sub prepare +{ + my ($curproc, $args) = @_; + $curproc->parse_incoming_mail(); +} + + +sub lock +{ + my ($curproc, $args) = @_; + + # lock information + my $config = $curproc->{ config }; + my $lock_dir = $config->{ lock_dir }; + my $lock_file = $config->{ lock_file }; + my $lock_type = $config->{ lock_type }; + + unless (-d $lock_dir) { + use File::Path; + mkpath($lock_dir, 0, 0755); + } + + unless (-f $lock_file) { + use FileHandle; + my $fh = new FileHandle $lock_file, "a"; + if (defined $fh) { + print $fh "\n"; + $fh->close if $fh; + } + } + + require FML::Lock; + my $lockobj = new FML::Lock; + + return 0 unless $lock_file ; + my $r = $lockobj->lock( { file => $lock_file } ); + if ($r) { + $curproc->{ pcb }->{ lock }->{ object } = $lockobj; + $curproc->{ pcb }->{ lock }->{ file } = $lock_file; + Log( "locked $lock_file"); + } + else { + croak("Error: cannot lock"); + } +} + + +sub unlock +{ + my ($curproc, $args) = @_; + + my $lockobj = $curproc->{ pcb }->{ lock }->{ object }; + my $lock_file = $curproc->{ pcb }->{ lock }->{ file }; + + my $r = $lockobj->unlock( { file => $lock_file } ); + if ($r) { + Log( "unlocked $lock_file"); + } + else { + croak("Error: cannot lock"); + } +} + + +sub inform_reply_messages +{ + my ($curproc, $args) = @_; +} + + +sub ValidateInComingMail +{ + my ($curproc, $args) = @_; +} + + +sub verify_sender_credential +{ + my ($curproc, $args) = @_; + my $r_msg = $curproc->{'incoming_mail'}; + my $from = $r_msg->{'header'}->get('from'); + + use Mail::Address; + my @addrs = Mail::Address->parse($from); + + my $count = 0; + for my $a (@addrs) { + $count++; + + # extract the first address as a sender. + $from = $a->format unless $from; + } + + if ($count == 1) { + Log("sender: $from"); + use FML::Credential; + $curproc->{'credential'} = new FML::Credential; + $curproc->{'credential'}->set( 'sender', $from ); + } + else { + Log("invalid From:"); + } +} + + +sub sender_is_member +{ + my ($curproc, $args) = @_; + $curproc->{'credential'}->{'sender'} + # &IsMailingListMember( $from ); +} + + +# fml5::init_main() routine +sub load_config_files +{ + my ($curproc, $files) = @_; + + # load configuration variables from given files e.g. /some/where.cf + # XXX overload variables from each $cf + for my $cf (@$files) { + $curproc->{ config }->overload( $cf ); + } +} + + +sub parse_incoming_mail +{ + my ($curproc, $args) = @_; + + # parse incoming mail to cut off it to the header and the body. + use FML::Parse; + + # malloc the incoming message on memory. + # $r_msg is the reference to the memory area. + my $r_msg = {}; + ($r_msg->{'header'}, $r_msg->{'body'}) = new FML::Parse \*STDIN; + $curproc->{'incoming_mail'} = $r_msg; +} + + +# debug +sub Debug +{ + my ($curproc, $args) = @_; + + eval { + use FML::Debug; + my $fp = new FML::Debug; + $fp->show_structure($curproc); + }; +} + + +1; diff --git a/fml/lib/FML/String.pm b/fml/lib/FML/String.pm new file mode 100644 index 00000000..b1246eb3 --- /dev/null +++ b/fml/lib/FML/String.pm @@ -0,0 +1,91 @@ +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::String; + +use Carp; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT_OK = qw(STR2JIS STR2EUC); + +use strict; + +sub AUTOLOAD +{ + print STDERR "bad AUTOLOAD()\n"; +} + +sub STR2EUC +{ + my ($str) = @_; + + use Jcode; + &Jcode::convert(\$str, 'euc'); +} + + +sub STR2JIS +{ + my ($str) = @_; + + use Jcode; + &Jcode::convert(\$str, 'jis'); +} + + +sub STR2SJIS +{ + my ($str) = @_; + + use Jcode; + &Jcode::convert(\$str, 'sjis'); +} + + +=head1 NAME + +FML::String -- utilties to manipulate strings + +=head1 SYNOPSIS + +=head1 METHOD + +=item STR2JIS(string) + +convert CHARSET of the given string to JIS. + +=item STR2EUC(string) + +convert CHARSET of the given string to EUC. + +=item STR2SJIS(string) + +convert CHARSET of the given string to SJIS. + + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +FML::String.pm appeared in fml5. + +=cut + +1; diff --git a/fml/lib/FML/index.ja.html b/fml/lib/FML/index.ja.html new file mode 100644 index 00000000..878296b3 --- /dev/null +++ b/fml/lib/FML/index.ja.html @@ -0,0 +1,64 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +lib/fml5/FML/ +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +lib/fml5/FML/ ディレクトリ: FML::* モジュールの置場所。 + +<UL> + <LI> + <A HREF=Article.pm>Article.pm</A> + + <LI> + <A HREF=BaseSystem.pm>BaseSystem.pm</A> + + <LI> + <A HREF=Body.pm>Body.pm</A> + + <LI> + <A HREF=Config.pm>Config.pm</A> + + <LI> + <A HREF=Date.pm>Date.pm</A> + + <LI> + <A HREF=Debug.pm>Debug.pm</A> + + <LI> + <A HREF=Header.pm>Header.pm</A> + + <LI> + <A HREF=IO/index.ja.html>IO::</A> + + <LI> + <A HREF=Lock.pm>Lock.pm</A> + + <LI> + <A HREF=Log.pm>Log.pm</A> + + <LI> + <A HREF=Messages.pm>Messages.pm</A> + + <LI> + <A HREF=Parse.pm>Parse.pm</A> + + <LI> + <A HREF=String.pm>String.pm</A> + + <LI> + <A HREF=libkern.pl>libkern.pl</A> + +</UL> + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/lib/IO/@template b/fml/lib/IO/@template new file mode 100644 index 00000000..81d97312 --- /dev/null +++ b/fml/lib/IO/@template @@ -0,0 +1,4 @@ +# Descriptions: +# Arguments: $self $args +# Side Effects: +# Return Value: none diff --git a/fml/lib/IO/Adapter/File.pm b/fml/lib/IO/Adapter/File.pm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/fml/lib/IO/Adapter/File.pm diff --git a/fml/lib/IO/Adapter/LDAP.pm b/fml/lib/IO/Adapter/LDAP.pm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/fml/lib/IO/Adapter/LDAP.pm diff --git a/fml/lib/IO/Adapter/NIS.pm b/fml/lib/IO/Adapter/NIS.pm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/fml/lib/IO/Adapter/NIS.pm diff --git a/fml/lib/IO/Adapter/RDBMS.pm b/fml/lib/IO/Adapter/RDBMS.pm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/fml/lib/IO/Adapter/RDBMS.pm diff --git a/fml/lib/IO/Adapter/UnixGroup.pm b/fml/lib/IO/Adapter/UnixGroup.pm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/fml/lib/IO/Adapter/UnixGroup.pm diff --git a/fml/lib/IO/File/Atomic.pm b/fml/lib/IO/File/Atomic.pm new file mode 100644 index 00000000..0efc717e --- /dev/null +++ b/fml/lib/IO/File/Atomic.pm @@ -0,0 +1,167 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package IO::File::Atomic; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; + +require Exporter; +@ISA = qw(IO::File); + + +sub BEGIN {} + + +sub new +{ + my ($class) = shift; + my $self = $class->SUPER::new(); + $self->open(@_) if @_; + $self; +} + + +sub open +{ + my ($self, $file, $mode) = @_; + + # get an instance + ref($self) or $self = $self->new; + + # default mode is "w" + $mode ||= "w"; + + # temporary file + my $temp = $file.".new.".$$; + ${*$self}{ _orig } = $file; + ${*$self}{ _temp } = $temp; + + # real open with $mode + $self->autoflush; + $self->SUPER::open($temp, "w") ? $self : undef; +} + + +sub rw_open +{ + my ($self, $file, $mode) = @_; + + use FileHandle; + my $rh = new FileHandle $file; + my $wh = $self->open($file, $mode); + + return ($rh, $wh); +} + + +sub close +{ + my ($self) = @_; + my $fh = $self; + my $orig = ${ *$fh }{ _orig }; + my $temp = ${ *$fh }{ _temp }; + + if (rename($temp, $orig)) { + ${ *$fh }{ _error } = "fail to rename($temp, $orig)"; + } + else { + undef; + } +} + + +sub error +{ + my ($self) = @_; + my $fh = $self; + ${ *$fh }{ _error }; +} + + +sub rollback +{ + my ($self) = @_; + my $fh = $self; + my $temp = ${ *$fh }{ _temp }; + if (-f $temp) { unlink $temp;} +} + + +sub DESTROY +{ + my ($self) = @_; + $self->rollback; +} + + +=head1 NAME + +IO::Atomic.pm - atomic operation + + +=head1 SYNOPSIS + + use IO::Atomic; + my $wh = new IO::Atomic->open($file); + print $wh "new/updated things ..."; + $wh->close; + +So, in usual cases, you use in this way. + + use FileHandle; + use IO::Atomic; + + # get read handle for $file + my $rh = new FileHandle $file; + + # get handle to update $file + my $wh = new IO::Atomic->open($file); + while (<$rh>) { + print $wh "new/updated things ..."; + } + $wh->close; + $rh->close; + +You can use this method to open $file for both read and write. + + use IO::Atomic; + my ($rh, $wh) = IO::Atomic->rw_open($file); + while (<$rh>) { + print $wh "new/updated things ..."; + } + $wh->close; + $rh->close; + + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=head1 AUTHOR + +=head1 COPYRIGHT + +Copyright (C) 2001 __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. + +=head1 HISTORY + +IO::__MODULE_NAME__.pm appeared in fml5. + +=cut + + +1; diff --git a/fml/lib/IO/MapAdapter.pm b/fml/lib/IO/MapAdapter.pm new file mode 100644 index 00000000..658f8623 --- /dev/null +++ b/fml/lib/IO/MapAdapter.pm @@ -0,0 +1,305 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package IO::MapAdapter; +use strict; +use Carp; + + +BEGIN {} + + +sub new +{ + my ($self, $args) = @_; + my ($type) = ref($self) || $self; + my ($me) = {}; + + if ( ref($args) eq 'CODE' ) { + $me->{_type} = 'array_on_memory'; + eval { &$args($me);}; + _log($me, $@) if $@; + } + else { + if ($args =~ /file:(\S+)/ || $args =~ m@^(/\S+)@) { + $me->{_file} = $1; + $me->{_type} = 'file'; + } + elsif ($args =~ /unix\.group:(\S+)/) { + $me->{_name} = $1; + $me->{_type} = 'unix.group'; + } + elsif ($args =~ /(ldap|mysql|postgresql):(\S+)/) { + $me->{_type} = $1; + $me->{_schema} = $2; + + # lowercase the '_type' syntax + $me->{_type} =~ tr/A-Z/a-z/; + } + else { + my $s = "IO::MapAdapter::new: args='$args' is unknown."; + print STDERR $s, "\n"; + _log($me, $s); + } + } + + return bless $me, $type; +} + + +sub _log +{ + my ($self, $mesg) = @_; + $self->{ _error } = $mesg; +} + + +sub error +{ + my ($self) = @_; + return $self->{ _error }; +} + + +sub dump_variables +{ + my ($self, $args) = @_; + my ($k, $v); + while (($k, $v) = each %$self) { + print STDERR "IO::Map.debug: $k => $v\n"; + } +} + + +sub open +{ + my ($self, $flag) = @_; + + # default flag is "r" == "read open" + $flag ||= 'r'; + + if ($self->{'_type'} eq 'file') { + my $file = $self->{_file}; + eval q{ use FileHandle;}; + my $fh = new FileHandle $file, $flag; + if (defined $fh) { + $self->{_fh} = $fh; + return $fh; + } + else { + $self->_log("Error: cannot open $file $flag"); + } + } + elsif ($self->{'_type'} eq 'unix.group') { + my @x = getgrnam( $self->{_name} ); + my @members = split ' ', $x[3]; + $self->{_members} = \@members; + $self->{_num_members} = $#members; + $self->{_counter} = 0; + return defined @members ? \@members : undef; + } + elsif ($self->{'_type'} eq 'array_on_memory') { + my $r_array = $self->{ _recipients_array_on_memory }; + my @members = @$r_array; + $self->{_members} = $r_array; + $self->{_num_members} = $#members; + $self->{_counter} = 0; + return defined @members ? \@members : undef; + } + elsif ($self->{'_type'} eq 'ldap' || + $self->{'_type'} eq 'mysql' || + $self->{'_type'} eq 'postgresql' + ) { + return undef; + } + else { + $self->_log("Error: type=$self->{_type} is unknown type."); + } +} + + +my $c = 0; +my $ec = 0; +sub line_count { my ($self) = @_; return "${ec}/${c}";} + + +# aliases for convenience +sub get_member { my ($self) = @_; $self->_get_address;} +sub get_active { my ($self) = @_; $self->_get_address;} +sub get_recipient { my ($self) = @_; $self->_get_address;} +sub _get_address +{ + my ($self) = @_; + + if ($self->{'_type'} eq 'file') { + my ($buf) = ''; + my $fh = $self->{_fh}; + + if (defined $fh) { + INPUT: + while ($buf = <$fh>) { + $c++; # for benchmark (debug) + next INPUT if not defined $buf; + next INPUT if $buf =~ /^\s*$/o; + next INPUT if $buf =~ /^\#/o; + next INPUT if $buf =~ /\sm=/o; + next INPUT if $buf =~ /\sr=/o; + next INPUT if $buf =~ /\ss=/o; + last INPUT; + } + + if (defined $buf) { + my @buf = split(/\s+/, $buf); + $buf = $buf[0]; + $buf =~ s/[\r\n]*$//o; + $ec++; + } + return $buf; + } + return undef; + } + elsif ($self->{'_type'} eq 'unix.group') { + my $i = $self->{_counter}++; + my $ra = $self->{_members}; + defined $$ra[ $i ] ? $$ra[ $i ] : undef; + } + elsif ($self->{'_type'} eq 'array_on_memory') { + my $i = $self->{_counter}++; + my $ra = $self->{_members}; + defined $$ra[ $i ] ? $$ra[ $i ] : undef; + } + elsif ($self->{'_type'} eq 'ldap' || + $self->{'_type'} eq 'mysql' || + $self->{'_type'} eq 'postgresql' + ) { + $self->_log("Error: not yet implemented"); + return undef; + } + else { + $self->_log("Error: type=$self->{_type} is unknown type."); + } +} + + +# raw line reading +sub getline +{ + my ($self) = @_; + + if ($self->{'_type'} eq 'file') { + my $fh = $self->{_fh}; + $fh->getline; + } + elsif ($self->{'_type'} eq 'unix.group') { + my $i = $self->{_counter}++; + my $ra = $self->{_members}; + defined $$ra[ $i ] ? $$ra[ $i ] : undef; + } + elsif ($self->{'_type'} eq 'ldap' || + $self->{'_type'} eq 'mysql' || + $self->{'_type'} eq 'postgresql' + ) { + $self->_log("Error: not yet implemented"); + return undef; + } + else { + $self->_log("Error: type=$self->{_type} is unknown type."); + } +} + + +sub getpos +{ + my ($self) = @_; + + if ($self->{'_type'} eq 'file') { + my $fh = $self->{_fh}; + tell($fh); + } + elsif ($self->{'_type'} eq 'unix.group') { + $self->{_counter}; + } + elsif ($self->{'_type'} eq 'array_on_memory') { + $self->{_counter}; + } + else { + $self->_log("Error: type=$self->{_type} is unknown type."); + } +} + + +sub setpos +{ + my ($self, $pos) = @_; + + if ($self->{'_type'} eq 'file') { + my $fh = $self->{_fh}; + seek($fh, $pos, 0); + } + elsif ($self->{'_type'} eq 'unix.group') { + $self->{_counter} = $pos; + } + elsif ($self->{'_type'} eq 'array_on_memory') { + $self->{_counter} = $pos; + } + else { + $self->_log("Error: type=$self->{_type} is unknown type."); + } +} + + +sub eof +{ + my ($self) = @_; + + if ($self->{'_type'} eq 'file') { + my $fh = $self->{_fh}; + $fh->eof; + } + elsif ($self->{'_type'} eq 'unix.group') { + $self->{_counter} > $self->{_num_members} ? 1 : 0; + } + elsif ($self->{'_type'} eq 'array_on_memory') { + $self->{_counter} > $self->{_num_members} ? 1 : 0; + } + else { + $self->_log("Error: type=$self->{_type} is unknown type."); + } +} + + +sub close +{ + my ($self) = @_; + + if ($self->{'_type'} eq 'file') { + $self->{_fh}->close; + } + elsif ($self->{'_type'} eq 'unix.group') { + ; + } + elsif ($self->{'_type'} eq 'array_on_memory') { + ; + } + else { + $self->_log("Error: type=$self->{_type} is unknown type."); + } +} + + +sub DESTROY +{ + my ($self) = @_; + $self->close; + undef $self; +} + + +1; diff --git a/fml/lib/IO/index.ja.html b/fml/lib/IO/index.ja.html new file mode 100644 index 00000000..4705f6d2 --- /dev/null +++ b/fml/lib/IO/index.ja.html @@ -0,0 +1,5 @@ +<UL> + <LI> + <A HREF=MapAdapter.pm>MapAdapter.pm</A> + +</UL> diff --git a/fml/lib/Netlib/@template b/fml/lib/Netlib/@template new file mode 100644 index 00000000..81d97312 --- /dev/null +++ b/fml/lib/Netlib/@template @@ -0,0 +1,4 @@ +# Descriptions: +# Arguments: $self $args +# Side Effects: +# Return Value: none diff --git a/fml/lib/Netlib/CheckSum.pm b/fml/lib/Netlib/CheckSum.pm new file mode 100644 index 00000000..75de112c --- /dev/null +++ b/fml/lib/Netlib/CheckSum.pm @@ -0,0 +1,65 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package Netlib::CheckSum; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +require Exporter; + +@ISA = qw(Exporter); + +sub new +{ + my ($self) = @_; + my ($type) = ref($self) || $self; + my $me = {}; + return bless $me, $type; + } + + +sub md5 + { +} + + +=head1 NAME + +Netlib::CheckSum.pm - what is this + + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +Netlib::CheckSum.pm appeared in fml5. + +=cut + + +1; diff --git a/fml/lib/Netlib/INET4.pm b/fml/lib/Netlib/INET4.pm new file mode 100644 index 00000000..ec6e8006 --- /dev/null +++ b/fml/lib/Netlib/INET4.pm @@ -0,0 +1,83 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package Netlib::INET4; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +use Netlib::Utils; + +require Exporter; + +@ISA = qw(Exporter); +@EXPORT = qw(_connect4); + +sub _connect4 +{ + my ($self, $args) = @_; + my $mta = $args->{ _mta }; + my $socket = ''; + + # avoid croak() in IO::Socket module; + eval { + local($SIG{ALRM}) = sub { Log("Error: timeout to connect $mta");}; + use IO::Socket; + $socket = new IO::Socket::INET($mta); + }; + if ($@) { + Log("Error: cannot make socket for $mta"); + $self->_error_why("Error: cannot make socket: $@"); + return undef; + } + + if (defined $socket) { + Log("(debug) o.k. connected to $mta"); + $self->{'_socket'} = $socket; + $socket->autoflush(1); + return $socket; + } + else { + Log("(debug) error. fail to connect $mta"); + $self->_error_why("Error: cannot open socket: $!"); + return undef; + } +} + + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=head1 AUTHOR + +=head1 COPYRIGHT + +Copyright (C) 2001 __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. + +=head1 HISTORY + +FML::__MODULE_NAME__.pm appeared in fml5. + +=cut + +1; diff --git a/fml/lib/Netlib/INET6.pm b/fml/lib/Netlib/INET6.pm new file mode 100644 index 00000000..ac84afa7 --- /dev/null +++ b/fml/lib/Netlib/INET6.pm @@ -0,0 +1,174 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package Netlib::INET6; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +use Netlib::Utils; + +require Exporter; + +@ISA = qw(Exporter); +@EXPORT = qw(is_ipv6_ready is_ipv6_mta_syntax _connect6); + +sub _we_can_use_Socket6 +{ + my ($self, $args) = @_; + + eval q{ + use Socket; + use Socket6; + }; + + if ($@ =~ /Can\'t locate Socket6.pm/) { + $self->{_ipv6_ready} = 'no'; + } + else { + Log("IPv6 ready"); + $self->{_ipv6_ready} = 'yes'; + } +} + + +sub is_ipv6_ready +{ + my ($self, $args) = @_; + + # probe the IPv6 availability for the first time + unless ($self->{_ipv6_ready}) { + _we_can_use_Socket6($self, $args); + }; + + $self->{_ipv6_ready} eq 'yes' ? 1 : 0; +} + + +sub is_ipv6_mta_syntax +{ + my ($self, $host) = @_; + my ($x_host, $x_port); + + # check the mta syntax whether it is ipv6 form or not. + if ( $host =~ /\[([\d:]+)\]:(\d+)/) { + ($x_host, $x_port) = ($1, $2); + return ($x_host, $x_port); + } + else { + return wantarray ? () : undef; + } +} + + +sub _connect6 +{ + my ($self, $args) = @_; + my $mta = $args->{ _mta }; + + # check the mta syntax is $ipv6_addr:$port or not. + my ($host, $port) = $self->is_ipv6_mta_syntax( $args->{ _mta } ); + + # if mta is ipv6 raw address syntax, + # try to parse $mta to $host:$port style. + unless ($host) { + if ($mta =~ /(\S+):(\S+)/) { + ($host, $port) = ($1, $2); + } + } + + # hmm, invalid MTA + unless ($host && $port) { + Log("_connect6: cannot find mta=$mta"); + $self->{_socket} = undef; + return undef; + } + + $self->{_socket} = undef; + return undef; + + eval q{ + use IO::Handle; + use Socket; + use Socket6; + + my ($family, $type, $proto, $saddr, $canonname); + my $fh = new IO::Socket; + my $inet6_family = &AF_INET6; + + # resolve socket info by getaddrinfo() + my @res = getaddrinfo($host, $port, AF_UNSPEC, SOCK_STREAM); + $family = -1; + + LOOP: + while (scalar(@res) >= 5) { + ($family, $type, $proto, $saddr, $canonname, @res) = @res; + + my ($host, $port) = + getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV); + + # check only IPv6 case here. + next LOOP if $family != $inet6_family; + + socket($fh, $family, $type, $proto) || do { + Log("Error: cannot create IPv6 socket"); + next LOOP; + }; + if (connect($fh, $saddr)) { + Log("(debug6) o.k. connect $host"); + last LOOP; + } + else { + Log("Error: cannot connect via IPv6"); + } + + $family = -1; + } + + if ($family != -1) { + $self->{_socket} = $fh; + Log("connected to $host:$port by IPv6"); + } else { + $self->{_socket} = undef; + Log("(debug6) fail to connect $host:$port by IPv6"); + } + }; +} + + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=head1 AUTHOR + +=head1 COPYRIGHT + +Copyright (C) 2001 __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. + +=head1 HISTORY + +FML::__MODULE_NAME__.pm appeared in fml5. + +=cut + +1; diff --git a/fml/lib/Netlib/SMTP.ja.pod b/fml/lib/Netlib/SMTP.ja.pod new file mode 100644 index 00000000..2df018e3 --- /dev/null +++ b/fml/lib/Netlib/SMTP.ja.pod @@ -0,0 +1,83 @@ +=head1 NAME + +fml5 のメール配送システムについて + +=head1 DESCRIPTION + +=head2 fml4 と fml5 の相違点 + +fml5 の最大の目的の一つは、メンバーリストの取得と操作の統合と抽象化で +す。Netlib::SMTP は次のように使います。 + + +=head1 使い方 + +=head2 Netlib::* クラスの使い方について + +Netlib::* に属するクラスは SMTP および LMTP 配送へのインターフェイスを +提供します。 + +Netlib::SMTP は次のように使います。 + + use Netlib::SMTP; + my $service = new Netlib::SMTP { + log_function => $fp, + socket_timeout => 2, + }; + + my $ref_to_array = [ 'kenken@nuinui.net' ]; + my $recipient_maps = 'file:/var/spool/ml/elena/actives'; + + $service->deliver( + { + 'mta' => 'localhost:25', + + 'smtp_sender' => 'rudo@nuinui.net', + 'recipient_array' => $ref_to_array, + 'recipient_maps' => $recipient_maps, + + 'header' => $header, + 'body' => $body, + }); + if ($service->error) { Log($service->error); return;} + +ここで $header はヘッダで、FML::Header オブジェクトです。 +そして $body はメール本文で、FML::Body オブジェクトです。 + +=head1 コンポーネント + + Netlib::SMTP >-| + |- Netlib::Utils + |- Netlib::INET4 >--- Socket + |- Netlib::INET6 >--- Socket + | |- Socket6 + | + |- FML::IO::Map + | + |- IO::Socket + +Netlib::SMTP uses Netlib::Utils, Netlib::INET4 and Netlib::INET6. +Netlib::SMTP also uses FML::IO::Map to resolve $recipient_maps +operations. + +=head1 参照 + +L<"Netlib::SMTP">, +L<"FML::IO::Map"> + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +Netlib class appeared in fml5. +fml5 is fully rewrite of fml4 based on the experience of fml4 +(1993-2001). diff --git a/fml/lib/Netlib/SMTP.pm b/fml/lib/Netlib/SMTP.pm new file mode 100644 index 00000000..543d9888 --- /dev/null +++ b/fml/lib/Netlib/SMTP.pm @@ -0,0 +1,698 @@ +#-*- perl -*- +# +# Copyright (C) 2000-2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +### XXX comment templates ### +# Descriptions: +# Arguments: $self $args +# Side Effects: +# Return Value: none +############################# + + +package Netlib::SMTP; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +use IO::Socket; +use Netlib::Utils; +use Netlib::INET4; +use Netlib::INET6; + +require Exporter; +@ISA = qw(Exporter); + + +BEGIN {} + + +# Descriptions: Netlib::SMTP constructor +# Arguments: $self $args +# Side Effects: $self ($me) hash has some default values +# Return Value: object +sub new +{ + my ($self, $args) = @_; + my ($type) = ref($self) || $self; + my $me = {}; # malloc new SMTP session struct + + # _recipient_limit: maximum recipients in one smtp session. + # _socket_timeout: basic timeout parameter for smtp session + # _log_function: pointer to the log() function + $me->{_recipient_limit} = $args->{recipient_limit} || 1000; + $me->{_socket_timeout} = $args->{socket_timeout} || 10; + $me->{_log_function} = $args->{log_function}; + + _initialize_delivery_session($me, $args); + + # define package global pointer to the log() function + $LogFunctionPointer = $args->{log_function}; + + return bless $me, $type; +} + + +# Descriptions: send a (SMTP/LMTP) command string to BSD socket +# Arguments: $self $command_string +# Side Effects: log file by _smtplog +# set _last_command and _error_action in object itself +# Return Value: none +sub _send_command +{ + my ($self, $command) = @_; + my $socket = $self->{'_socket'}; + + $self->{_last_command} = $command; + $self->{_error_action} = ''; + $self->_smtplog($command); + + if (defined $socket) { + $socket->print($command, "\r\n"); + } + else { + Log("Error: _send_command: undefined socket"); + } +} + + +# Descriptions: receive a reply for a (SMTP/LMTP) command +# Arguments: $self +# Side Effects: log file by _smtplog +# Return Value: none +sub _read_reply +{ + my ($self) = @_; + my $socket = $self->{'_socket'}; + + # unique identifier to clarify the trapped error message + my $id = $$; + + # toggle flag whether we should check SMTP attributes or not. + # we should check it only in HELO phase. + my $check_attributes = 0; + if ($self->{_last_command} =~ /^(EHLO|HELO|LHLO)/) { + $check_attributes = 1; + } + + # XXX Attention! dynamic scope by local() for %SIG is essential. + # See books on Perl for more details on my() and local() difference. + eval { + local($SIG{ALRM}) = sub { die("$id socket timeout")}; + alarm( $self->{_socket_timeout} ); + my $buf = ''; + + SMTP_REPLY: + while (1) { + $buf = $socket->getline; + $self->_smtplog($buf); + + # check smtp attributes + if ($check_attributes) { + if ($buf =~ /^250.PIPELINING/i) { + $self->{'_can_use_pipelining'} = 'yes'; + } + if ($buf =~ /^250.ETRN/i) { + $self->{'_can_use_etrn'} = 'yes'; + } + if ($buf =~ /^250.SIZE\s+(\d+)/i) { + $self->{'_size_limit'} = $1; + } + } + + # store the latest status code + if ($buf =~ /^(\d{3})/) { $self->_set_status_code($1);} + + # check status code + if ($buf =~ /^[45]\d{2}\s/) { + Log($buf); + die("$id retry"); + } + + # end of reply e.g. "250 ..." + last SMTP_REPLY if $buf =~ /^\d{3}\s/; + } + }; + + if ($@ =~ /$id retry/) { + $self->{'_error_action'} = "retry"; + } + + if ($@ =~ /$id socket timeout/) { + my $x = $self->{'_last_command'}; + Log("Error: smtp reply for \"$x\" is timeout"); + $self->_error_why("Error: smtp reply for \"$x\" is timeout"); + } +} + + +# Descriptions: connect(2) +# 1. try connect(2) by IPv6 if we can use Socket6.pm +# 2. try connect(2) by IPv4 +# if $host is not IPv6 raw address e.g. [::1]:25 +# Arguments: $self $args +# Side Effects: set file handle (BSD socket) in $self->{_socket} +# Return Value: file handle (created BSD socket) or undef() +sub _connect +{ + my ($self, $args) = @_; + my $mta = $args->{'_mta'} || '127.0.0.1:25'; + my $socket; + + # 1. try to connect(2) $args->{ _mta } by IPv6 if we can use Socket6. + if ($self->is_ipv6_ready($args)) { + $self->_connect6($args); + my $socket = $self->{_socket}; + return $socket if defined $socket; + } + else { + Log("(debug) IPv6 is not ready"); + } + + # 2. try to connect(2) $args->{ _mta } by IPv4. + # XXX check the _mta syntax. + # XXX if $args->{ _mta } looks [$ipv6_addr]:$port style, + # XXX we do not try to connect the host by IPv4. + if ( $self->is_ipv6_mta_syntax($mta) ) { + Log("(debug) not try MTA $args->{_mta}"); + return undef; + } + else { + $self->_connect4($args); + } +} + + +# Descriptions: close BSD socket +# Arguments: $self +# Side Effects: +# Return Value: none +sub close +{ + my ($self) = @_; + my $socket = $self->{'_socket'}; + + if (defined $socket) { + $socket->close; + } + else { + Log("Error: try to close invalid socket"); + } +} + + +############################################################ +##### +##### SMTP delivery main loop +##### + + +# Descriptions: main delivery loop for each recipient_maps and each mta. +# real delivery is done within _deliver() method. +# algorithm: +# for each $map { +# for each $mta { +# call _deliver() +# send recipients up to $recipient_limit +# } +# } +# +# Arguments: $self $args +# Side Effects: See Netlib::Utils for recipient_map utilities +# to track the delivery process status. +# Return Value: none +sub deliver +{ + my ($self, $args) = @_; + + # recipient limit + $self->{_recipient_limit} = $args->{recipient_limit} || 1000; + + # temporary hash to check whether the map/mta is used already. + my %used_mta = (); + my %used_map = (); + + # prepare loop for each mta and map + my @mta = split(/\s+/, $args->{ mta } || '127.0.0.1:25'); + my @maps = (); + if ( $args->{ recipient_maps } ) { + @maps = split(/\s+/, $args->{ recipient_maps }); + } + + # alloc virtual recipient map + if (ref( $args->{ recipient_array } ) eq 'ARRAY') { + my $map = $self->_alloc_recipients_array_on_memory($args); + push(@maps, $map); + } + + MAP: + for my $map ( @maps ) { + # uniq $map + next if $used_map{ $map }; $used_map{ $map } = 1; + + $self->_set_target_map($map); + $self->_set_map_status($map, 'not done'); + $self->_set_map_position($map, 0); + + # To avoid infinite loop, we enforce some artificial limit. + # The loop evaluation is limited to "4 * $number_of_mta" for each $map. + my $loop_count = 0; + my $max_loop_count = ($#mta * 4) || 4; + + MTA_RETRY_LOOP: + while (1) { + my $n_mta = 0; + + # check infinite loop + if ($loop_count++ > $max_loop_count) { + Log("Error: infinite loop for map=$map"); + last MTA_RETRY_LOOP; + } + + MTA: + for my $mta (@mta) { + # uniq $mta + next if $used_mta{ $mta }; $used_mta{ $mta } = 1; + + # count the number of effective mta in this inter loop. + $n_mta++; + + # o.k. try to deliver mail by using $mta. + Log("(debug) use $mta for map=$map"); + $args->{ _mta } = $mta; + $self->_deliver($args); + + # remove error messages for the next _deliver() session. + $self->error_reset; + + # we read the whole $map now. + if ($self->_get_map_status($map) eq 'done') { + last MTA; + } + } # end of MTA: loop + + # end of MTA_RETRY_LOOP: loop + if ($self->_get_map_status($map) eq 'done') { + last MTA_RETRY_LOOP; + } + + # NO effective mta in this inter loop. It impiles that + # we used all MTA candidates. We reuse @mta again. + if ($n_mta == 0) { + Log("(debug) we used all MTA candidates. reuse \$mta"); + undef %used_mta; + next MTA_RETRY_LOOP; + } + } + } + + # clean up recipient_map information after "all delivery" + # CAUTION: this mapinfo tracks the delivery status. + $self->_reset_mapinfo; + + if ( $self->{ _num_recipients } ) { + Log( "recipients: ". $self->{ _num_recipients } ); + } +} + + +# Descriptions: ordinary SMTP sequence (see RFC821 for more details) +# >220 I am some MTA ... +# <EHLO/HELO myname +# >250 ok +# <MAIL FROM:<$sender> +# >250 ok +# <RCPT TO:<$recipient> +# >250 oK +# <DATA +# >354 ... +# < message +# <. +# >250 oK +# <QUIT +# >221 good bye +# Arguments: $self $args +# Side Effects: remove error messages when we return from here +# for the next _deliver() session. +# Return Value: none +sub _deliver +{ + my ($self, $args) = @_; + + $self->_initialize_delivery_session($args); + + # prepare smtp information + my $myhostname = $args->{ myhostname } || 'localhost'; + + # 0. create BSD SOCKET as the communication terminal + # IF_ERROR_FOUND: do nothing and return as soon as possible + my $socket = $self->_connect($args); + $socket || return; + + # 1. receive the first "220 .." message + # If you faces some error in this stage, you have to do nothing + # since smtp connection has not established yet. + # IF_ERROR_FOUND: do nothing and return as soon as possible + $self->_read_reply; + if ($self->error) { return;} + + # 2. EHLO/HELO; + # IF_ERROR_FOUND: do nothing and return as soon as possible + $self->_send_command("EHLO $myhostname"); + $self->_read_reply; + if ($self->error) { $self->_reset_smtp_transaction; return;} + + # 3. MAIL FROM; + # IF_ERROR_FOUND: do nothing and return as soon as possible + $self->_send_mail_from($args); + if ($self->error) { $self->_reset_smtp_transaction; return;} + + # 4. RCPT TO; ... send list of recipients + # IF_ERROR_FOUND: roll back the process to the state before this + $self->_send_recipient_list($args); + if ($self->error) { + $self->_rollback_map_position; + $self->_reset_smtp_transaction; + return; + } + + # 5. DATA; send the mail body itself + # IF_ERROR_FOUND: handled in _send_data_to_mta(), so + # return as soon as possible from here. + $self->_send_data_to_mta($args); + if ($self->error) { return;} + + # 6. QUIT; SMTP session closing ... + # IF_ERROR_FOUND: do nothing ? + $self->_send_command("QUIT"); + $self->_read_reply; + if ($self->error) { $self->_reset_smtp_transaction; return;} +} + + +# Descriptions: initialize _deliver() process +# this routine is called at the first phase in _deliver() +# Arguments: $self $args +# Side Effects: +# Return Value: none +sub _initialize_delivery_session +{ + my ($self, $args) = @_; + $self->{ _last_command } = ''; + $self->{ _status_code } = ''; +} + + +############################################################ +##### +##### MAIL FROM: +##### + +# Descriptions: send SMTP command "MAIL FROM" +# Arguments: $self $args +# Side Effects: none +# Return Value: none +# See Also: RFC821, RFC1123 +# TODO: VERP's +sub _send_mail_from +{ + my ($self, $args) = @_; + my $sender = $args->{ smtp_sender }; + $self->_send_command("MAIL FROM:<$sender>"); + $self->_read_reply; +} + + + +############################################################ +##### +##### RCPT TO: +##### + +# Descriptions: We evaluate recipient_maps parameter here. +# You can use a lot of classes for this directive: e.g. +# file, UNIX's /etc/group, YP, SQL, LDAP, ... +# Example: recipient_maps = file:members +# unix.group:admin +# mysql:toymodel +# IO::MapAdapter class is essential to handle abstract +# $recipient_map. +# Arguments: $self $args +# Side Effects: $self->{ _retry_recipient_table } has recipients which +# causes some errors. +# _{set,get}_map_position() and _{set,get}_map_status() +# tracks the delivery process. +# Return Value: none +sub _send_recipient_list_by_recipient_map +{ + my ($self, $args) = @_; + my $map = $self->_get_target_map; + + # open abstract recipient list objects. + # $map syntax is "type:parameter", e.g., + # file:$filename mysql:$schema_name + use IO::MapAdapter; + my $obj = new IO::MapAdapter $map; + + unless (defined $obj) { + Log("Error: cannot get object for $map by IO::MapAdapter"); + } + else { # $obj is good. + my $rcpt; + my $num_recipients = 0; + my $recipient_limit = $self->{_recipient_limit}; + + $obj->open; + + # roll back the previous file offset + if ($self->_get_map_position($map) > 0) { + $obj->setpos( $self->_get_map_position($map) ); + } + + # XXX $obj->get_recipient returns a mail address. + RCPT_INPUT: + while (defined ($rcpt = $obj->get_recipient)) { + $num_recipients++; + $self->_send_command("RCPT TO:<$rcpt>"); + $self->_read_reply; + + # save addresses to retry later. + if ($self->{_error_action} eq 'retry') { + $self->{ _retry_recipient_table }->{ $rcpt } = 'retry'; + } + + last RCPT_INPUT if $num_recipients >= $recipient_limit; + } + + # save the current position in the file handle + $self->_set_map_position($map, $obj->getpos); + + # done. + if ($obj->eof) { + $self->_set_map_status($map, 'done'); + } + + # ends + $obj->close; + + # count up the total number of recipients + $self->{ _num_recipients } += $num_recipients; + + unless ($num_recipients) { + Log("Error: no recipients for $map"); + $self->_send_command("RSET"); + $self->_read_reply; + } + } +} + + +# Descriptions: send "RCPT TO:<recipient>" to MTA +# Arguments: $self $args +# Side Effects: none +# Return Value: none +sub _send_recipient_list +{ + my ($self, $args) = @_; + + # evaluate recipient_maps + if ( $self->_get_target_map ) { + $self->_send_recipient_list_by_recipient_map($args); + } +} + + +# Descriptions: create CODE REFERECE to handle recipients array on memory +# Arguments: $self $args +# Side Effects: $me is referenced, so not destroyed. It is a closure (?). +# Return Value: CODE REFERENCE +sub _alloc_recipients_array_on_memory +{ + my ($self, $args) = @_; + return sub { + my ($me) = @_; + $me->{ _recipients_array_on_memory } = $args->{ recipient_array }; + }; +} + + +############################################################ +##### +##### DATA: +##### + +# Descriptions: send the header part of the message to socket +# Arguments: $self $socket $ref_to_header +# $ref_to_header is the FML::Header class object. +# Side Effects: none +# Return Value: none +sub _send_header_to_mta +{ + my ($self, $socket, $header) = @_; + + # get header + my $h = $header->as_string($socket); + $h =~ s/\n/\r\n/g; + print $socket $h; + $self->_smtplog($h); +} + + +# Descriptions: send the body part of the message to socket +# replace "\n" in the end of line with "\r\n" on memory. +# We should do it to use as less memory as possible. +# So we use substr() to process each line. +# Arguments: $self $socket $ref_to_body +# Side Effects: none +# Return Value: none +sub _send_body_to_mta +{ + my ($self, $socket, $r_body) = @_; + my ($pp, $p, $maxlen, $len, $buf, $pbuf); + + $pp = 0; + $maxlen = length($$r_body); + + # write each line in buffer + SMTP_IO: + while (1) { + $p = index($$r_body, "\n", $pp); + $len = $p - $pp + 1; + $buf = substr($$r_body, $pp, ($p < 0 ? $maxlen-$pp : $len)); + if ($buf !~ /\r\n$/) { $buf =~ s/\n$/\r\n/;} + + # ^. -> .. + $buf =~ s/^\./../; + + $self->_smtplog($buf); + print $socket $buf; + + last SMTP_IO if $p < 0; + $pp = $p + 1; + } +} + + +# Descriptions: send message itself to file handle (BSD socket here) +# Arguments: $self $args +# Side Effects: +# Return Value: none +# TODO: MIME/multipart +sub _send_data_to_mta +{ + my ($self, $args) = @_; + + + # XXX debug; + # Log("(debug) not send DATA now"); return ; + # + + + # prepare smtp information + my $body = $args->{ body }; + my $header = $args->{ header }; + my $socket = $self->{'_socket'}; + + if (defined $body) { + $self->_send_command("DATA"); + $self->_read_reply; + + # XXX if "DATA" transaction cannot start, retry ? + if ($self->_get_status_code != '354' || $self->error) { + Log($self->error); + return undef; + } + + # 1. header; send header + $self->_send_header_to_mta($socket, $header); + + # 2. separator between header and body + print $socket "\r\n"; + $self->_smtplog("\r\n"); + + # 3. body; send(copy) body on memory to socket each line + $self->_send_body_to_mta($socket, $body); + + # end "DATA" transaction + $self->_send_command("."); + $self->_read_reply; + } +} + + +############################################################ +##### +##### QUIT / RSET +##### + +# Descriptions: send the SMTP reset "RSET" command +# Arguments: $self $args +# Side Effects: none +# Return Value: none +sub _reset_smtp_transaction +{ + my ($self, $args) = @_; + $self->_send_command("RSET"); + $self->_read_reply; + Log("Info: reset smtp transcation"); +} + + +=head1 NAME + +Netlib::SMTP.pm - SMTP functions + +=head1 SYNOPSIS + + use Netlib::SMTP; + my $service = new Netlib::SMTP $CurProc; + + +=head1 DESCRIPTION + + + +=head1 AUTHOR + +Ken'ichi Fukamachi + + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +Netlib::SMTP.pm appeared in fml5. + +=cut + +1; diff --git a/fml/lib/Netlib/Utils.pm b/fml/lib/Netlib/Utils.pm new file mode 100644 index 00000000..c5c3c883 --- /dev/null +++ b/fml/lib/Netlib/Utils.pm @@ -0,0 +1,196 @@ +#-*- perl -*- +# +# Copyright (C) 2000-2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package Netlib::Utils; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK $LogFunctionPointer); +use Carp; + +require Exporter; +@ISA = qw(Exporter); + +@EXPORT = qw( + Log + _smtplog + + $LogFunctionPointer + + _error_why + error + error_reset + + _set_status_code + _get_status_code + + _set_target_map + _get_target_map + _set_map_status + _set_map_position + _get_map_status + _get_map_position + _rollback_map_position + _reset_mapinfo + ); + +sub Log +{ + my ($buf) = @_; + + # function pointer to logging function + my $fp = $LogFunctionPointer; + + if ($fp) { + eval &$fp($buf); + print STDERR $@, "\n" if $@; + } + else { + print STDERR @_, "\n"; + } +} + + +sub _smtplog +{ + my ($self, $buf) = @_; + + if (defined $buf) { + print $buf; + print "\n" if $buf !~ /\n$/o; + } +} + + +sub _error_why +{ + my ($self, $mesg) = @_; + $self->{'_error_reason'} = $mesg; +} + + +sub error +{ + my ($self, $args) = @_; + return $self->{'_error_reason'}; +} + + +sub error_reset +{ + my ($self, $args) = @_; + my $msg = $self->{'_error_reason'}; + undef $self->{'_error_reason'} if defined $self->{'_error_reason'}; + undef $self->{'_error_action'} if defined $self->{'_error_action'}; + return $msg; +} + + +sub _set_status_code +{ + my ($self, $value) = @_; + $self->{'_status_code'} = $value; +} + + +sub _get_status_code +{ + my ($self) = @_; + $self->{'_status_code'}; +} + + + +############################################################ +##### +##### utility functions to operate $recipient_maps +##### + + +sub _set_target_map +{ + my ($self, $map) = @_; + $self->{ _mapinfo }->{ _curmap } = $map; +} + + +sub _get_target_map +{ + my ($self) = @_; + $self->{ _mapinfo }->{ _curmap }; +} + + +sub _set_map_status +{ + my ($self, $map, $status) = @_; + $self->{ _mapinfo }->{ $map }->{prev_status} = + $self->{ _mapinfo }->{ $map }->{status} || 'not done'; + $self->{ _mapinfo }->{ $map }->{status} = $status; +} + +sub _set_map_position +{ + my ($self, $map, $position) = @_; + $self->{ _mapinfo }->{ $map }->{prev_position} = + $self->{ _mapinfo }->{ $map }->{position} || 0; + $self->{ _mapinfo }->{ $map }->{position} = $position; +} + +sub _get_map_status +{ + my ($self, $map) = @_; + $self->{ _mapinfo }->{ $map }->{status}; +} + +sub _get_map_position +{ + my ($self, $map) = @_; + $self->{ _mapinfo }->{ $map }->{position}; +} + + +sub _rollback_map_position +{ + my ($self) = @_; + my $map = $self->_get_target_map; + + # count the number of rollback to avoid infinite loop + if ( $self->{ _map_rollback_info }->{ $map }->{ count } > 2 ) { + Log("Error: not rollback $map to avoid infinite loop"); + return ; + } + else { + $self->{ _map_rollback_info }->{ $map }->{ count }++; + } + + my $prev_pos = $self->{ _mapinfo }->{ $map }->{prev_position}; + my $pos = $self->{ _mapinfo }->{ $map }->{position}; + $self->_set_map_position($map, $prev_pos); + Log("Info: rollback $map from $pos to $prev_pos"); + + my $prev_status = $self->{ _mapinfo }->{ $map }->{prev_status}; + my $status = $self->{ _mapinfo }->{ $map }->{status}; + $self->_set_map_status($map, $prev_status); + Log("Info: rollback status of $map to '$prev_status'"); +} + + +sub _reset_mapinfo +{ + my ($self) = @_; + $self->_set_target_map(''); + delete $self->{ _mapinfo }; + delete $self->{ _map_rollback_info }; +} + + +1; + + +1; diff --git a/fml/lib/Netlib/index.ja.html b/fml/lib/Netlib/index.ja.html new file mode 100644 index 00000000..cfc25b65 --- /dev/null +++ b/fml/lib/Netlib/index.ja.html @@ -0,0 +1,32 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +Netlib:: クラス +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<CENTER> +Netlib:: クラス +</CENTER> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<UL> + <LI> + <A HREF=INET6.pm>INET6.pm</A> + + <LI> + <A HREF=SMTP.pm>SMTP.pm</A> + + <LI> + <A HREF=Utils.pm>Utils.pm</A> + +</UL> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/lib/__template.pm b/fml/lib/__template.pm new file mode 100644 index 00000000..637452b9 --- /dev/null +++ b/fml/lib/__template.pm @@ -0,0 +1,59 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package FML::__HERE_IS_YOUR_MODULE_NAME__; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; + +require Exporter; +@ISA = qw(Exporter); + + +sub new +{ + my ($self) = @_; + my ($type) = ref($self) || $self; + my $me = {}; + return bless $me, $type; +} + + +=head1 NAME + +FML::__HERE_IS_YOUR_MODULE_NAME__.pm - what is this + + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 new + +=item Function() + + +=head1 AUTHOR + +=head1 COPYRIGHT + +Copyright (C) 2001 __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. + +=head1 HISTORY + +FML::__MODULE_NAME__.pm appeared in fml5. + +=cut + + +1; diff --git a/fml/lib/index.ja.html b/fml/lib/index.ja.html new file mode 100644 index 00000000..cd12d1dd --- /dev/null +++ b/fml/lib/index.ja.html @@ -0,0 +1,88 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +lib/ ディレクトリ +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<CENTER> +lib/ ディレクトリの階層について +</CENTER> + +<P> +基本方針: +<BR> +使えるものは片っ端から使う(例えば CPAN )。 +そうしないと保守する項目が増える一方のためである。 + +また、保守する人をはっきり区別するためにベンダーごとにディレクトリを分ける。 +例えば CPAN で保守されているものは CPAN/ ディレクトリ以下に入れる。 + +CPAN/ や 3RDPARTY/ 以下のモジュールを変更したい場合は fml5/ 以下でなん +らかのラップをするか、パッチをオリジナルに反映してもらって CPAN/ 以下 +をアップデートする。 + +site_local/ はそのサイト独自のものなので以下なる場合もノータッチ。 + + +<TABLE BORDER=4> + <TR> + <TD> ベンダー名 + <TD> そのディレクトリにおくモジュールの説明 + + <TR> + <TD> fml5/ + <TD> fml5 プロジェクト直轄 + <BR> + この下のモデュールについては + <PRE> + use FML::module; + $p = new module; + $p->function( { what => this , type => that } ); + </PRE> + などといったクラスの階層をとるか、 + <PRE> + use FML::module; + &FML::module::function( \%curproc ); + </PRE> + などといった、書き方をする。 + + <TR> + <TD> CPAN/ + <TD> CPAN で保守されているもの + <BR> + この下のモデュールについては CPAN の説明の通り。 + 単に標準モデュールでないため、ないしは + fml5 のバージョン管理や保守のために、ここに収容。 + + <BR> + <A HREF=CPAN/MANIFEST.txt> CPAN/MANIFEST.txt </A> + に輸入しているモヂュールの一覧を書き、 + <A HREF=CPAN/Changes.txt> CPAN/Changes.txt </A> + に変更を書く。 + + <TR> + <TD> 3RDPARTY/ + <TD> サードパーティ用(予約) + <BR> + 予約されているだけで、fml5 プロジェクトとしては使わない。 + + + <TR> + <TD> site_local/ + <TD> そのサイト独自に保守したいモジュールをおくためのディレクトリ + (予約) + <BR> + 予約されているだけで、fml5 プロジェクトとしては使わない。 +</TABLE> + + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/libexec/Standalone.pm b/fml/libexec/Standalone.pm new file mode 100644 index 00000000..efabc7bf --- /dev/null +++ b/fml/libexec/Standalone.pm @@ -0,0 +1,78 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + + +package Standalone; + +use strict; +use Carp; + +# Descriptions: load "key = value" style configuration. +# It is available to use the following style. +# key = value1 value2 +# value3 +# XXX This file is non-Object Oriented style but +# XXX this is minimum module used in standalone program. +# Arguments: $file +# Side Effects: none +# Return Value: reference to configuration hash +sub load_cf +{ + my ($file) = @_; + my $config = {}; + + use FileHandle; + my $fh = new FileHandle $file; + + if (defined $fh) { + my $curkey; + while (<$fh>) { + next if /^\#/; + chop; + + if (/^([A-Za-z]\w+)\s+=\s*(.*)/) { + my ($key, $value) = ($1, $2); + $curkey = $key; + $config->{$key} = $value; + } + if (/^\s+(.*)/) { + $config->{ $curkey } .= " ". $1; + } + } + $fh->close; + } + else { + croak("Error: cannot open $file"); + } + + _expand_variables( $config ); + return $config; +} + + +# Descriptions: expand $var to the value of $var. +# Arguments: $ref_to_config +# Side Effects: rewrite the given $config +# Return Value: none +sub _expand_variables +{ + my ($config) = @_; + + # expand $xxx style variables + no strict 'refs'; + for my $x (keys %$config) { $$x = $config->{ $x };} + for (keys %$config) { + $config->{ $_ } =~ s/\$([a-z_]+)/${$1}/g; + } +} + + + +1; diff --git a/fml/libexec/boot.ja.html b/fml/libexec/boot.ja.html new file mode 100644 index 00000000..2694eedd --- /dev/null +++ b/fml/libexec/boot.ja.html @@ -0,0 +1,75 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> +net/fml ブートの仕方 +</TITLE> +<META http-equiv="Content-Type" + content="text/html; charset=EUC-JP"> +</HEAD> + +<BODY BGCOLOR="#E6E6FA"> +<!-- ================== body =========================================== --> + +<UL> + <LI> libexec/fmlwrapper (wrapper) + <BR> + Bootstrap() を起動する。 + <UL> + <LI> /etc/fml/main.cf を読み込む。 + 読み込むと fml のバージョンが分かる。 + + <LI> @ARGV を評価し、 + どの config.cf 群をロードすればいいのかを準備する。 + default_config.cf はバージョン依存であるので、 + ここで評価することに注意。 + + <LI> libexec/fml ( バージョン依存 )ファイルを + ロードし、 + <UL> + <LI> + ProcessSwitch() を実行して、配送用、コマンドモード用 + プログラム/プロセスなどへ制御を移す(分岐する)。 + + <LI> + $0 から自分の名前を知り、 + どのプロセスへ分岐すればいいのかを判断する。 + + <LI>(ポリモーフィズム) + ダイナミックバインディングし、 + プロセスオブジェクトを生成する( fork(2) という意味ではない)。 + そして、プロセスをスタートさせる。 + + 具体的には + <PRE> + $process = new FML::Process::なにか; + $process->run() + </PRE> + を実行する。 + + </UL> +</UL> + +<PRE> +fmlwrapper (uses) Standalone.pm + | + * 動的にライブラリ(バージョン情報を含む)を選択する + 例: /usr/local/lib/fml/5.000/ほえ/ほえ.pm + | + fml + * 動的にクラスをバインディングしつつ、プロセススタートする。 + 実際のコードは $process->run() などとなるが、書き下すと + このようになるだろう。 + + FML::Process::Distribute->run() | + FML::Process::Command->run() |-(uses)-> FML::Process::Kernel + FML::Process::Mead->run() | | + |- FML::Parse + |- FML::Config + |- FML::Log + |- ... その他 ... +</PRE> + +<!-- =================================================================== --> +</BODY> +</HTML> diff --git a/fml/libexec/fml b/fml/libexec/fml new file mode 100755 index 00000000..cdc342f5 --- /dev/null +++ b/fml/libexec/fml @@ -0,0 +1,121 @@ +#!/usr/local/bin/perl -w +#-*- perl -*- +# +# Copyright (C) 2000 Ken'ichi Fukamachi +# All rights reserved. +# +# $FML$ +# + +package FML; + +use vars qw($debug); +use strict; +use Carp; + + +# Descriptions: top level process switch +# 1. initialize processes and load configurations from *.cf +# switch to each process according with $0 and @ARGV. +# 2. parse the incoming message(mail) +# 3. start the main transaction +# lock, execute main routine, unlock +# 4. inform error messages, clean up and more ... +# Arguments: $args +# XXX non OO interface +# Side Effects: process running :-) +# Return Value: none +sub main::ProcessSwitch +{ + my ($args) = @_; + + # 1. create process + my $pkg = _package_we_use($args); + eval qq{ require $pkg; }; # XXX require() needs bare words. + $pkg->import(); # fake to use() method. + my $process = $pkg->new($args); # create a new process object + + # 2. parse the incoming message (e.g. STDIN) + $process->prepare($args); + + # 3. start main transaction + $process->run($args); + + # 4. closing the process + $process->finish($args); +} + + +# Descriptions: determine package we need and require() it if needed. +# Arguments: $args +# XXX non OO interface +# Side Effects: +# Return Value: FML::Process::SOMETHING process object +sub _package_we_use +{ + my ($args) = @_; + my $name = $args->{ myname }; + my $pkg = ''; + + if ($name eq 'fml.pl' || $name eq 'distribute') { + $pkg = 'FML::Process::Distribute'; + } + elsif (( $name eq 'fml.pl' && $args->{ options }->{ ctladdr }) || + $name eq 'command') { + $pkg = 'FML::Process::Command'; + } + elsif ($name eq 'fmlserv') { + $pkg = 'FML::Process::Fmlserv'; + } + elsif ($name eq 'mead') { + $pkg = 'FML::Process::Mead'; + } +} + + + +=head1 NAME + +fml -- net/fml switch programs + +=head1 SYNOPSIS + + fml + +=head1 DESCRIPTION + +libexec/fml.pl, the wrapper, executes this program. For example, The +incoming mail to elena@fml.org kicks off libexec/distribute via +libexec/fml.pl, whereas mail to elena-ctl@fml.org kicks off +libexec/command finally. + + incoming_mail => + elena@fml.org => fml.pl => libexec/distribute + elena-ctl@fml.org => fml.pl => libexec/command + elena-admin@fml.org => forwarded to administrator(s) + OR + => libexec/mead + +C<-d> + debug on. + +=head1 FLOW AROUND COMPONENTS + + | <=> FML::BaseSystem + | load configuration files + | start logging service + | + | STDIN => FML::Parse + | $CurProc->{'incoming_mail'} <= + | $CurProc->{'credential'} + | + | (lock) + | prepare article + | $CurProc->{'article'} is spooled in. + | $CurProc->{'article'} <=> Service::SMTP + | (unlock) + V + +=cut + +1; diff --git a/fml/libexec/fmlwrapper b/fml/libexec/fmlwrapper new file mode 100755 index 00000000..33e0d8f1 --- /dev/null +++ b/fml/libexec/fmlwrapper @@ -0,0 +1,103 @@ +#!/usr/local/bin/perl -w +#-*- perl -*- +# +# Copyright (C) 2000-2001 Ken'ichi Fukamachi +# All rights reserved. +# +# $Id$ +# $FML$ +# + +use vars qw($MainCF); +use strict; +use Carp; + +# main configuration file for directory switch +$MainCF = '/etc/fml/main.cf'; + +eval { &Bootstrap();}; +if ($@) { print STDERR "Error: ", $@, "\n";} + +exit 0; + + +BEGIN { + use File::Basename; + unshift(@INC, dirname($0)); + require Standalone; +} + + +sub Bootstrap +{ + # 1. main.cf exists and I can open it? + -f $MainCF || die("cannot find ${MainCF}"); + my $fh = new FileHandle $MainCF; + defined($fh) || die("cannot find ${MainCF}"); + + # 1.1 o.k. try to load main.cf + my $config = Standalone::load_cf($MainCF); + my $libexec_dir = $config->{ libexec_dir }; + my $default_config = $config->{ default_config }; + + # 2. pick up *.cf files to read and set them to @cf. + # We pass it to fml_loader. + # pass *.cf files to libexec/{distribute,command} + # for example + # @cf = ( /etc/fml/defaults/$VERSION/default_config.cf + # /etc/fml/domains/$DOMAIN/config.cf + # /var/spool/ml/elena/config.cf + # ); + my @cf = ($default_config); + my %optargs = (); + for (@ARGV) { + if ($_ eq '--ctladdr') { + $optargs{ ctladdr } = 1; + } + elsif (-d $_) { + push(@cf, "$_/config.cf") if -f "$_/config.cf"; + } + elsif (-f $_) { + push(@cf, "$_"); + } + } + + # 3. reset @INC + use lib qw( $config->{ local_lib_dir } $config->{ lib_dir }); + + # 4. inspect my mode from $0 + use File::Basename; + my $myname = basename($0); + + # 5. o.k. here we go! + require "$libexec_dir/fml"; + ProcessSwitch( + { + main_config => $config, + cf_list => \@cf, + myname => $myname, + options => \%optargs, + }); +} + + +=head1 NAME + +fml.pl -- wrapper which executes the real fml5 programs. + +=head1 SYNOPSIS + +fml.pl C<[-d]> C<[--ctladdr]> $mail_list_address + +=head1 DESCRIPTION + +C<$mail_list_address> + Hmm,,,? + +C<-d> + debug on. + +C<--ctladdr> + execute fml/libexec/command. + +=cut |
