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がパブリックスコープだというのは、恐らくは継承関係を前提にした話であって別に呼びもとの画面で参照できる程のパブリックではないようです。(そのため当然、呼び元で参照すると未宣言エラーが起きる)
また、
やってみたけどびみょうなこと
AbstractFactoryのくせにAbstractじゃない点が、何だかキモイです。まかり間違えば、AbstractFactoryという名前を持ったコンポーネントのくせに、自分のインスタンスを持てちゃいます。
ですが、基本的に1つのFunctionをコールする際にも、cfinvokeを使うと縦と横に冗長なコードになりやすいため、インスタンス生成を行う為のFunctionをパラメータによって呼び分けるような場合は、そのコールの部分をカプセル化できる分、メリットはあるかも知れませんね。