CodeIgniterをはじめる前に

さぁ始めようと思ったけど、初心に立ち返って何故フレームワークを使う必要があるのか考えてみた。

東京で働いていた限りだと、フレームワークを使わない仕事なんて皆無だった(javaのシステムだけど)。

今はPHPで開発してるけど、大規模な開発ならSymfonyやzend、そこそこの規模でCake、これからやろうとしているCodeIgniter。
周りの話を聞いててもフレームワークを使わないなんて選択肢は存在しなかった。

それぐらいフレームワークを使うことが当然と思っていたが世界は広し。最近は以下のようなコードによく出くわします。

<?php
require_once './session_check.inc'; // セッションチェック
require_once './authority_check.inc'; // 権限チェック

$param1 = $_POST["hoge"];
$param2 = $_POST["moge"];

// 入力チェック
// DBからなんか取得

?>
<html>
・・・・
    <?php 
	// DBから取得した値をぐるぐる
        foreach($result as $item) {
    ?>
	<tr>
            <td><?php echo $item["hogemoge"]; ?></td>
	</tr>
    <?php
	}
    ?>
</html>

私自身PHPで仕事をし始めて日は浅いですが、こういうコードは見たことがあります。
そう。専門学校のときにこういうコード書きました。
PHP入門とか初学者向けの書籍にもこういったコードはよく記載されます。

多分この書き方の利点は作っては動かし、作っては動かしっていうのを一つのソースコード
行えるのが利点だとは思うけど、まぁ手軽っちゃ手軽だよね。
それがPHPがWebサイト開発によく用いられる理由なのかもしれない。(わかんないけど)

だけど、ソフトウェア開発ってそんな甘いものじゃないと思うんだ。

やっとことさ本題に入りますが、上記のコードから何故フレームワークを使う必要があるのかというのを
ざっくり書いてく。

1.デザインフレンドリ
 HTMLとPHPのコードがいい感じに絡み合ってる(笑)
 これだと後からデザインが変更される際に、デザイナがちょちょいと修正することができないし、
 仮に開発者がデザインを元に修正するとしても結構大変。(私はよくタイポでぶっ壊します)
 PHP自体テンプレート言語だけど、ビューを簡潔に表現できるテンプレートフレームワークは沢山ある。

2.MVC
 細かくは書かないけど、MVCはWeb開発に欠かせないアーキテクチャ設計だと思う。
 それが例えフレームワークを使おうが使わなかろうが。
 ビジネスドメインを分かり易く表現し(Model)、それらを要求に合わせてコントロールし(Controller)、
 画面はそれを表示する。
 なんとも分かりやすい。
 フレームワークを使用するとその辺の区分けは大体やってくれるようになる。とういか強制される

3.可読性
 上に挙げたコードは数行だけど、実際はHTMLと合わせて3000行のコードなんてザラにあります。
 こんなソースを簡単に読めるはずがない。と断言できる。
 1クラス多くても1Kステップ。1functionあたり100Step未満じゃないと読める気がしない。

4.ユニットテスト
 このコードでどうやってやるの?やれる方法があったら聞きたい

5.バリデーション
 必須チェックとか桁数チェックとか絶対やる必要があるんだから、自分で作らずとも用意されてたほうが 
 良いにきまっている。

6.共通処理
 例に挙げているはセッションチェックとか権限チェックとかですが、その他にロガーの初期化とかDBコネクションの初期化とか
 共通処理に該当するものは数多くあります。
 それが毎回毎回コードの先頭で行われるわけですが、もし書き漏れたりしたらシステムは動きません。
 システムが動くにあたってこれらの処理は事前に動作するのが前提なので、メインコードに記述するまでもないです。
 (AOPのbeforeAdviceとかメタプログラミングでメソッドの呼び出しにフックするとか)

7.再利用性
 共通処理はfunctionにするレベルじゃなく、コンポーネントとしての再利用性。
 それはモデルだったりビューの部品だったり色々あるけど、ある要求に対して上から下にコードを実行して
 はい画面表示されただと再利用性もへったくれもない。

8.ソフトウェアは常に変わる
 ソフトウェアは作ってはい終わりという訳にはいきません。
 当然ニーズの変化に対応する場面は多々あります。もうこれは前提条件です。
 書いてることは重複してくるけど例に挙げたコードだとニーズの変化に対応することは難しいです。
 だって直しづらいし、再利用もしづらいんですもの。
 フレームワークによってシステムの基礎が固まることで、ニーズへの対応は基本的にMVCの部分にだけ手をいれることで
 可能になるはずです。

他にもありそうな気もするけど、ひとまずここまで。(ちょっとこじつけもあったけれども)
ね、使わない訳にはいかないでしょう?

後書き
 Javaで色々なフレームワークを試してきたけど、鉄板フレームワークなんてものは存在しませんでした。
 システムを開発するにあたり、要件も違えば開発スタイルも違う。開発者も違う。
 フレームワークも個々に特徴があり、必ずしも適合するとは限りません。
 PHPも然り。
 フレームワークを有効的に活用するには単に有名な実績のあるものを選択するのではなく、
 これから開発しようとするシステムやそれらを取り巻く環境も加味した上で導入する必要があります。
 私がCodeIgniterを始めようと思ったきっかけは、今携わっている仕事の規模や、教育コストなどを考慮して
 選択しました。OSLの問題もありますが、調べた限りだとなんとかなりそうなのと、
 最悪konohaかFuelPHPに移行する際の基礎になるからと理由で選択しました。