レイヤを分けた意味。

cfneoのレイヤを分ける意味についてメモしておきます。

そもそも「分かりやすさ」や「作業分担をできるように」といった目的でレイヤ定義をする、という印象が僕にはあったのですが、多分実は「テストの単位」を決める為にあるんでしょうね。

そう思ったので、以前ここに書きましたcfneoの8つのレイヤは、そのままテストの単位に、と思っています。


Enterpriseでの使用を前提に作られたフレームワークでは当たり前の事なんだと思いますが、ColdFusionというLLという位置づけでJava系の堅い構成を持とうとする是非が、実は一番の悩みの種だったりします。LLらしく、アプリケーション・アーキテクチャなんて気にせずガリガリ作って、画面を叩いてテストすれば良いじゃない、と。


でもcfneoというフレームワークを作ろうというプロジェクトを作ってしまいました。

多層式の設計について、よく変更容易性という切り口を持つと、「画面に変更があっても、データベース周辺に変更がなければ、変更作業は画面用の部品にのみ入れれば良い」といった感じに語られる事が多いのですが、現実には画面に変更があった場合、データベース周辺にも変更が入ります。

レイヤによって分割したアプリケーションの構造が変化を吸収するかどうかは変化の内容にもよりますが、業務システムのようにデータベースとそれをラップするUIとしてのアプリケーションというシステムでは、変化=業務的な意味合いを持った変化であるケースが多いです。
そのため、MVCや多層式の設計で変化を吸収できる、というケースはむしろ非常に少ないと思います。

でも、cfneoは多層式。
理由はやはり「テストをし易いように」、「テストをする切り口の選択肢を多く持てるように」です。


Screen(Consoleとした方が適切かな?と最近思えてきました)とEventHandlerは、正直まだ微妙なのですが、1つの入力イベントに対してValidator・Facade・Flowは1つずつ作られていく想定ですので、入力イベントの構成要素ごとの役割に対する個別のテストを行う事が可能です。

例えば、業務ロジック(Process)だけのテスト、その業務ロジックを繋げたフローのテスト(Flow)、それらのデータベースとの連携の部分(Dao)だけのテスト、といったように、品質評価をしたい視点に対する切り口を持たせている、というイメージです。


こうする事で、開発工程におけるテストというタスクを洗い出す際の1つの目安にする事が出来ると思うのです。