共通ドキュメント

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の特殊文字を正しく表示するための関数。"<"を"&lt;"に変換したりする。

本来の使い方

「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&quot;<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情報で更新
//...
   					
フッター