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は単なるリダイレクト。
© Copyright 2025 ExpyDoc