やっぱり使い方次第

ColdFusionのFuseboxというのを使っているのですが、よくあるMVCパターンでアプリケーションを構築できます。モデルを呼び出す所まではキッチリ型にはまっていてとても良いのですが、モデルの実装はかなり自由にできちゃいます。

今やっている方法は、ビジネスロジックとDAOとビューを分けて記述してモデルで各ロジックが含まれているテンプレートをincludeするという形ですが、ここは全てfunctionにしても良いですし、コンポーネントにしても良いと思いました。

テンプレートのincludeを連発すると、変数のスコープが不明瞭になるという障害がありますが、実は変数のスコープを知っていると結構便利に扱えます。宣言部と代入部と使用部が物理的にファイルをまたがっているのに、同一のスコープという事もあります。いきなりコードを見たって、”この変数はどこで宣言されて、どこでどんな値が入って、どういう風に使われるんだ・・・”と分からなくなりますが、命名のルールをつけたり、コーディングのルールを定めるだけで、柔軟な対応ができます。

Fuseboxはフレームワークとして使用できますが、ColdFusionの特徴的な自由度はそのまま残っています。これは下手をすると誰もが自由自在にコードを記述してしまい、統一性が無くなるという危険性もありますが、ちゃんとしたコーディング規約に沿ってコーディングしていくと、とっても開発効率が良いです。

やっぱり<cfoutput>タグの便利さは良いですよねー。変数渡せば出力されるし、配列や、クエリを渡せば勝手にループ処理になって、要素へのアクセスが簡潔になります。やっぱりColdFusion好きです!

1:nのマッピングが正しくできない

http://d.hatena.ne.jp/hoso-kawa/20041205#1102178600
にあった件を、休憩の合間をぬって見てみました。id:MIZOMIZさんの言う通り、JavaBeans - List - JavaBeansの階層だとマッピングされませんでした。List - JavaBeans - List - JavaBeansならマッピングされるのはOpenAMFUtilsが”良き(悪?!)に計らっているから”です(^^;

根本的な解決方法は、2つあります。

  1. 引数として渡ってくるオブジェクトを全て走査し、_remoteClassを見てオブジェクトのコンバートを行う。S2OpenAMFの変更のみで対応が可能ですが、ちょっと時間かかる。
  2. OpenAMFのASObjectをいじる。根本的かつ一番簡単です。



public String getType() {
String remoteClass = (String) this.get("_remoteClass");
if (remoteClass != null) {
return remoteClass;
}

return type;
}
// 赤い文字の所が追加した記述
上記のようにASObjectを改良すると、既存のS2OpenAMFのパラメータをコンバートする処理が全て必要なくなり、AS2.0への対応が完璧にできます。既に実装されている部分にも悪影響はありません。しかし、OpenAMFに手を入れる事になってしまいます。

時間がある時に前者の案で実装しちゃってもいいんですけど、根本的な解決を試みるなら、OpenAMF, ASTranslatorのチームにAS2.0への対応をお願いするって所でしょうか。S2OpenAMFOpenAMFに手を加えずにAS2.0対応をするのは、オーバーヘッドがかかりますから。

月末近くになると思いますが、前者の対応で実装してみようと思います。合わせてOpenAMFのASObjectにパッチを当てたものを配布…需要があれば置いておきますが(^^;