Java の素描 #023:《余録》リファクタリングの詳細な手順
‖記事一覧‖ Java.use(better, Swing=Jython) #FIFA World Cup への道《Jython2.5》
Java の素描 〜 Jython 弾丸ツアー:時短プログラミング生活のすすめ 〜
《著》森こねこ、伊藤うさぎ、小粒ちゃん@湘南組《監修》タマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2006/04/03 ● 第3版♪2010/06/11
|関連記事|
Step23:《余録》リファクタリングの詳細な手順
■ クラスを抽出する
新たなモジュール wcView 用意した後で、クラス WcControlPane を抽出するまでの、詳細な手順を示します。
## ---------------------------------------- wcFrame.py class TopPanel(JPanel):def _controlPane(self, group, **keys): ... comp = tablePane() return comp## ---------------------------------------- wcView.py def _controlPane(self, group, **keys): ... comp = tablePane() return comp
メソッド _controlPane を、新たなモジュール wcView に転記(移動)します。
## ---------------------------------------- before def _controlPane(self, group, **keys): ... comp = tablePane()return comp## ---------------------------------------- after #1 class WcControlPane: def __init__(self, subject, group, **keys): self.subject = subject ... self.comp = tablePane()
まず、新たなクラス WcControlPane を用意します。次に、メソッドの名前を _controlPane から __init__ へと変更します。そして、新たな引数 subject を挿入するとともに、インスタンス属性 self.subject を初期設定します。さらに、一時変数 comp に代えて、インスタンス属性 self.comp を用意した後で、リターン文を削除します。
## ---------------------------------------- before class TopPanel(JPanel): def __init__(self, master, *args, **keys): ...self.table = {}## ---------------------------------------- after #2 class WcControlPane: table = {}
クラス TopPanel では、インスタンス属性 self.table を削除するのに代えて、クラス WcControlPane では、これをクラス属性 table にします。
## ---------------------------------------- before class TopPanel(JPanel):def __call__(self, e): # javax.swing.event.ListSelectionEvent row = e.source.leadSelectionIndex value = self.table[self.group].getValueAt(row, 0) self.update_(value)## ---------------------------------------- after #3 class WcControlPane: def __call__(self, e): # javax.swing.event.ListSelectionEvent row = e.source.leadSelectionIndex value = self.table[self.subject.group].getValueAt(row, 0) self.subject.update_(value)
まず、特殊メソッド __call__ を、新たなモジュール内のクラス WcControlPane に転記(移動)します。次に、インスタンス自身 self に代えて、インスタンス属性 self.subject を介して、必要な情報をやり取りします。
》作業中です《