余録:worldCup/jython/ex05/wcFrame.py
#! /usr/bin/env python # coding: utf-8 ## ---------------------------------------- ## ## (C) Copyright 2000-2010, 小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部 ## ## ---------------------------------------- ## History: Swing Example "2010 FIFA World Cup South Africa™" ## 2003/07, Java/Jython ## 2006/07, Jython ## 2008/02, Jython 2.2.1 ## 2010/06, Jython 2.5.0 #...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 """ >>> tips() >>> ## ---------------------------------------- >>> None version: #1.0.09abc """ from __init__ import * ## ---------------------------------------- demo: jython """ $ cd /Users/sketch/home_sketch/worldCup/jython/ $ jython -i ex05/wcFrame.py """ ## ---------------------------------------- from javax.swing import ImageIcon from javax.swing import JFrame from javax.swing import JLabel from javax.swing import JPanel from javax.swing import JSplitPane class TopPanel(JPanel): def __init__(self, master, *args, **keys): master.contentPane = self def leftComponent(): comp = JLabel( icon = ImageIcon("matches/wc2010logo.png"), text = u"2010 FIFA World Cup South Africa™", horizontalAlignment = JLabel.CENTER, verticalTextPosition = JLabel.TOP, horizontalTextPosition = JLabel.CENTER, preferredSize = (120, 150), ) return comp def rightComponent(): comp = JLabel( icon = ImageIcon("matches/fifa.png"), preferredSize = (180, 0), ) return comp def splitPane(): comp = JSplitPane( orientation = JSplitPane.HORIZONTAL_SPLIT, oneTouchExpandable = True, dividerLocation = 100, leftComponent = leftComponent(), rightComponent = rightComponent(), ) return comp comp = splitPane() self.add(comp) ## ---------------------------------------- def tips(): global Qt; Qt = \ frame = JFrame( title = "FIFA World Cup #05", size = (320,180), locationRelativeTo = None, defaultCloseOperation = JFrame.EXIT_ON_CLOSE, ) TopPanel(frame) frame.visible = True ## ---------------------------------------- if __name__=='__main__': inform() testmod() ## ========================================
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)