Java の素描 #005: リファクタリング:局所関数を利用する
‖記事一覧‖ Java.use(better, Swing=Jython) #FIFA World Cup への道《Jython2.5》
Java の素描 〜 Jython 弾丸ツアー:時短プログラミング生活のすすめ 〜
《著》森こねこ、伊藤うさぎ、小粒ちゃん@湘南組《監修》タマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2006/04/03 ● 第3版♪2010/06/11
|関連記事|
Step05: リファクタリング:局所関数を利用する
局所関数を利用すると、密接に関連するコードの断片を部品(構成要素)として扱えます。
■ 何が問題か
リファクタリングの好機のひとつは、コードの断片が大きくなりかけたときです。その行数が2桁(10行)に達すると、その機を伺います。そして、その行数が 20 行を超えたら、迷わずリファクタリングを実践します。すでに、メソッド __init__ の行数は 20 を超え 23 になりました。そこで、この機を逃さずに、リファクタリングを行います。
メソッド __init__ の本体にある、局所変数に着目します。すると、
## ---------------------------------------- step04 class TopPanel(JPanel): def __init__(self, master, *args, **keys): master.contentPane = self label1 = JLabel( ... ) label2 = JLabel( ... ) splitPane = JSplitPane( ... leftComponent = label1, rightComponent = label2, ) self.add(splitPane)
ここでは、2つの引数
に加えて、新たに3つの局所変数を導入しました。
ここで、変数が参照するオブジェクト間の依存関係に着目すると、リファクタリングの方向性が見えてきます。
たとえば、引数 self からは splitPane だけが見えれば、他は見える必要はありません。逆に、引数 master からは self が見えますが、self はそれを気に掛ける必要はありません。また、JLabel や JSplitPane に依存するコードは、その影響が他に及ばないように、独立して管理したいものです。
そこで「情報隠蔽の原則」に基づいて、必要な情報とそうでないものとに分けて管理します。
■ プログラムを変更する
## ---------------------------------------- wcFrame.py class TopPanel(JPanel): def __init__(self, master, *args, **keys): ... def leftComponent(): comp = JLabel( icon = ImageIcon("matches/wc2010logo.png"), ... ) return comp def rightComponent(): comp = JLabel( icon = ImageIcon("matches/fifa.png"), ... ) return comp def splitPane(): comp = JSplitPane( ... leftComponent = leftComponent(), rightComponent = rightComponent(), ) return comp comp = splitPane() self.add(comp)