Java.use(better);

Java.use(better);


Episode#02
Strategy パターンの隘路 -- GoF を反面教師に


《関連記事》

■ 余録

参考までに、他言語の事例を以下に紹介します。

Jython:Strategy パターン

純粋な OOP 言語(Smalltalk-80)では、first-class object という言葉は必要ありませんでした。というのも、すべてが first-class object だからです。同様に、Jython では、クロージャーを強調する必要はありません。というのも「メソッド関数は、同時にクロージャでもある」からです。


前例を Jython で実現すると、

    data = "ABCDEFGH"

    def strategyA(data):
        s = ""
        for e in data: s += e
        return s
    contextA = Context(strategyA)
    print "A: %s"%(contextA.strategy(data))

    def strategyB(data):
        from java.lang import StringBuffer
        buf = StringBuffer()
        for e in data: buf.append(e)
        return buf.toString()
    contextB = Context(strategyB)
    print "B: %s"%(contextB.strategy(data))

一方の利用者(プログラマー)は、2つの戦略 strategyA/strategyB の違いを意識せずに、同じメソッド呼び出し strategy(data) を再利用できます。他方の開発者(プログラマー)は、2つの戦略の違いを「クロージャー内に隠蔽」できます。注目に値するのは、利用者/開発者の違いを示すコードの断片がすべて、ここに集約されていることです。

これは、次のように実現します。

class Context:
    def __init__(self, strategy):
        self.strategy = strategy

特殊メソッド __init__ を再定義するだけなので、意図的にバグを盛り込む余地はここだけです。

 ↑ TOP

》作業中です《

update*13/01/09 19:23:09