《Jython2.5》JTree〈GoF〉Command が必要に

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

Java プログラマーのための Python 導入ガイド〈初級/応用編〉《Jython2.5》
JTree〈GoF〉Command が必要に

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

■ 概要

フォルダー/ファイルの階層構造を Swing/GUI を利用して「簡単に」閲覧できるツールがあると便利です。

 この課題では、Swing/GUI を使って階層構造を持つ情報を提示します。
 また〈GoF〉Composite/Iterator/Visitor/Command パターンを導入することで、
 構造化プログラミングには必須の if/for が不要になるので、簡潔で見通しが良く、
 要求仕様の変更にも柔軟に対処できる、プログラム(コード)を作成する方法を紹介します。

 《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。

事例:コードの解説

class View(JPanel):
    def init_buttons(self):
        panel = JPanel()
        panel.layout = BoxLayout(panel, BoxLayout.LINE_AXIS)

        self.textButton = JButton(
            label = "Text",
            actionCommand = "Text",
            actionPerformed = self.actionPerformed,
            )
        self.treeButton = JButton(
            label = "Tree",
            actionCommand = "Tree",
            actionPerformed = self.actionPerformed,
            )
        for e in [
            self.textButton,
            self.treeButton,
        ]:
            panel.add(e)
        return panel

    def actionPerformed(self, e):
        s = e.source
        if s.actionCommand == "Text":
            self.text_actionPerformed()
        if s.actionCommand == "Tree":
            self.tree_actionPerformed()

メソッド actionPerformed の本体では、if 文が必要になるので、簡潔で見通しの良いコードを記述できないだけでなく、要求仕様の変更にも柔軟に対処できません。
このセミナー課題では、高々2つの場合だけですが、実際のアプリケーション開発では、数十〜数百の場合に対処する必要が生じます。このアプローチを踏襲するかぎり「数十〜数百の if 文を書く」という呪いを解く術がありません。

何が問題か

■ オブジェクトの識別性

JButton の属性 .actionCommand(が保持する文字列)を利用して、どのボタンが選択されたのかを識別しています。そのため、if に続く条件式では、同じ文字列かどうかを比較して、処理を分岐する必要があります。

ところが、オブジェクト指向プログラミングにおいては、その特徴のひとつである「識別性」を利用できます。そのため、構造化プログラミングの定石である「条件分岐」を記述する必要がなくなり「if 文の呪縛」から解放されます。
⇒ 続きはこちら コードの解説

■ 動的スキーマの適用

既存のシステムが継続して運用されるには、要求仕様の拡張に対処する術が必要になります。また、要求仕様がすべて確定してからでないと、開発に着手できないのも困りまます。そこで、要求仕様の変更に際して、その影響を受ける範囲を限定できるときもに、実行時に問題解決を図る術が必要になります。

オブジェクト指向プログラミングにおいては、その特徴のひとつである「多様性」を利用できます。そのため、構造化プログラミングの定石である「条件分岐」を記述する必要がなくなり「switch 文の呪縛」から解放されます。また、すでに稼働しているシステムを停止することなく、その機能を自由に拡張できるようになります。
⇒ 続きはこちら コードの解説

Tips

》作業中です《

Last updated♪09/05/20