# 共通ドキュメント

## 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情報で更新
    //...

フッター