例題で学ぶデザインパターン #4: モジュール分割

例題で学ぶ Jython/Swing デザインパターン《Jython2.5》記事一覧
モジュール分割

《著》越智ことり+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第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 step04/TreeEx.py 

 

ツリー JTree を構成する各ノードを選択すると、その直下にある各項目の名前がテキスト領域 JTextArea に表示されます。たとえば、ノード colors を選択すると、テキスト領域に文字列 blue/violet などが表示されます。

$ ls -l step04
total 32
-rw-r--r--   1 sketch  staff  4617  6  7 11:17 TreeComposite$py.class
-rwxr-xr-x@  1 sketch  staff   371  6  7 11:17 TreeComposite.py
-rwxr-xr-x@  1 sketch  staff  2197  6  7 11:16 TreeEx.py

モジュールを起動すると、同時に、クラスファイル .class が生成されます。

事例:モジュールを分割する

リファクタリングの第一歩は、モジュールを分割することです。リファクタリングの前後で、機能は変化しませんが、その後の作業を楽にします。

事例:コードの解説

■ モジュール TreeEx
#! /usr/bin/jython2.5b3
...
from TreeComposite import Node

from..import 文によって、分割したモジュール TreeComposite を取り込み、クラスを Node を参照できるようになります。

class View(JPanel):
    ...
    def children(self, node):
        return "\n".join(
            [str(e) for e in node.children()])

メソッド children の本体は、分割したモジュール TreeComposite のメソッド __str__ に移動します。

■ モジュール TreeComposite
#! /usr/bin/jython2.5b3
class Node(object):

クラス Node は、ツリーを構成するノードを表現したものです。

    def __init__(self, node, **keys):
        self.node = node

インスタンス属性 self.node は、ツリーを構成するノードを参照します。

    def __str__(self):
        return "\n".join(
            [str(e) for e in self.node.children()])

メソッド __str__ は、オブジェクトに固有の文字列表現を規定します。ここでは、その直下にある子ノードの名前を列挙します。

事例:評価

完成したアプリケーションを利用して、ここまでの成果物を評価します。このアプリケーションを完成させると、次のような解析が可能になります。

home
+-- step01
+-- TreeEx.py (1625)
+-- step02
+-- TreeEx.py (2161)
+-- step03
+-- TreeEx.py (2516)
+-- step04
+-- TreeComposite$py.class (4617)
+-- TreeComposite.py (371)
+-- TreeEx.py (2197)
step03 でのモジュール TreeEx は、step04 ではモジュール TreeEx/TreeComposite に分割されます。モジュールファイルのサイズが、2516 から 2568(=371+2197) へとわずかに変化したのは、コメントなどを付加したからです。 このように、開発ブロセスを評価するときにも、このアプリケーションは役立ちます。

Tips

》作業中です《
Last updated♪09/06/08