1人月を削る妄想(番外)

そもそも、1人月を削る妄想に含まれるのかどうなのか分からないのですが、仕事で使っているColdFusionでフレームワーク的なものを作ろうかなと。

部品だけはあるので、あとはまとめてソレっぽくして、CodeReposかGoogleCodeにでも置いておこうかな、くらいの話です。

それについての自分用めも。

その前にColdFusionについて

「ColdFusionは開発生産性が高い」とはよく聞く話なんですが、実際使ってみて「そーお?」という感想でした。

理由は、ブラウザから実行するしかないので(僕が知らないだけ?)テストがメンドイ点と、コピー句的IncludeとリダイレクトでURLが崩れるんですが、この時UI設計時に作ったHTMLを考えも無しにCFMファイルに転用したりすると、相対パスで書かれたリンクとかが残っているせいで「特定の状況下でのみ発生するバグ」なんかが出てくる事がある点、MX7というバージョンからApplication.cfcというなんだかServletTemplateMethodでラップしたようなものがあるのですが、これの取り扱いを誤ると全体が一気にカオスになる点、Perl/CGIみたいな乗りでコード書けるよ!というアナウンスを鵜呑みにして実装していると、実はマルチスレッドでした(JavaVM上で動いている)みたいな点などなど。


これは以前書いたような気がするのですが、ColdFusionという開発環境は、恐らく「プログラミングの専門性が薄い業務知識にやや寄ったいわゆるSEが、気軽に動くWebシステムを作れるように」という狙いで作られたものだと思うんですよ。Adobe自体「構文が簡単」と謳っていたりもするので、これは多分外れていてもそう遠くはないかな、と。

で、プログラミング言語であるCFMLで、HTMLタグにCFMLタグを記述していくせいで、[<]とか[>]とかが溢れるキモイコード*1になっていく訳ですが、CFMLは動的型付け風なのでデータ型定義とか気にせずがりがりコードを書いていくことができます。
そういう意味では、Java-Servletの上にフレームワークを乗せて、という硬めのアプローチをするよりかは幾分か開発生産性は高いのかも知れません。(Ruby on Railsとかと比べてどう、とかはちょっと分かりませんけど)

という訳で、個人的に理想的なColdFusionの使い方は「作り捨て」なんだろう、と。
作って、動かして。メンテするくらいなら作り直す、というアプローチですね。

でも、現実にはコードをメンテしていく事になる訳です。

そもそも、どんな言語であれフレームワークであれ、使っただけで生産性が上がるなんて甘い話がある訳がなく、ColdFusionが開発生産性が高いというのであれば、高い開発生産性でColdFusionを使う「やり方」、「仕事の仕方」がある筈なんですよね。

なので、このライブラリだかフレームワークだかで、その辺を少し覗ければ良いなーなどと思ってます。


以下、本当にめも。

このライブラリだかフレームワークだかの狙い

URL崩れの解消

URL崩れはApplication.cfcの#onRequestStart、#onRequestEndでSessionをゴリゴリしてあげれば何とかなりそう。その代わり、画面用のCFMからPOSTされたデータを参照させようとする時とかは、クセのある参照をさせてあげなきゃいけなくなりますが。

LLだけど多層構造

画面用CFMでビジネスロジックも全部実装すると、画面1つあたりのテストケースが多くなりすぎる上に、テストの実施がブラウザで直接画面を操作する以外になくなってしまうので、最低でも「Presentation層」と「それ以外」の二層に分けないと駄目かな、と。

Presentation層側に画面用とイベント・ハンドラ用のCFMを、それ以外層にはPresentation層から使う為のCFC(コンポーネントJavaクラスみたいなもの。)をそれぞれ置いていく感じです。Presentation層から使う「それ以外層」は、CFCなのでテストドライバになる画面を別途作って個別にテスト、その間Presentation層はモックにしたCFCを、という感じにすれば分業も出来ますし、テストケースの爆発もずいぶんと小さくなる筈です。

複数アプリケーションの並行稼動

んで、ColdFusionのメンドクサイところの1つに、CFCファイルで定義するコンポーネントが、何気に継承とか使えるんですが呼び出す時とかに指定するパッケージ名が、そのサイトのROOTからディレクトリを辿っていったものになる、という点です。

つまり、ディレクトリを変えたりすると、ばっちり動かなくなります。

Javaのような静的型付けで充実したIDEがあるものであれば、結構気軽にリファクタリングしてしまえるのですが、ColdFusionはLLなので全然手直しです。それようのスクリプトとか作らなきゃいけないです。


でもそこは、ColdFusionがタグでプログラムを書く、というキモイ特性を活かして、

<cfobject component="#RootPackage#.TestComponent" name="obj" />

というリフレクションちっくなインスタンスの生成も出来るので、その辺でうまい具合にできるんじゃないかなと思ってます。

公開する時期とか

僕の仕事が忙しすぎず、かつせっかくフレームワーク的なものとして作るので、なんかカワイイ名前が思いつけたら、その時公開しようかな、とか思ってます。


後は、飽きたり忘れたりしないように頑張ります><