CFMLでデザインパターン実装(1)まとめ

はまったこと

実はこれを実装している時軽くハマりまして、助けてついったーしたりしてました。
当初、cf-4として実装しようとしていたHelloWorld.cfcには以下を実装しようとしていました。

	<cfproperty name="word" type="string" required="yes" default=""/>

が、CFコンポーネントをcfobjectで生成しても、変数wordを参照すると決まって未宣言エラーが発生していました。初期値が入っている筈なのになーおかしいなーと、CFMLリファレンスなどを読んでみると

メモ : This スコープ識別子は、JavaScript および ActionScript の This キーワードに機能が似ています。CFC は Java クラスモデルには準拠しておらず、ColdFusion と Java では This キーワードの動作が異なります。 This は、Java ではプライベートスコープですが、ColdFusion ではパブリックスコープです。

http://livedocs.adobe.com/coldfusion/8_jp/htmldocs/help.html?content=buildingComponents_29.html#656880

とか書いてありまして、「Thisスコープの使い方ってJavaとちげーから気をつけなーってことか?」と混乱しました。(しかも、defaultの使い方も微妙に違うらしい)しかもThisスコープを参照するたびに未宣言エラーが出続けるため、いよいよ困惑して「Thisスコープって何者だ?」と頭を抱えてしまったのが敗因でした。

でも、Thisがパブリックスコープだというのは、恐らくは継承関係を前提にした話であって別に呼びもとの画面で参照できる程のパブリックではないようです。(そのため当然、呼び元で参照すると未宣言エラーが起きる)
また、で定義付けている属性とThisは別に整合を図られている訳ではないようです。そのためcfpropertyを定義してDefaultを設定しても意味はなく、明示的に初期化をしてやる必要があったため、コンストラクタ風Functionを追加しました。(その結果、を削除しても無事稼動しました)

やってみたけどびみょうなこと

AbstractFactoryのくせにAbstractじゃない点が、何だかキモイです。まかり間違えば、AbstractFactoryという名前を持ったコンポーネントのくせに、自分のインスタンスを持てちゃいます。

ですが、基本的に1つのFunctionをコールする際にも、cfinvokeを使うと縦と横に冗長なコードになりやすいため、インスタンス生成を行う為のFunctionをパラメータによって呼び分けるような場合は、そのコールの部分をカプセル化できる分、メリットはあるかも知れませんね。