例題で学ぶデザインパターン #3: リスト、内包、reduce

前の記事記事一覧次の記事

例題で学ぶ Jython/Swing デザインパターン《Jython2.5》
リスト、内包、reduce

《著》越智ことり+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

■ 概要

アプリケーションを作成する過程を通して、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

》作業中です《

Last updated♪09/06/07