ࡱ>  ( / 00DArialr NewmanTTP ܖ 0ܖ"DTimes New RomanTTP ܖ 0ܖ DWingdingsRomanTTP ܖ 0ܖ0DCourier NewmanTTP ܖ 0ܖ1@ .  @n?" dd@  @@``_camera.wav.WAV 10105RIFFWAVEfmt ++datah||||||||||||||||||||||||||||||||||||||||x|x|||x|tx||||xx|||xx|||||x|x||||||x|xx|t||||cgxkxxt|x|t|ttxxox||xxto||xt||t|x||t||oxkxx|xo|||ttt|ox||ot||xx|xot|||x|x||xt|xx|xx|t||xtxx|x||t||||||x|t||||ttxx|xt|x|ox|o||x||t|oxxot|t|o|xxx||||x|x||t|||||||||x||xxtxt|xxx|xx|xx||t||xxt|x|||xtxxxx|||||t||xx|||t|xx|xx|xox||||xxox|x|||xxxxt|x|xxt|||||xokkgWto|tk||t_|kxot|x|o|x|||xx|x||xo|x|xx|x|xtx|otxx|xx|||tx||||||xxoxo|t||ktxxx|xttto|t|k|||x|||oxo||txoto|x|xx||xkk|t||||xx|t|xxto|x|kt||||xtt|||||||xxx|ttxtxx|||c|k|||xtxxtxx|x|x|||x||||||x||||xxo|g|x||x|||xt|||||||||||x||||||x||||||x|x||x||||||xxx|o[ooBtWt™F_gtBW|gJcttFtogotxgoo|xo|x|||ox|xxx|xxx||x|||||||x|xx|x|||||x|x|x||x|x||x||||xx||||tkt_|o|tk_xNƀ)JۀgtgSk FB%||>gc:ΑtSx)k[[>xk_xx[[cSco[ookc_ooƀkx|So||gxxg|tc|to[|kct|totkgo|oooo||ktt|txtxk||||||xx|xx|txt|||t|||||x||||xx||||||||||x|||||x||tx|||||||x|txtxx|||||x||xxxt|||||t|||xx||||||xx|x||||x||||||xox||o|gc||tok||ttotxx|t|x|xx||o|x|||x|txx||x||xxxxx||||||xxx|x||||||||x||||||||||||||||||||||tx|x||txt||xx|x|xxxxxxx|||||xxxxx|||x||||||x|||toxxxxg|ox|ott|c|x|ox|tt||||||||xtt|||||||||||||||||x|||x|txxx|xx|||x||x||||||||||x|||||x|x||xx||||||||x|||||||||||||||||x||||||||||||||||||x||||||x||||||||||||x|x||xxx|x||||||||x|||x|||xx|||tx||||ot|o|x||xt||xtt|||||||||||||||xx||||xxtxx|||||||x|||txx|xxxxx|txxt||t|x||xx||||||xx|xxx|||xxx|xtx|t||||x|||||||||x|||||x|xt|xxxtx|x|x|xx||||||xxxx||xxxt|xx|xtx|t|xxt|x|x|txx||x|||xx||x|x||||||||x|x|||t|txx|xt|t|txx|t||xxx||x|x||xx|t|x||x||x|x||x|t||txttx|t||xt||x||||xxxx|xttx|t|txx|||x|t|x|||||x|||x|||x||txto|x|x||txx|||xx|xx|x||xox|tt||x|x||x|tt|||||x|x||x|x||x|tt||tot||x|t|x||||||x|||||xx||t||xx||x|xo||ttx||x||||x|x||x|||xxt|ox|xtxx|||txx|||tt||x|||o||t|t|xtxxx|||xxo||xt|x|xtkkkot|x|t||||x|||||x|||xx||x|x||x|||ttxxx|Nktg|gocxo|o|ttgt|xxxxt|t||x||x|txx|x||xx|||xt|||x|x|||||||tt|||||t|x|||||xt|t|x|x|tx||t||x||ox|ttxt|xtot|g|xt|||||xxx|||||xtxx||t|t|x|xx||||||||x|||t|||xt|||tx||x|ttttxt|x||||t|x|xo||tx||txxx||x|||t||||x|||xxxtt||||xt|x||xxxxxx|tt|o|gxt||tg|txx||tkkFokx_toc|tot||cxxoo|xxtxoo|kx|xktx||ot|txx|x|||x|txxkt|xtxxt|xtktt|t|xxxxxxx|xk||t||x||||x|xttot|xoto|oxxtoxx||xxx|t|x|txx|x||xxt|o|||kxxx||x|x|||t|||x|||xxkxttxxxxk||xtox|xx|xtt||t|txx|t||x||x|xtcߌƑct__|SWo|Nott[_t|gokx|tkxgtttcokkxxxxgc||||xxt|||x|x|xtxxx||||tt||x||||x||x|||||||||x|||xx||||x||||||||||x|||||||||||||||||xx|||||||||||||||||||||||||||||||||x||||||x|||||xx||||||||x|||||||||||||||||||||||||||||||x|||||x|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||x|||||xx|||||||x||||||||||||||||||||||||||xx||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| `,**21//// HH,,          =>ABCDEFGIJKLMNOPQRSUVXY[\]^_`abcdefghij3 rAA8c" 3@8#ʚ;ʚ;g4`d`dP  0ppp@ <4dddd w 0TP  <4BdBd x 0T<4!d!d x 0T TEXPOINTINIT.USEAMSFONTSTrue,EMBEDFONTSTrue,USEBOLDAMSTrue(DEFAULTDISPLAYSOURCE\documentclass{slides}\pagestyle{empty} \usepackage{math-cmds} \usepackage{code} \usepackage{proof} \input{generic-defns} \input{minaop} \begin{document} \[ \begin{array}{c} \end{array} \] \end{document}  TEX2PS~latex $(base).tex; dvips -D $(res) -E -o $(base).ps $(base).dviH&EXTERNALEDITCOMMANDnotepad %D$GHOSTSCRIPTCOMMANDgswin32c8DEFAULTBITMAPpngmono2DEFAULTBLEND False>$DEFAULTTRANSPARENT FalseZ@DEFAULTWORKAROUNDTRANSPARENCYBUG False8"DEFAULTRESOLUTION300:(DEFAULTMAGNIFICATION12DEFAULTFONTSIZE12.DEFAULTWIDTH5720DEFAULTHEIGHT4650___PPT10 ?  %]MSelective Open Recursion Modular Reasoning about Components and Inheritance2N.23&q Jonathan Aldrich Carnegie Mellon University Kevin Donnelly Boston University@989 8 Outline\The Fragile Base Class Problem Selective Open Recursion Implementation & Analysis Discussion]>\X"Inheritance and Information HidingParnas advice: Modularize a system to hide information that may change 688CC?"Inheritance and Information Hiding>Parnas advice: Modularize a system to hide information that may change Research question How to hide information in component-based systems with inheritance?L8E8EVSA Challenge: Open Recursion:Recursion Objects can make self-calls to their own methods< 1  ]YA Challenge: Open RecursionRecursion Objects can make self-calls to their own methods Open Recursion Self-calls are dynamically dispatched I.e., target of call is  open and can be overridden Beneficial in  template method design patterns 1&50  &50XWOpen Recursionclass Window { void draw() { // draw background this.drawForeground(); } void drawForeground() { & } } class MyWindow { void draw() { super.draw(); } void drawForeground() { super.drawForeground(); ... } ... }JP@{t:   ^ZOpen Recursionclass Window { void draw() { // draw background this.drawForeground(); } void drawForeground() { & } } class MyWindow { void draw() { super.draw(); } void drawForeground() { super.drawForeground(); ... } ... }8Pt:   JF Hook MethodsHook methods Called by this when some event occurs Intended as extension point for subclasses Open recursion is necessary h PmPPP  __] Hook MethodslHook methods Called by this when some event occurs Intended as extension point for subclasses Open recursion is necessary Other methods Perform some task May be overridden, but has no  event semantics Open recursion unnecessary At best, minor convenience Has potential to cause the Fragile Base Class Problem PmPP]PQP  _]6    D@The Fragile Base Class Problemclass CountingSet extends Set { private int count; void add(Object elem) { super.add(elem); count++; } void addAll(Collection c){ super.addAll(c); count+=c.size(); } int size() { return count; } // other functions }8Z     1YTThe Fragile Base Class Problemclass CountingSet extends Set { private int count; void add(Object elem) { super.add(elem); count++; } void addAll(Collection c){ super.addAll(c); count+=c.size(); } int size() { return count; } // other functions }8Z     1FBThe Fragile Base Class ProblemDefinition (for this instance of FBC) A class may depend on the calling patterns of a superclass, and break if these are changed8&[ [V !HCTwo Solutions to the FBCFDocument open recursion [Kiczales & Lamping, Steyaert et al., Ruby & Leavens] Exposes information, rather than hiding it Prohibits natural changes to superclass Use forwarding to avoid open recursion [Bloch,Szyperski] Gives up benefits of open recursion Can we get the benefits of open recursion without the reasoning costs?P6PSPP'PP$PPGP6S  '$HP a *n`[Two Solutions to the FBCFDocument open recursion [Kiczales & Lamping, Steyaert et al., Ruby & Leavens] Exposes information, rather than hiding it Prohibits natural changes to superclass Use forwarding to avoid open recursion [Bloch,Szyperski] Gives up benefits of open recursion Can we get the benefits of open recursion without the reasoning costs?P6PSPP'PP$PPGP6S  '$GP a *na\Two Solutions to the FBCFDocument open recursion [Kiczales & Lamping, Steyaert et al., Ruby & Leavens] Exposes information, rather than hiding it Prohibits natural changes to superclass Use forwarding to avoid open recursion [Bloch,Szyperski] Gives up benefits of open recursion Can we get the benefits of open recursion without the reasoning costs?P6PSPP'PP$PHP6S  '$GP a *nIEOutline\The Fragile Base Class Problem Selective Open Recursion Implementation & Analysis Discussion&]%KGSelective Open RecursionUse open recursion only where necessary Hook methods Use open modifier on method Expresses  hook method intent All calls to open methods dispatched dynamically Just as in Java today (PP PPP1PPP(        b^Selective Open RecursionUse open recursion only where necessary Hook methods Use open modifier on method Expresses  hook method intent All calls to open methods dispatched dynamically Just as in Java today Other methods Calls to non-open methods on this dispatched statically The only change vs. Java Hides internal calling patterns from subclasses Other calls dispatched dynamically open `" virtual(PP PPP1PPP8PIP#PP(         I#    $"$$#$LH!Selective Open Recursion Examples""(class Set { void add(Object o) { // adds an element } void addAll(Collection c){ foreach (Object o in c) this.add(o); } } add is not open, so subclass cannot intercept and depend on the call. Set can change without affecting subclasses. #V 8*P (  c_!Selective Open Recursion Examples""(class Set { void add(Object o) { // adds an element } void addAll(Collection c){ foreach (Object o in c) this.add(o); } } add is not open, so subclass cannot intercept and depend on the call. Set can change without affecting subclasses.#V 8)P (  ~ class Set { // invoked for each add op. open void add(Object o) { // adds an element } void addAll(Collection c){ foreach (Object o in c) this.add(o); } } add is open, indicating the developer s intent to expose this method as a semantic event to subclasses. Any changes to class Set must preserve these semantics.U V s P6 (  MIDesign PrinciplesDNon-open as default Only use open recursion when explicitly intended:1 1d`Design PrinciplesNon-open as default Only use open recursion when explicitly intended Annotate the method, not the call Design intent is attached to operation`1"' 1"'NJ#Do you have to change the language?$$(Coding guidelines Never call a public method on this Hook methods should be protected Non-hook, protected methods should be final Not our idea Suggested by Ruby & Leavens Used extensively in JDK libraries ZpZ Z@ZZG Bea#Do you have to change the language?$$(hCoding guidelines Never call a public method on this Hook methods should be protected Non-hook, protected methods should be final Not our idea Suggested by Ruby & Leavens Used extensively in JDK libraries However This solution relies on programmer discipline Language integration provides automated checkingZpZ Z>Z Z_ZG > _  OKOutlinelThe Fragile Base Class Problem Selective Open Recursion Implementation & Analysis Future work and Conclusion&m8PLImplementation in JavaExtension to Barat compiler Bokowski & Spiegel Rewrite calls to non-open methods on this Call a final method with the implementation for the current class Available at http://www.archjava.org/*B& 6 >  QMOpen Recursion InferencevAnalysis to compute open annotations Method m in class C must be open if: Method m in class C <= C calls this.m Class C  <= C overrides m Class C  inherits or super-calls C .m ~%%p r,k?fbOpen Recursion InferenceAnalysis to compute open annotations Method m in class C must be open if: Method m in class C <= C calls this.m Class C  <= C overrides m Class C  inherits or super-calls C .m Results may be imperfect Assumes whole program is available Misses open methods that are not overridden May mark methods open that should be refactored to be non-open %%l#,? l  #!%>k? RO Experiments_Ran open recursion inference java.* packages in JDK 1.4.2 Except java.nio, java.sql (see paper):&&,A gc ExperimentsRan open recursion inference java.* packages in JDK 1.4.2 Except java.nio, java.sql (see paper) Hypotheses Open recursion is rarely needed Selective open recursion enables more optimizationj& S&  S,AkSPFrequency of Open RecursionV9897 methods in our portion of stdlib 246 (2.5%) of methods were inferred open <UPPJ2hdFrequency of Open Recursion89897 methods in our portion of stdlib 246 (2.5%) of methods were inferred open Maybe the stdlib doesn t use inheritance 1394 of these methods are overridden Only 18% of these are open Open recursion is rarely needed Thus making it selective may enable substantial information hidingyPAP PCPJ*; C,5ieFrequency of Open Recursion89897 methods in our portion of stdlib 246 (2.5%) of methods were inferred open Maybe the stdlib doesn t use inheritance 1394 of these methods are overridden Only 18% of these are open Open recursion is rarely needed Thus making it selective may enable substantial information hidingyPAP PCPJ*; C,5TQOptimization Potential22339 calls in our portion of stdlib 6852 self-calls 716 to open methods Must be dynamically dispatched 6136 to non-open methods Can be inlined in our proposal (27% of total calls) Inlining in Java would require private, final, or whole-program analysisb5}5} >d&AUNOutlinelThe Fragile Base Class Problem Selective Open Recursion Implementation & Analysis Future Work and ConclusionmRWR-Future Work: Application to Formal Reasoning..(8Formalizing as Featherweight Java + module system  79jf-Future Work: Application to Formal Reasoning..(Formalizing as Featherweight Java + module system Goal: bisimulation-based proof technique for showing contextual equivalence of modules in the presence of inheritance H8 ikg-Future Work: Application to Formal Reasoning..( Formalizing as Featherweight Java + module system Goal: bisimulation-based proof technique for showing contextual equivalence of modules in the presence of inheritance Use selective open recursion and other techniques to provide more information hiding i.e. prove more programs equivalent*$$8 ZV ConclusionOpen Recursion complicates reasoning rarely used in practice Selective open recursion retains benefits of open recursion where needed avoids fragile base class problem can be efficiently inferred may allow more optimization and reasoningL%%[UGDOpen Recursionclass Set { void add(Object elem) { // adds an element } void addAll(Collection c) { foreach (Object o in c) this.add(o) } ...RZ&Vb &   class CountingSet extends Set { private int count; void add(Object elem) { super.add(elem); count++; } void addAll(Collection c){ super.addAll(c); count+=c.size(); } int size() { return count; } // other functions }BZ     1   0` ff3ff` JMMM3ff` @@ff3̙3` fMMM3f3f3` fff333` 3ffMMM` 33f3___` ff3ff>?" dP@,?nKd@`A `7@d`hU n?" dd@   @@``PT    @ ` `>p>> zr  (  DT 0  "0  <,| "0 20  <8 " 20hB  s *D1"PD`D  6  "*P`   T Click to edit Master title style! !$  0  "P`p   RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  6쉺  "`P`   >*   6  "`    @*   6  "``   @* H  0޽h ? ff3ff80___PPT10.  O Refined?  0 @ ?(  T    "   B,p" ,$D 0 20  Tf ?"P] 20B  TDjJ?"@@  6|% "\  T Click to edit Master title style! !  08z "0 `    W#Click to edit Master subtitle style$ $  6dQ "`R`  >*   6F "`   @*   6 [ "fd  @* H  0޽h ? ff3ff80___PPT10.  O 0 00(  x  c $lL  x  c $O `   H  0޽h ? 33___PPT10i.iJl+D=' = @B +m  0 p$(  r  S *P`   r  S P`p  H  0޽h ? ff3ffy___PPT10Y+D=' = @B +  0 $0(  $x $ c $p *P`   x $ c $d4P`p  H $ 0޽h ? ff3ff___PPT10i.ܾ#+D=' = @B +}  0 $(  r  S ܖT*P`  T r  S LTP`p T H  0޽h ? ff3ff___PPT10i.ܾ#+D=' = @B +}  0 0$(  r  S HV*P`   r  S tP`p  H  0޽h ? ff3ff___PPT10i. 1hH+D=' = @B +  0 (0(  (x ( c $ܐ*P`   x ( c $\P`p  H ( 0޽h ? ff3ff___PPT10i. 1hH+D=' = @B +O  0 f^(  x  c $*P`   x  c $P( 0  l  68c"   B8c"  8Window   6<8c"`S 6draw   6P8c"`FS* TdrawFore     BhCPDEF8cD8Ph$P@  "`JH  0޽h ? ff3ff___PPT10i. 1hH+D=' = @B +c  0 z r , (  ,x , c $`1*P`   x , c $ P( 0  l , 68c"  , BD8c"  8Window  , 68c"`S 6draw  , 6l8c"`FS* TdrawFore   ,  BhCPDEF8cD8Ph$P@  "`Jl  , 68c" : H    , B8c" 0 > x  8Window   , 6Ĭ8c"`Z >  6draw   , 6,F 8c"`   TdrawFore  l  , 68c" :   , B4޺ 8c" 0   TMyWindow   , 6 8c"`Z c(>  6draw  , 6( 8c"` c(  TdrawFore   ,  BCDEF8c$lXL@  "` `P  ,  BCDEF8c$lXL@  "`` `P( dB , <DԔ 0 H , 0޽h ? ff3ff___PPT10i. 1hH+D=' = @B +}  0 P$(  r  S 0i*P`   r  S lP`p  H  0޽h ? ff3ff___PPT10i.+D=' = @B +  0 80(  8x 8 c $*P`   x 8 c $TP`p  H 8 0޽h ? ff3ff___PPT10i.+D=' = @B +%   0 < 4  (  r  S  P *P`  P  x  c $P%P  ( p P  l  68c" H :   Bd+8c" > r  5Set   6 8c"`   RaddAll   6\|8c"`f J 5add l   68c" :    Bx8c" } W CountingSet      6P8c"` c( RaddAll    6d8c"`fc(J 5add     BCDEF8c$lXL@  "`p`P8   BCDEF8c$lXL@  "``PH  0޽h ? ff3ff___PPT10i.ݾgø+D=' = @B +   0   P( (  x  c $T*P`   ~  s *B ( p  l  68c" H :   Bp8c" > r  5Set   6 8c"`   RaddAll   6X8c"`f J 5add l  68c" :    B8c" } W CountingSet      6PH8c"` c( RaddAll    6 08c"`fc(J 5add     BCDEF8c$lXL@  "`p`P8    BCDEF8c$lXL@  "``PdB  <DԔ0Pp  B8c"` p vImplicit assumption: Set.addAll does not call Set.add If this assumption is violated (or changed), CountingSet breaksw w> / dB  <DԔP   H  0޽h ? ff3ff___PPT10i.ݾgø+D=' = @B +}  0 $(  r  S T*P`  R r  S hLP`p R H  0޽h ? ff3ff___PPT10i.߾ -+D=' = @B +}  0  $(  r  S ,R*P`  R r  S RP`p R H  0޽h ? ff3ff___PPT10i.߾`H+D=' = @B +  0 00(  0x 0 c $T*P`   x 0 c $4IP`p  H 0 0޽h ? ff3ff___PPT10i.߾`H+D=' = @B +  0 40(  4x 4 c $*P`   x 4 c $P`p  H 4 0޽h ? ff3ff___PPT10i.߾`H+D=' = @B +y  0 @0(  x  c $S*P`   x  c $,XP`p  H  0޽h ? ff3ffy___PPT10Y+D=' = @B +  0 `0(  x  c $@**P`   x  c $,/P`  H  0޽h ? ff3ff___PPT10i.+D=' = @B +  0 <0(  <x < c $~*P`   x < c $<P`  H < 0޽h ? ff3ff___PPT10i.+D=' = @B +  0 p2(  r  S U*P`     S  (   H  0޽h ? ff3ff___PPT10i.UZ+D=' = @B +%  0 <4 @(  @x @ c $x*P`    @ c $Τ (    @ c $d    H @ 0޽h ? ff3ff___PPT10i.UZ+D=' = @B +}  0 $(  r  S *P`   r  S P`p  H  0޽h ? ff3ff___PPT10i.`]+D=' = @B +  0 0D0(  Dx D c $R*P`  R x D c $$!P P`p R H D 0޽h ? ff3ff___PPT10i.`]+D=' = @B +}  0 $(  r  S *P`   r  S (P`p  H  0޽h ? ff3ff___PPT10i.J+D=' = @B +  0 @H0(  Hx H c $ԗ*P`   x H c $<׎ P`p  H H 0޽h ? ff3ff___PPT10i.J+D=' = @B +y  0 0(  x  c $a*P`   x  c $kP`p  H  0޽h ? ff3ffy___PPT10Y+D=' = @B +}  0 $(  r  S @>*P`   r  S P`p  H  0޽h ? ff3ff___PPT10i.@Vb+D=' = @B +}  0 $(  r  S ȼ*P`   r  S ĦP`p  H  0޽h ? ff3ff___PPT10i.+D=' = @B +  0 PL0(  Lx L c $0*P`   x L c $P`p  H L 0޽h ? ff3ff___PPT10i.+D=' = @B +}  0 $(  r  S D*P`   r  S 8P`p  H  0޽h ? ff3ff___PPT10i.p$E+D=' = @B +  0 `P0(  Px P c $/*P`   x P c $P P`p  H P 0޽h ? ff3ff___PPT10i.p$E+D=' = @B +}  0 $(  r  S Ȭ*P`   r  S ѬP`p  H  0޽h ? ff3ff___PPT10i.+D=' = @B +  0 pT0(  Tx T c $*P`   x T c $ P`p  H T 0޽h ? ff3ff___PPT10i.+D=' = @B +  0 X0(  Xx X c $P*P`   x X c $D P`p  H X 0޽h ? ff3ff___PPT10i.+D=' = @B +}  0 $(  r  S S*P`   r  S lWP`p  H  0޽h ? ff3ff___PPT10i.0^ q+D=' = @B +y  0 0(  x  c $*P`   x  c $@ȤP`p  H  0޽h ? ff3ffy___PPT10Y+D=' = @B +}  0  $(  r  S XG*P`   r  S PP`p  H  0޽h ? ff3ff___PPT10i.`1+D=' = @B +  0 \0(  \x \ c $*P`   x \ c $P`p  H \ 0޽h ? ff3ff___PPT10i.`1+D=' = @B +  0 `0(  `x ` c $.*P`   x ` c $8 P`p  H ` 0޽h ? ff3ff___PPT10i.`1+D=' = @B +$  0 $(  r  S *P`   r  S TP`p  H  0޽h ? ff3ff80___PPT10.) 0 `0(  H  0޽h ? ff3ff___PPT10i. WUz+D=' = @B +]  0 0](  x  c $R*P`  R ~  s *R ( p R x  c $d p R 3  Bw8c"` F  cCalls to this are dispatched to subclass Thus subclass can tell exactly when each method is called4d  WdB  <DԔ` @@ H  0޽h ? ff3ff80___PPT10.ݾgør@ҏ C #F` ^ h~m5sKPFt;5K  <%kwOh+'0< hp   , 8DL4Open Modules: Reconciling Aspects and ModularityJonathan AldrichRefinedJonathan Aldrich28Microsoft PowerPoint@yB@i@nGg  lT  y--$xx--'--$ii---- $ii--'-- $ hh --'--%>>--'@Times New Roman-. +2 Selective Open Recursion."System9-@Times New Roman-. *2 (#Modular Reasoning aboutn.-@Times New Roman-. .2 0Components and Inheritance.-@Arial-. T2 L3Jonathan Aldrich Carnegie Mellon University.-@Arial-. Q2 X1Kevin Donnelly Boston Universityt.-՜.+,0    $ COn-screen ShowCarnegie Mellon University,&*G /ArialTimes New Roman Wingdings Courier NewRefinedNSelective Open Recursion Modular Reasoning about Components and InheritanceOutline#Inheritance and Information Hiding#Inheritance and Information HidingA Challenge: Open RecursionA Challenge: Open RecursionOpen RecursionOpen Recursion Hook Methods Hook MethodsThe Fragile Base Class ProblemThe Fragile Base Class ProblemThe Fragile Base Class ProblemTwo Solutions to the FBCTwo Solutions to the FBCTwo Solutions to the FBCOutlineSelective Open RecursionSelective Open Recursion"Selective Open Recursion Examples"Selective Open Recursion ExamplesDesign PrinciplesDesign Principles$Do you have to change the language?$Do you have to change the language?OutlineImplementation in JavaOpen Recursion InferenceOpen Recursion Inference Experiments ExperimentsFrequency of Open RecursionFrequency of Open RecursionFrequency of Open RecursionOptimization PotentialOutline.Future Work: Application to Formal Reasoning.Future Work: Application to Formal Reasoning.Future Work: Application to Formal Reasoning Conclusion Slide 41Open Recursion  Fonts UsedDesign Template Slide Titles*(_&0Jonathan AldrichJonathan Aldrich  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root EntrydO)Current UserSummaryInformation(PowerPoint Document(,&DocumentSummaryInformation8Root EntrydO)Current UserMSummaryInformation(PowerPoint Document(,&'_&Gary T. LeavensGary T. Leavens