n n 4 l 1 HTML renderer original

  • Slides: 25
Download presentation

+ 破壊的クラス拡張 n 別ファイルに差分のみ を記述することでメソ ッドの追加・再定義で きる機能 n 変更をモジュール化で きる 4 l 1: HTML

+ 破壊的クラス拡張 n 別ファイルに差分のみ を記述することでメソ ッドの追加・再定義で きる機能 n 変更をモジュール化で きる 4 l 1: HTML renderer original file class Webpage{ void set. Popup. Item(Popup p, HTML text){ // set text } void popup(HTML text){ Popup p = new str){ Popup(); void print(String set. Popup. Item(p, text); … } // standard output 再定義 l 2: web browser 追加 another file revise Webpage{ void set. Popup. Item(Popup p, HTML text){ alert(“disabled”); } void on. Click(){ void str){ URLprint(String url = m. get. URL(); // standard output } popup(url); Gluon. Jによ るコード例

+ void popup(HTML text){ set. Popup. Item(p, text); void set. Popup. Item (Popup p,

+ void popup(HTML text){ set. Popup. Item(p, text); void set. Popup. Item (Popup p, HTML text){ // show a popup window } 変更の衝突 l 1: HTML renderer void set. Popup. Item (Popup p, HTML text){ } void set. Popup. Item (Popup p, HTML text){ alert(“disabled”); } l 2: web browser どのset. Popup. Item メソッドが 有効になるか 分からない Application l 3: HTML viewer void check() { popup(…); …} 5

提案:有効にする + メソッドの切り替え void popup(HTML text){ set. Popup. Item(p, text); void set. Popup. Item

提案:有効にする + メソッドの切り替え void popup(HTML text){ set. Popup. Item(p, text); void set. Popup. Item (Popup p, HTML text){ // show a popup window } l 1: HTML renderer void set. Popup. Item (Popup p, HTML text){ } void set. Popup. Item (Popup p, HTML text){ alert(“disabled”); } l 3: HTML viewer l 2: web browser Application void check() { popup(…); …} 6

+ モジュール機構:Method Shells n モジュール: methodshell n 破壊的クラス拡張とクラス宣言を含む n 有効にするメソッドを切り替えられる n shellグループ n n

+ モジュール機構:Method Shells n モジュール: methodshell n 破壊的クラス拡張とクラス宣言を含む n 有効にするメソッドを切り替えられる n shellグループ n n 一度に有効にするメソッドの集合 include宣言によって定義 n shellグループの切り替え n link宣言によって定義 renderer methodshell renderer; class Webpage{ void set. Popup. Item(Popup p, HTML text){ // set text } void popup(HTML text){ Popup p = new Popup(); set. Popup. Item(p, text); … } } 7

shellグループの定義・拡張 + n include宣言でshell グループを定義・ 拡張できる n 一度に有効になる n includeした methodshell中の メソッドは再定義 できる include

shellグループの定義・拡張 + n include宣言でshell グループを定義・ 拡張できる n 一度に有効になる n includeした methodshell中の メソッドは再定義 できる include 宣言 link 宣言 shell グループ 9 renderer methodshell renderer; class Webpage{ void set. Popup. Item(Popup p, HTML text){ // set text     } void popup(HTML text){ Popup p = new Popup(); } set. Popup. Item(p, text); … } browser methodshell browser; include renderer; revise Webpage{ void set. Popup. Item(Popup p, HTML text){ alert(“disabled”);        } void on. Click(){ URL url = m. get. URL(); popup(url);      } } 再定義

shellグループの切り替え + 10 viewer methodshell n link宣言で切り替え 先のshellグループを 指定する n link宣言しているshell グループ内のメソッド を呼び出すと、shellグ ループが切り替わる

shellグループの切り替え + 10 viewer methodshell n link宣言で切り替え 先のshellグループを 指定する n link宣言しているshell グループ内のメソッド を呼び出すと、shellグ ループが切り替わる methodshell viewer; renderer; include renderer; revise Webpage{ void set. Popup. Item(Popup p, HTML text){ // set text     } void check(){ check(File f){ popup(…); …} } application methodshell application; link viewer; include 宣言 link 宣言 shell グループ void main(){ Webpage w = new Web. Page(); w. check(); w. on. Click();     } checkメソッド が呼ばれると、 切り替わる }

void popup(HTML text){ set. Popup. Item(p, text); } void set. Popup. Item (Popup p,

void popup(HTML text){ set. Popup. Item(p, text); } void set. Popup. Item (Popup p, HTML text){ // show a popup window } + 全体図 11 renderer void set. Popup. Item (Popup p, HTML text){ alert(“disabled”); } void on. Click(){ popup(get. URL()); } void set. Popup. Item (Popup p, HTML text){ //show bold and red text } viewer browser void main(){ w. on. Click(); w. check(); include 宣言 link 宣言 shell グループ } application Application void check() { popup(…); …}

void popup(HTML text){ set. Popup. Item(p, text); } void set. Popup. Item (Popup p,

void popup(HTML text){ set. Popup. Item(p, text); } void set. Popup. Item (Popup p, HTML text){ // show a popup window } + 全体図 12 renderer void set. Popup. Item (Popup p, HTML text){ alert(“disabled”); } void on. Click(){ popup(get. URL()); } void set. Popup. Item (Popup p, HTML text){ //show bold and red text } viewer browser void main(){ w. on. Click(); w. check(); include 宣言 link 宣言 shell グループ } application Application void check() { popup(…); …}

void popup(HTML text){ set. Popup. Item(p, text); } void set. Popup. Item (Popup p,

void popup(HTML text){ set. Popup. Item(p, text); } void set. Popup. Item (Popup p, HTML text){ // show a popup window } + 全体図 13 renderer void set. Popup. Item (Popup p, HTML text){ alert(“disabled”); } void on. Click(){ popup(get. URL()); } void set. Popup. Item (Popup p, HTML text){ //show bold and red text } viewer browser void main(){ w. on. Click(); w. check(); include 宣言 link 宣言 shell グループ } application Application void check() { popup(…); …}

+ 23 関連研究 n 破壊的クラス拡張のスコープを制限 Classbox[’ 05 Alexandre, et al. ] n Rubyのrefinement n

+ 23 関連研究 n 破壊的クラス拡張のスコープを制限 Classbox[’ 05 Alexandre, et al. ] n Rubyのrefinement n New. Speak[‘ 10 Bracha, et al. ] n n 有効なメソッドの切り替えはできない n 有効な破壊的クラス拡張の実行時切り替え Us[’ 96 Smith, et al. ] n Context-oriented Programming[’ 08 Hirschfeld, et al. ] n n Method Shellsの方がより宣言的