SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

よろずプログラマーのためのPython導入ガイド

Java meets Python - 第6回 配列と別れる50の方法(3) ライフゲーム

よろずプログラマーのためのPython導入ガイド (8)

ビューの構成

 見た目がすべてではありませんが、やはり第一印象は大切にしたいものです。

理想的な上司

 親クラスには、理想的な上司のような存在であって欲しいものです。ここでは、重複するので省略します。詳細は、先の連載第2回を参照してください。

理想的な部下

 子孫クラスには、理想的な部下のような存在であって欲しいものです。

class LifeGameFrame(DefaultFrame):
    def initialize(self):
        self.panel = LifeGamePanel()
        self.button = JButton("Next Generation",
            actionPerformed=self.actionPerformed)
    def initializeComponent(self):
        self.layout = BorderLayout()
        self.add(self.panel, BorderLayout.CENTER)
        self.add(self.button, BorderLayout.SOUTH)
    def actionPerformed(self, e):
        self.panel.nextGeneration()

 クラスLifeGameFrameは、具象クラス(現実)として、親クラスDefaultFrameで規定した特性を再定義したり、実質的な作業を他に委ねたりします。

 メソッドinitializeでは、そのクラスに固有の特性を規定します。インスタンス変数panelは、フレーム内に配置するパネルLifeGamePanelを保持します。

 メソッドinitializeComponentでは、ビュー(視覚部品)の特性を規定します。指定したレイアウトBorderLayoutに従って、パネルを追加addします。

 ここで着目して欲しいのは、親クラスの規定に従うなら何をしても自由ですが、それに従わないならすべて自己責任となることです。LifeGameFrameの責務には、上司の指示を仰ぐ行為も含まれます。今回のパズルの成否はすべて、部下LifeGameFrameの自主的な活動次第となります。

理想的な作業机

 同じ作業机を与えても、そこには個性が反映されます。机の上を整理整頓しておくと作業が捗るように、部品の構成管理にも配慮したいものです。

class LifeGamePanel(JPanel):
    dim = 48
    def __init__(self):
        JPanel.__init__(self, mouseClicked=self.this_mouseClicked)
        self.initialize()

 クラスLifeGamePanelは、ビューを構成する部品の一つとして、アプリケーションに固有の機能を提供します。

 インスタンス変数dimは、すべてのインスタンスに共通する情報(定数項)を規定します。ただし、後の仕様変更で、これが問題となる可能性があります。

 メソッド__init__では、親クラスJPanelで規定したプロトコルに従って、パネルを再構成します。initializeは、そのクラスに固有の特性を規定するもので、先に示した方法でパネル内に生命体を配置します。

 先の連載第2回では、メソッドinitializeComponentにおいて、ビュー(視覚部品)の特性を規定する方法を紹介しました。ここでは、親クラスに委ねる方法を紹介します。キーワード引数mouseClicked=を介して、イベントハンドラーとして、関数オブジェクトthis_mouseClickedを保持します。詳細は、先の連載第1回を参照してください。

理想的な文房具

 同じ文房具を与えられても、作業が捗るかどうかは、その使い方次第です。

 インターフェイスの役割を担うクラスShapeについては、重複するので省略します。詳細は、先の連載第2回を参照してください。

class Life(Shape):
    def paint(self, g):
        self.paintItem(g)
    def add(self, life):
        self.neighbor.append(life)
    def updatePresent(self):
         self.present = self.future

 クラスLifeは、インターフェイスShapeの規定に従って、メソッドを再定義します。

 メソッドpaintは、各生命体を適切に描画します。実際の処理はpaintItemに委ねます。

 メソッドaddは、指定した生命体 life を、隣接する生命体として登録します。

 メソッドupdatePresentは、先に設定した次世代の情報を反映させて、生命体の状態を更新します。

次のページ
絶景かな?

この記事は参考になりましたか?

よろずプログラマーのためのPython導入ガイド連載記事一覧

もっと読む

この記事の著者

小泉ひよ子とタマゴ倶楽部(コイズミヒヨコトタマゴクラブ)

http://tamago-club.cocolog-nifty.com/「楽しくなければ仕事じゃない」が私たちのモットー。99%の苦悩の連続も、1%の成功に報われます。だからこそ、この仕事が楽しくて仕方がないのです。楽をするための努力なら惜しみません。何もせず楽をしているのと、努力をしたから楽ができるのと...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

伊藤うさぎ(イトウ ウサギ)

ペンネームの「由来は」と言うと。苗字の方は、セミナー研修で同じチームになった、3人の合体ユニット名 [I:石塚, T:田川, O:尾沢] から来ています。名前の方は、同じ干支(卯:1987 年生)に因んだものです。既に2人は卒業して、残る1人がその名跡を継承しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2252 2008/06/13 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー