《11》クラスに頼らない OOP(5)〈Python 3.0 版〉

Previous| |Next
Python à la carte記事一覧
《11》クラスに頼らない OOP(5)

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

関連記事

何が問題か:情報(データ)の共有

異なるインスタンスオブジェクトが「データ」を共有するときに、どのような問題を生じるでしょうか。

def ex3a():
    stack1 = Stack()
    stack1.name = "stack1"    # dispensable
    stack2 = Stack()
    stack2.name = "stack2"    # dispensable
    stack1.items = stack2.items = []    # on purpose ... (=.=)
    for e1,e2 in zip(range(3),"ABC"):
        stack1.push(e1)                 ;print(stack1.name,stack1)
        stack2.push(e2)                 ;print(stack2.name,stack2)

異なるオブジェクトに(インスタンス属性 .items を介して)データを共有させます。すると、次のように、

>>> ex3a()
stack1 [0]
stack2 [0, 'A']
stack1 [0, 'A', 1]
stack2 [0, 'A', 1, 'B']
stack1 [0, 'A', 1, 'B', 2]
stack2 [0, 'A', 1, 'B', 2, 'C']

stack1/stack2 に同じ操作 push を適用すると、要素が混在するのが分かります。このように、同じデータを共有させるのは(スタックなど、その順序に意味がある場合に限らず)問題があります。実際に、

>>> id(stack1),id(stack1.items),stack1.push
(1072176, 1050584,  at 0xff270>)
>>> id(stack2),id(stack2.items),stack2.push
(1072304, 1050584,  at 0xfff18>)

異なるインスタンス属性 stack1.items/stack2.items が、同じデータ 1050584 を共有しているのが分かります。

何が問題か:操作(アルゴリズム)の共有

異なるインスタンスオブジェクトが「アルゴリズム」を共有するときに、どのような問題を生じるでしょうか。

def ex_stack3b():
    stack1 = Stack()
    stack1.name = "stack1"    # dispensable
    stack2 = Stack()
    stack2.name = "stack2"    # dispensable
    stack1.push = stack2.push = push    # on purpose ... (=.=)
    for e1,e2 in zip(range(3),"ABC"):
        stack1.push(stack1,e1)          ;print(stack1.name,stack1)
        stack2.push(stack2,e2)          ;print(stack2.name,stack2)

異なるオブジェクトに(インスタンス属性 .push を介して)アルゴリズムを共有させます。すると、次のように、

>>> ex3b()
stack1 [0]
stack2 ['A']
stack1 [0, 1]
stack2 ['A', 'B']
stack1 [0, 1, 2]
stack2 ['A', 'B', 'C']

stack1/stack2 に同じ操作 push を適用しても、要素は混在しないのが分かります。このように、同じアルゴリズムを共有させても問題はありません。実際に、

    
(6507856, 1050704, <function push at 0xffae0>)
(6507984, 1051984, <function push at 0xffae0>)
異なるインスタンス属性 stack1.push/stack2.push が、同じ操作 0xffae0 を共有しているのが分かります。

現実と実現の狭間で…

現実の世界では、各オブジェクトは「自分だけの情報(データ)と操作(アルゴリズム)を保持する実在」と見なします。自分の財布の中身(データ)を他人の知識(アルゴリズム)に頼らずに、出し入れできるのと同じ理屈です。ところが「現実」の世界観を、そのまま計算機の環境下で「実現」しようとすると、問題が生じます。なぜなら、ハードウェアをいくら増設しても、とても賄いきれないからです。 そこで、共有してもかまわないもの(むしろ再利用の恩恵が期待できる場面で)は、その資源を節約する術が必要になります。共有できない情報(データ)は各オブジェクトが保有して、共有できる操作(アルゴリズム)を他のオブジェクトとともに再利用します。それが、計算機を利用して問題解決(what)を図るときの「現実的な」実現手段(how)になります。そこで、注目したいのが「クラス」の存在意義です。

Tips

各オブジェクトが同じ操作(のコピー)を個別に保持するのは、資源を浪費するだけではありません。一度、その操作を拡張/変更したいときには、そのコピーと同数のメンテナンスが必要になります。そこで、一元管理するとともに、これを再利用するのが得策です。
Last updated♪09/03/26