ビューの構成
見た目がすべてではありませんが、やはり第一印象は大切にしたいものです。
理想的な上司
親クラスには、理想的な上司のような存在であって欲しいものです。ここでは、重複するので省略します。詳細は、先の連載第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は、先に設定した次世代の情報を反映させて、生命体の状態を更新します。
