MVCの概要
概要
- MVCとは
- MVCの構造
- Model
- View
- Controller
- その他
MVCとは
デザインパターン上の概念。Model View Controller の略
wikipediaによる定義
コンピュータ内部のデータをユーザに提示し、それに対してユーザが何らかの指示を出すタイプの、独自のユーザーインタフェースをもつアプリケーションソフトウェアを、以下に述べるようなmodel・view・controllerの3つの部分に分割して設計・実装するという技法、又はそのような構造をいう。
問題解決のための定義
[問題領域]のデータとその操作方法、データの表示方法を分離し、それぞれのやり取りを円滑にするための構造。
利点
- プログラムの見通しが良くなる
- 表示の差替えが簡単に出来る
MVCの構造
- Model
- [問題領域]が扱うデータの型と操作を定義する。
- View
- [問題領域]が扱うデータの表示方法を定義する。
- Controller
- ユーザー入力を受け取りモデルを操作し結果をビューに通知する
Model
プログラムが扱うデータの型と操作を定義する。
基本的な事
- 表示に関することは知らない
- コントローラーの状態に関することは知らない
- というか自分のこと(即ち[問題領域]のデータの構造、保存方法、保存場所、他のモデルとの関連)しかわからない
- しかし自分が外からどう見られるかは知っている
View
プログラムが扱うデータの表示方法を定義する。
基本的な事
- データの保存方法とか知らない
- コントローラーの状態に関することは知らない
- つまり自分のこと([問題領域]のデータの表示方法)しかわからない
- しかし自分が外からどう見られるかは知っている
Controller
ユーザー入力を受け取りモデルを操作し結果をビューに通知する
基本的な事
- データの保存方法とか知らない
- しかし、現在どのモデルを扱っていて、どの様なイベントの時にどういう操作をすればいいか、は知っている
- データの表示方法とか知らない
- しかし、現在どのモデルを扱っていて、どの様なイベントの時にどういう操作をすればいいか、は知っている
- つまり自分のこと以外についてある程度知っている必要がある。
アンチパターン
htmlspecialchars
PHPにおいてHTMLの特殊文字を正しく表示するための関数。"<"を"<"に変換したりする。
本来の使い方
「aaa"<script>alert(document.cookie)</script>」という値をテキストボックスに表示すると?
$input = "aaa\"<script>alert(document.cookie)</script>";
<input type="text" value="<?php echo $input ?>" />
//これは
<input type="text" value="aaa"<script>alert(document.cookie)</script>" />
//このようなHTMLを生成する。保存しているクッキーが表示される(実際はもっと怖い事が起こる)
//これはまずいので
$input = "aaa\"<script>alert(document.cookie)</script>";
<input type="text" value="<?php echo htmlspecialchars( $input ) ?>" />
//こうすることで
<input type="text" value="aaa"<script>alert(document.cookie)</script>" />
//このようなHTMLを生成する。クッキーが表示されることは無くなる(怖い事が起こせなくなる)
間違ってしまった使い方
//POSTされたデータを取得する。怖い事が起こせないように先に入力値を安全な形にする(つ も り)
$input = htmlspecialchars($_POST["inputstring"]);
//安全になったので保存する。
saveInputString($input);//どこかにあるはずの保存programを呼び出す。
//再表示
<input type="text" value="<?php echo $input ?>" />
なんでもかんでも一緒くた
データ取りに行って、表示装置に渡して、別のデータ取りに行って...
//formの予約呼び出しボタンを押した時の処理、とか。
Reserve reserve = ReserveAccess.Get(1); //キー"1"の予約データを取得
reserveView.Name = reserve.Name; //名前表示
reserveView.NumNames = reserve.NumNames; //人数表示
ReserveAir air = ReserveAccess.GetAir(1); //キー"1"の予約データに紐付くAir情報取得
InitializeAirGrid(air); //Air情報グリッド を取得したair情報で更新
//...