余録:worldCup/scala/ex05/wcFrame.scala

  1: //..+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
  2: 
  3: /* ---------------------------------------- demo: scala
  4: cd /Users/sketch/home_sketch/worldCup/scala/
  5: 
  6: scalac ex05/wcFrame.scala
  7: scala WorldCup
  8: */
  9: 
 10: // ----------------------------------------
 11: import swing._
 12: 
 13: object WorldCup extends SimpleSwingApplication {
 14:   println("version: #1.0.30")
 15: 
 16:   def top = new MainFrame {
 17:     title = "FIFA World Cup #05"
 18:     contents = TopPanel
 19:   }
 20: }
 21: 
 22: // ----------------------------------------
 23: import javax.swing.ImageIcon
 24: 
 25: object TopPanel extends FlowPanel {
 26:   def _leftComponent = new Label {
 27:     icon = new ImageIcon("matches/wc2010logo.png")
 28:     text = "2010 FIFA World Cup South Africa"
 29:     horizontalAlignment = Alignment.Center
 30:     verticalTextPosition = Alignment.Top
 31:     horizontalTextPosition = Alignment.Center
 32:     preferredSize = new Dimension(120,150)
 33:   }
 34:   def _rightComponent = new Label {
 35:     icon = new ImageIcon("matches/fifa.png")
 36:     preferredSize = new Dimension(180,0)
 37:   }
 38:   contents += new SplitPane {
 39:     orientation = Orientation.Vertical
 40:     oneTouchExpandable = true
 41:     dividerLocation = 100
 42:     leftComponent  = _leftComponent
 43:     rightComponent = _rightComponent
 44:   }
 45: }
 46: 
 47: // ========================================

Java の素描 #005: リファクタリング:局所関数を利用する

記事一覧 Java.use(better, Swing=Scala) #FIFA World Cup への道《Scala2.8.0》

Java の素描 Scala 弾丸ツアー:時短プログラミング生活のすすめ 〜

《著》小粒ちゃん@湘南組《監修》タマゴ倶楽部

第1版♪2003/05/23 ● 第2版♪2006/04/03 ● 第3版♪2010/06/11● 第4版♪2010/07/14

》作業中です《

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)
■ プログラムを実行する

ここでは、リファクタリングの前後で変化がないことを確認します。

$ jython -i ex05/wcFrame.py
>>> 

》作業中です《


関連記事

@

TOP

Last updated♪2010/07/31