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