Coldfusion

Coldfusion
- the Best Practice
sdc技術研究会
Coldfusion user Group
いまい
※featuring Coldfusion MX7
Coldfusion
 概要
 Adobeシステムズ産
 最新バージョンは【Coldfusion 8】
 つまるところは
 Application framework / Application server
Coldfusion
 概要続き
 実装言語
 CFML / ActionScript
 仕様
 JavaEE準拠
 .NET上でも稼動可能。(8から?)
 Apache / MS-IIS の上で稼動する。
Coldfusion
ざっくりアーキテクチャ・モデル
Coldfusion Engine
Application server
(JRun)
JavaEE準拠
Web server
(Apache / IIS)
Operating System
Coldfusionの特徴
1.良い部分
 Javaライブラリが使用可能。
 .NET/JavaEEなどのPlatformに依存しない。
 PDFの生成など取扱いが容易。
 なにげに一番の目玉かも。
 Flashとの親和性が高い。
Coldfusionの特徴
2.悪い部分
 サーバが有償。
 開発環境は無償。
 適当なIDEがない。
 Dreamweaverはあるけど有償だし。
 CFEclipse→Eclipse3.3(Europa)で稼動しない事を確
認済orz
 結局、HTML/JavaScriptからは逃げられない。
 Flashを使うにはイマイチ「お得感」がない。
 でも、おかげでAjaxとか使える。
 OSS:ajaxcfcとか
 Coldfusion8からは標準装備。
Coldfusionの特徴
2.悪い部分
 MS-Excelをサポートしてない。
 まぁ当然。
 ドキュメントが不足気味。
 Web上では少ない。
 書籍も少ない。
 ・・・個人的には、CFMLリファレンスで十分だと
思うケド。
Coldfusionの特徴
3.微妙な部分
 OSSではない。
 テクノロジーが隠蔽されている、というセキュリ
ティ要素がある。
 本当に知りたいことは調べようがない。
 実は”cfusion.jar”なんてあったりするから、jadでデコ
ンパイルすると何かつかめるかもw
 言語仕様が簡単。
 後述!
CFML
 スクリプト言語
 タグで記述。
 大文字/小文字を区別しない。
 WindowsOS上ではね。
 Linux上だと当然区別する。
 動的プログラミング言語
 ・・・と、一般には認知されている。
 要はjava.util.MapのConcreteClassが全てを支配して
いると思えば良い。
CFML(実装例)
■ローカル変数の宣言
■テーブルの記述
--JavaScript
var operand;
--Java
char operand;
--CFML
<cfset var operand=“”/>
--HTML
<table>
<tr>
<th>No</th><th>Title</th>
</tr>
*ループ*
<tr>
<td>*カウンター*</td>
<td>*タイトル*</td>
</tr>
*ループ*
</table>
--CFML
<cfquery datasource=“xx” name=“xx”>
*SELECT文*
</cfquery>
<cftable query=“xx”>
<tr><td>#xx.No#</td><td>#Title#</td></tr>
</cftable>
■単純な文字列比較
--JavaScript
var operand1 = “test”;
var operand2 = “test.”;
var result = (operand1 == operand2)
--Java
String operand1 = “test”;
String operand2 = “test.”;
boolean result = operand1.equals(operand2);
--CFML
<cfset var operand1=“test”/>
<cfset var operand2=“test.”/>
<cfset var result=(operand1 is operand2)/>
CFMLの特徴
 タグベース
 JSP-カスタム・タグに類似。
 トレーニング・コストが比較的低い。
 制御文が理解できていれば実装はできる。
 あくまで比較的。。。
 XMLパーサで解析できない!
 って、おいーーーー(怒怒怒怒)!!
ActionScript
 元々はFlash向けのプログラミング言語。
 Adobe Flexでも使用。
 詳しくはリファレンスを!
 Imaiはあまり知らないです。
 つまり、ある程度の機能ならCFMLだけで十分という
こと。
Imaiが考える開発ツールとしての
Coldfusion
 使いどころ(要件編)
 HTMLベースのWeb-UIを提供する。
 CFMLを用いてサクサク開発可能。
 ・・・落とし穴もある。
 サクサク作れる=メンテナンス性の低いものが作られ
る覚悟は、しておいた方が良い。
 Flashを使う場合
 Flex使った方が良いかも。
Imaiが考える開発ツールとしての
Coldfusion
 使いどころ(要件編)
 Mobile向けドメインがある。
 Mobile向けライブラリが有償で存在する。
 Coldfusion8では?
Imaiが考える開発ツールとしての
Coldfusion
 使いどころ(対象編)
 対象システム
 ある程度なら対応可能。
 例)中規模までのECサイト
 例)中規模までの社内イントラ・サイト
 大規模は、JavaEE/.NETの方が良いでしょう。
 対応不可能。
 例)学術計算が必要なシステム
 CFMLの言語仕様上しかたない。
 例)オンライン証券取引システム
 パフォーマンス耐性は未知数。
 でも、良くはないと思う。
Imaiが考える開発ツールとしての
Coldfusion
 使いどころ(対象編)
 トランザクション制御は・・・
 ほどほどのものが良い。
 JDBCを使っているらしいけど、ObjectPoolingとかき
ちんとできているか謎。
 目だった不具合はまだ見ていませんが。
 隠蔽されているので「確認できない不安」がある。
Imaiが考える開発ツールとしての
Coldfusion
 使いどころ(設計~開発編)
 上級エンジニアが1人しかいない。
 1人いれば、他は新人でも何とかなるかも。
 勿論、ならないかも知れない。
 「トレーニング」は必須。
 みんなが新人or低スキル。
 論外。
 Layerを分けた設計で、更にサクサク開発可能になる。
 逆に設計がきちんとできないと、PHPやPerl、
(Classic VBの)などASPと余り変わらない生産性しか出ない。
 きちんと出来れば、Agile対応も可能。
そんなColdfusionの(恐らく)
Bestな使い方
 Layerを意識した設計/実装を!
 M-VCパターンの適用は必須。
MODEL
業務ロジック
CONTROLLER
イベントハンドラ
SERVICE
VIEW
画面
Layer分割をする意義-1
 回帰テストを自動化しましょう。
 JavaのJUnit、.NETのxUnitの良さを、このCF
にも取り入れる!
 作る→TestModuleも作る→テスト実施
 直す→TestModuleを起動→確認→OK♪
 画面を触ったテストは、極力避けよう。
 人間は誤操作をするし。
 めんどいし。
Layer分割をする意義-2
 担当者を分けられるようにしましょう。
 画面~イベントハンドラの中の人と、
業務ロジックの中の人は、別の方が良い。
 こんな人が向いている(と思う)
 画面~イベント
 Webに精通してる人
 Webに精通したい人
 業務ロジック
 業務に詳しい人
 言われたとおり実装するのが精一杯な人
(ようするに、新人)
Coldfusionの勘所
Application.cfc
 Servletのようなもの
 Client⇔Serverの通信時のイベントに、ロジックを
割り込ませられる。
 ユーザ認証がある場合、Session切れ判定に便利。
 Global変数(≒定数)を定義する場所として良い(かも)。
 Submit発生時は、Form変数も参照できる。
 入力値のサニタイジングに便利。
 実は・・・
 毎回、Variable領域にこのコンポーネントが突っ込まれ
るwww
Coldfusionの勘所
Application.cfc
 イベント・ハンドラ
 onApplicationStart
 JRunが起動された時に実行
 onApplicationEnd
 全てのSessionが途切れてから一定時間経過した後に実行
 onSessionStart
 ユーザから最初にアクセスを受けた際に実行
 onSessionEnd
 ユーザが最後にアクセスしてから一定時間経過した後に実行
Coldfusionの勘所
Application.cfc
 イベント・ハンドラ
 onRequestStart
 ユーザが画面上でSubmitまたは画面遷移を行った際に実行
 onRequest
 onRequiestStartが実行された後に実行
 onRequestEnd
 ユーザにレスポンスを返す際に実行
 onError
 エラーが発生した際に実行
Coldfusionの勘所
変数について
 Variables領域の多用は危険。
 スレッド内で共有されるので。。。
 変数名が被ると更新されてしまう。
 ループ・カウンタに使うと泣きを見る。
補足:「MとVC」モデル
 キホン
 いわゆる「MVCモデル」
 MとVCをきっちり分割したいので、あえて”と”を追加。
 Model
 Service/Entity/Daoなどを包括。
 View/Controller
 画面
 イメージ
 情報表示のための制御文とクエリ
 Event Handler
 イベント・キャッチ
 遷移先画面の振り分け
補足:「MとVC」モデル
 有名なJakarta Strutsで言うと。。。
 Model
 FrameworkとしてのStrutsには含まれない部分
 自分で作らないといけない。
 View/Controller
 JSPとAction,ActionForm,ActionFormBean,strutsconfig.xml
 StrutsServletは同様に隠蔽されたまま。
 多分、CF内にServlet的なものは存在する。
 →JavaEE準拠らしいから。
補足:「MとVC」モデル
 目的
 ModelをxUnitテストが可能なように構成する。
 複雑なロジックをView/Controllerから排除する。
補足:「MとVC」モデル
 効用
 複雑なロジックのテストが自動化可能。
 Agile開発プロセス採択時に絶大かも。
 UIだけサクサク開発。
 Modelの部分はMockで良い。
 業務要件が固まったら、Modelを実装。
補足:「MとVC」モデル
 残念
 View/Controllerが泥臭くなるのは仕方がない。
 Viewにクエリがガンガン記載される。
 これもしかたがない。
 課題
 UnitTestingFramework的なプロダクトが欲しい。
 今のままだと、TestModuleは1つずつ手作り。
ナレッジ集
舐めてかからない!w
 CFMLは簡単。
 でも、それはコードを書くのが簡単なだけ。
 Coldfusionは、設計もコーディング規約も、何もサポー
トしてない。
 自分たちでやらなきゃ駄目。
 むしろ簡単なだけに。。。
 可読性の低い訳の分からんコードが量産されやすい。
 スクリプト言語だから動くまでエラーは出ないし。
 Syntaxが意外にいい加減だし。
 [<cfset aaa=“aaa”>]も[<cfset Variables.aaa=“aaa”/>]もどちらも
同じように動く。
ナレッジ集
ダブルSubmit
 Frameworkはサポートしていない。
 自力回避が必要orz
 現時点では、JavaScriptによる回避しかないかも。(以
下のような超メンドイ構成が必要になる)
 1度目のSubmitでフラグをON
 フラグがONの場合、Submitを無効化する。
 JavaScriptを無効化されると万事休す。
 JavaScriptを使わないとSubmitが出来ないようにする。
 結果、JavaScriptへの依存度が高いHTMLの出来上が
り。
ナレッジ集
スコープに気をつける!
 スコープの種類
 Application
 Applicationが起動されてから終了するまで有効。
 どのスレッドからも参照される。
 Session
 Sessionが切れるまで保持される。
 同一スレッド内からしか参照できない。
ナレッジ集
スコープに気をつける!
 スコープの種類続き
 Request
 Variables
 同一スレッド内では共有される。
 スレッドが終了(レスポンスがClientAgentに返却されるま
で)し次第、消去される。
 Form
 Submitイベント時のみ使用可能。
 CGI
 調査中。
ナレッジ集
スコープに気をつける!
 スコープの種類続き
 Request
 ローカル変数:cffunction内のみで使用可
 </cffunction>または<cfreturn/>で消滅。
 多分GCにエントリされるだけだと思うけど。
ナレッジ集
オブジェクト指向
 オブジェクト指向風に実装は可能。
 ただし
 パラメータは原則「値渡し」。
 オーバーライドは可能。
 でも、オーバーロードは駄目。
 言語仕様上使えないデザインパターンもあ
る。
 純粋なOOPLじゃないから。
ナレッジ集
ステートレスに!
 Sessionはなるべく使わない。
 Coldfusionに限った話じゃないけど。
 Webアプリケーションの特性
 いつ切断されるか分からない。
 切断された後、また接続されるかも知れない。
 サーバ・サイドはスレッド乱立。
 ただでさえ、アプリケーションでチューニングする余地が少ない
Framework。
 資源(Memory)を大事に!
 Session変数を3箇所以上で参照/更新する場合。。。
 管理しきれなくなることウケアイ!
 別の方法を考えた方が良い。
ナレッジ集
URL整合は諦める。
 イベント・ハンドラを置くために。。。
 cflocationとcfincludeが入り乱れる。
 cflocation=URLは遷移先。
 cfinclude=URLはそれを使ったイベント・ハンドラ。
 Form変数は、cfincludeを使わないと渡せない。
 cflocationは単なるリダイレクト。