2011年8月28日日曜日

和訳: Project Lambda (前半)

注:この文書はProject Lambdaの提案を和訳したものです。訳の正確性は保証しません。
この文章におかしなところがあればオリジナルを参照してください。

Brian Goetz 2010/10/10

この文書はJava言語にラムダ式を追加する案です。このスケッチはMark Reinholdによって 2009/12に作られた原案をもとに作られました。前のバージョンは2010年7月に発表されました。

2011年8月13日土曜日

Facadeパターン : 隠蔽 or not 隠蔽?

デザインパターンねたの続きです。

Facadeパターンというものがあるんですが、一言で言えば、
「複数の(低水準な)オブジェクトをまとめて扱えるような(高水準な)窓口用クラスを作る」
というものです。

HeadFirstデザインパターンから例を引用すると、
低水準なコンポーネントである
アンプ、スピーカー、プロジェクタ、照明、・・・
といったものを、
高水準クラスである"ホームシアター"で一気に調整する、とかそんな感じです。

HeadFirstデザインパターンでは、
Facadeを使うクラスが、Facadeクラスに低水準コンポーネントを渡す
という形で説明されています。
したがって、高水準な機能だけでは実現できないような"微調整"が必要なときには、
低水準コンポーネントに直接アクセスすることが可能である、と説明されています。
つまり、Java風擬似コードで言うとこうです。

class FacadeUser{
	...
	func(){
		...
		LowLevelComponent1 comp1 = new LowLevelComponent1();
		LowLevelComponent2 comp2 = new LowLevelComponent2();
		Facade facade = new Facade(comp1, comp2);
		...
	}
	...
}
class Facade{
	LowLevelComponent1 comp1;
	LowLevelComponent2 comp2;
	// constructor
	Facade (LowLevelComponent1 comp1,  LowLevelComponent2 comp2){
		this.comp1 = comp1;
		this.comp2 = comp2;
		...
	}
	...
}
一方、wikipediaなんかでは、
Facadeとなるクラスの中で、privateに低水準コンポーネントを作る、ということをしています。
したがって、Facadeを使う側は、直接低水準コンポーネントを触れない、というわけです
(setterやgetterを作れば別ですが)。
特に、日本語版wikipediaでは低水準コンポーネントを隠蔽する点にしっかり言及しています。
擬似コードだとこんなです。
class FacadeUser{
	...
	function(){
		Facade facade = new Facade();
		...
	}
	...
}
class Facade{
	private LowLevelComponent1 comp1;
	private LowLevelComponent2 comp2;
	// constructor
	Facade (LowLevelComponent1 comp1,  LowLevelComponent2 comp2){
		this.comp1 = new LowLevelComponent1();
		this.comp2 = new LowLevelComponent2();
		...
	}
	...
}

隠蔽するかしないかで、クラス図的にはほぼ同じでも、
正直相当違うんじゃないかと思うのですが、どうなんですかねえ。
どっちが正解とかそういうことは無いとは思うのですけども、
せっかく名前をつけている以上はっきりしておいてもらいたいなあと思います。

ま、そもそもFacadeパターンなんて、
わざわざ言われなくても勝手に使っているものにしか見えない、というそもそもの問題がありますが。
この辺の「何をいまさら」感は、Template methodパターンとどっこいどっこいでしょう。