Python 弾丸ツアー /Java: JavaBeans 準拠 ... step 2: クラスを定義する

OOPデザインパターンリファクタリング

Python.use(better); Python 弾丸ツアー /Java: JFC/Swing 編
>>> JavaBeans 準拠
step 2: TIPS 継承から委譲へ
《Python3.1|Jython2.5|IronPython2.6》

《著》小粒ちゃん@湘南組《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/23 ● 第4版♪2010/03/08

step 2: ボタンを利用する

■ 継承から委譲へ

 ̄既存のコンポーネント(部品)を再利用するために、継承に代えて委譲を導入します。

   ## ---------------------------------------- step4
    class Tips(object):
        def __init__(self, master, *args, **keys):
            pane = JPanel()
            button = JButton(
                text = "Click Me",
                preferredSize = (210,50),
                actionPerformed = self.actionPerformed,
                )
            pane.add(button)
            master.contentPane = pane
            master.pack()

        def actionPerformed(self, e):       # ActionListener
            comp = e.source
            comp.text = "%s"%ctime()

    def tips():
        frame = JFrame(
            title = "Timer",
            defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
            )
        Tips(master = frame)
        frame.visible = True

    tips()

 ̄継承に代えて委譲を導入するための、リファクタリングを実施します。step3 では、

    ## ---------------------------------------- step3
    class Tips(JPanel):
        def __init__(self, *args, **keys):
            ...
            self.add(button)

継承元の親クラス JPanel に代えて、自身 self に部品 button を追加していましたが、step4 では、

    ## ---------------------------------------- step4
    class Tips(object):
        def __init__(self, master, *args, **keys):
            pane = JPanel()
            ...
            pane.add(button)

委譲先の JPanel インスタンス pane を用意して、これに部品 button を追加します。さらに、

    class Tips(object):
        def __init__(self, master, *args, **keys):
            ...

    def tips():
        ...
        Tips(master = frame)

クラス呼び出しのときに、キーワード引数 master= を利用して、委譲先の JPanel インスタンス pane を保持するフレームを指定する必要があります。

《TIPS》継承から委譲へ:

 ̄既存のコンポーネント(部品)を再利用するときには、2つの戦略が考えられます。一方は「継承」によって「部品を拡張する」もので、他方は「委譲」によって「部品を組み込む」ものです。
・継承は「ホワイトボックス型の再利用」とも呼ばれ、利用者は継承元のクラスに対して「直接アクセス」が許されます。何をしても自由であるのと引き換えに、利用者には自己責任が問われます。
・委譲は「ブラックボックス型の再利用」とも呼ばれ、利用者は委譲先のクラスに対して「間接アクセス」しか許されません。自由が制約されるのと引き換えに、利用者には安全性が確保されます。

 ̄たとえば、Tips に対して新たな JButton を追加することを考えます。継承に基づく Tips は JPanel でもあるので、後から部品を追加できます。Tips を「ホワイトボックス」と見なすので、利用者には JPanel の存在が露呈します。委譲に基づく Tips は JPanel ではないので、後から部品を追加できません。Tips を「ブラックボックス」と見なすので、利用者には JPanel の存在が露呈しません。継承は、不正アクセスにも通じますが、委譲にすると、この問題を回避できます。

>>> do(3)   
>>> # -------------------------------------------------- step3
>>> Qtips3.add(JButton("oops"))


>>> do(4)
>>> # -------------------------------------------------- step4
>>> Qtips4.add(JButton("oops"))
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'Tips' object has no attribute 'add'

TOP
》作業中です《