例題で学ぶデザインパターン #3: リスト、内包、reduce
例題で学ぶ Jython/Swing デザインパターン《Jython2.5》
リスト、内包、reduce
■ 概要
アプリケーションを作成する過程を通して、Jython/Swing によるデザインパターンを習得します。
この課題では、Swing/GUI を使って階層構造を持つ情報を提示します。〈GoF〉Composite/Iterator/Visitor/Command パターンを導入すると、if/for 文によるコードの汚染、配列の境界問題が解消されるので、要求仕様の変更にも柔軟に対処でき、簡潔で見通しの良いコードを記述できるようになります。
《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
事例:モジュールを起動する
モジュールを起動すると、次のようなウィンドウが現れます。
$ jython2.5b3 -i step03/TreeEx.py
ツリー JTree を構成する各ノードを選択すると、その直下にある各項目の名前がテキスト領域 JTextArea に表示されます。たとえば、ノード colors を選択すると、テキスト領域に文字列 blue/violet などが表示されます。
事例:Java の世界を Jython から観察する
実行中の Java アプリケーションの状態を、Jython の対話モードで確認できるので、とても便利です。
>>> view = Xview >>> node = view.selectionPath.lastPathComponent >>> node colors >>> node.children() java.util.Vector$1@df01a0 >>> list(_) [blue, violet, red, yellow]
大域変数 Xview を介して、JTree を参照できます。すると、選択されている子ノード colors の直下には、さらに4つの項目が存在するのが分かります。これらは、テキスト領域に表示された情報に相当します。
事例:コードの解説
#! /usr/bin/jython2.5b3 ... from sys import argv ## ---------------------------------------- class View(JPanel): def __init__(self, **keys): ... def valueChanged(self, e): node = e.path.lastPathComponent self.textArea.text = self.children(node) def children(self, node): s = [] for e in node.children(): s.append(str(e)) return "\n".join(s)
メソッド children を利用すると、ノード node の直下にある子ノードを列挙した配列が得られます。
これと同等のことは、内包や組み込み関数 reduce を使って、より簡潔に表現できます。
《Note》str.join ¶
■ 内包を使って
def children(self, node): return "\n".join( [str(e) for e in node.children()])
■ 組み込み関数 reduce を使って
def children(self, node): return "\n".join( reduce(lambda s,e: s+[str(e)], node.children(), []))
Tips
》作業中です《