なぜフレームワークを 使うのか
第21回Creators MeetUp 2014/10/18 向井賢一
自己紹介
•向井賢一
• PHPカンファレンスのスタッフ
• https://twitter.com/mukaken
• https://www.facebook.com/mukaken
先日(10/11)開催されたPHPカンファレンス2014の 4F置いていたドリンクマシーンは
本日の主催者の小島さんにセットしてもらいました。 ありがとうございました!!
運営しているサイト• laravel.jp
• FuelPHP 日本語ニュース (facebook)
• Laravel 日本語ニュース (facebook)
• FuelPHP 英語コミュニティ (facebook)
• FuelPHP 日本語コミュニティ (facebook)
• Laravel jp 日本語コミュニティ (facebook)
注意!
Web フレームワークは プログラム が分からないと
使えません!$factorial = function($n) use (&$factorial) { if ($n <= 1) return 1; else return $n * $factorial($n - 1);};
var_dump($factorial(6));
Web アプリケーションフレームワーク
の事を
フレームワーク
と略しています
セッションの内容
• 何かしらのプログラミング言語 は一通り理解したが、 Web アプリケーションフレームワーク を使った事がない方を対象にべた書き(モノリシック)な プログラムを、Web アプリケーションフレームワーク を使い修正し、何が違うのかを比較をします
セッションの目次• フレームワークの説明でよく使われる用語の解説
• なぜフレームワークを使うのか ?
• 実際に PHP を使って説明
• 参考サイト と 参考文献
• まとめ
フレームワークの説明で よく使われる用語の解説
MVC モデル• 現在の フレームワーク で主流のアーキテクチャ
• MVCはモデル、ビュー、コントローラの略で、この3つの部品に分けて実装する
• Web で使われているフレームワークは、正確には元祖 MVC ではなく MVC 2
DRY 原則
• DRY は Don’t Repeat Yourself (繰り返しをさけること)の略
• プログラムを作る際にコピー&ペーストをすると、修正するときに大変な事になりますよ、との教訓
『達人プログラマー』の P.27 より
リファクタリング
• コードの記述のやり直し、再作業、再設計
• リファクタリングを行う場面は、二重化、直交してない設計、時代遅れの知識、パフォーマンスに問題がある場合
『達人プログラマー』の P.188 より
コーディング規約• プログラミング言語 はいろいろな記述ができるが、記述の統一性をもたせること
• 主には、命名規則、コーディングスタイル、禁止事項の事
• 例 : インデントをハードタブかソフトタブかのどちらかに統一する
• 一定のルールに従ってファイルやクラスの名前を決めていれば設定不要で動作する機構
• Ruby on Rails が取り入れた設計思想で話題になった
• 逆の設計思想で「規約より設定」を採用したフレームワークも多数ある
設定より規約 (CoC)
フレームワークの イメージ
ベテランのエンジニアに聞くと!
本棚に例えると
• 何も考えずに本を本棚にしまうと、どこに何の本があるか分からない
• フレームワークを使うと図書館のように整理整頓された本棚になり、どこに何があるかは一目瞭然
なぜフレームワークを使うのか ?
現代のソフトウェア開発の問題・要求
いままでの開発で、 こんな事に困った事ありませんか?• チームで開発するさいに、それぞれの開発スタイルがバラバラで、コミュニケーションに時間がかかる
• チームで開発するさいに、新たにチームに加わってもらう開発者に説明するのに時間がかかりすぎる
• 過去に自分で開発したソースを読み返すと、どこに何の記述がしてあるか分からなくて、解読するのに時間がかかる
近年のビジネス速度• 1990年代までのソフトウェアは業務の効率化を目的として作られ、一度作ったら長期間変更しないまま使い続ける
• 現在のソフトウェアはビジネスの変化に合わせて、その都度変更していく
• 現在ではソフトウェアのリリースサイクルが劇的に短くなってきている
現在のビジネスでは ソフトウェアは
常に作り替えなければならない
Amazon は1時間に1,000回以上
デプロイしているそうです
実際に PHP を使って 説明
http://www.slideshare.net/brtriver/php-14295877『フラットなPHPからフレームワークへ』から抜粋
前田さんの発表資料から引用・抜粋させて いただきました。
モノリシックなPHPを
フレームワークに 書き換える
リファクタリングによって
モノリシックなPHPView部分の分離
アプリケーション(ドメイン)部分の分離
フレームワーク
DBからデータ取得し 取得したデータを
HTMLで表示する
<?php $pdo = new PDO( 'mysql:host=localhost;dbname=blog_db;charset=utf8', 'myuser', 'mypassword', array(PDO::ATTR_EMULATE_PREPARES => false) ); $stmt = $pdo->query('SELECT id, title FROM post'); ?>
<html> <head> <title>投稿の一覧</title> </head> <body> <h1>投稿の一覧</h1> <ul> <?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)): ?> <li> <a href="show.php?id=<?php echo htmlspecialchars($row['id'], ENT_QUOTES, 'utf-8') ?>"> <?php echo htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8') ?> </a> </li> <?php endwhile; ?> </ul> </body> </html>
DBからデータ取得
取得したデータを表示
list.php
Browser PHP + HTML
list.php
クライアント サーバー
リクエスト
レスポンス
悪い点
アプリケーションの拡張性が無い 体系化されていない 再利用性がない
View部分の分離
<?php $pdo = new PDO( 'mysql:host=localhost;dbname=blog_db;charset=utf8', 'myuser', 'mypassword', array(PDO::ATTR_EMULATE_PREPARES => false) ); $stmt = $pdo->query('SELECT id, title FROM post'); ?>
<html> <head> <title>投稿の一覧</title> </head> <body> <h1>投稿の一覧</h1> <ul> <?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)): ?> <li> <a href="show.php?id=<?php echo htmlspecialchars($row['id'], ENT_QUOTES, 'utf-8') ?>"> <?php echo htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8') ?> </a> </li> <?php endwhile; ?> </ul> </body> </html>
show.php
ロジック部分
View(HTML)部分
show.php<?php $pdo = new PDO( 'mysql:host=localhost;dbname=blog_db:charset=utf8', 'myuser', 'mypassword', array(PDO::ATTR_EMULATE_PREPARES => false) ); $stmt = $pdo->query('SELECT id, title FROM post');
// HTML部分のコードを読み込む require 'templates/list.php';
別ファイルに分離
ロジック部分
Browser PHP
list.php
クライアント サーバー
リクエスト
レスポンス
HTMLtemplate/list.php
view
controller
Browser PHP
list.php
クライアント サーバー
リクエスト
jsontemplate/list-json.php
view
controller
レスポンス
テンプレートの変更に強い
View部分の分離
良い点
アプリケーション(ドメイン) 部分の分離
<?php $pdo = new PDO( 'mysql:host=localhost;dbname=blog_db:charset=utf8', 'myuser', 'mypassword', array(PDO::ATTR_EMULATE_PREPARES => false) ); $stmt = $pdo->query('SELECT id, title FROM post');
データベースへ接続する
index.php
全てのポストを取得する
データベースへ接続する 全てのポストを取得する
ドメイン
model.php に分離
<?php
// model.php
function get_database_connection() { $pdo = new PDO( 'mysql:host=localhost;dbname=blog_db;charset=utf8', 'myuser', 'mypassword', array(PDO::ATTR_EMULATE_PREPARES => false) ); return $pdo; }
function get_all_posts() { $pdo = get_database_connection();
$stmt = $pdo->query('SELECT id, title FROM post'); $posts = array(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $posts[] = $row; } return $posts; }
model.php
get_database_connection
get_all_posts
リファクタリング後のlist.php
<?php require 'model.php';
$posts = get_all_posts();
require 'templates/list.php';
コントローラーは制御するだけ
ロジック読込
全ポストを取得
ビュー読込
コントローラが本来のコントローラーに
良い点
アプリケーション(ドメイン)部分の分離
シンプルなMVC
Browser PHPlist.php
クライアント サーバー
リクエスト
レスポンス
HTMLtemplate/list.php
view
controller
Logicmodel.php
model
get_all_posts
$POSTS
フレームワークを 使っても失敗する例
フレームワークを使っても
意味がない例
よくある失敗例• フレームワークの約束(設計思想)に沿って作ってない (例 : フレームワークが用意した設定ファイルがあるのに、違う箇所に設定を書いてしまう)
• 通称ファット・コントローラとよばれている、動くからといって何の処理も1カ所に記述してしまう
フレームワークの種類プログラミング言語は、いろいろな用途のものがあるが、
フレームワークにも用途別に別れている。
PHPは歯ブラシである
PHPは歯ブラシくらい興奮に値する。シンプルで、毎日使う便利な道具。
http://j.ktamura.com/archives/1390
PHPの発案者 : Rasmus Lerdorf
プログラミング言語の分類
高級品 Haskell OCaml F# Scala
Ruby Python C Java
C#
日用品 PHP
小規模 大規模
※高級品は使うのに覚悟がいる、日用品は手軽に使える、という意味です
PHP フレームワークの分類
高級品 BEAR.Sunday Symfony
CakePHP Zend Framework 2
日用品 Laravel CodeIgniter
Yii
小規模 大規模
他言語でイメージ言語 大規模重量 高速軽量
PHP Symfony Laravel CodeIgniter
Ruby Ruby on Rails Sinatra
Python Django Flask
Haskell Yesod Snap
参考サイト・文献
参考サイト
• フラットなPHPからフレームワークへ
• http://www.slideshare.net/brtriver/php-14295877
PHP でアーキテクチャを 学ぶならこの本
効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門
パーフェクトPHP
アーキテクチャー集で 有名な本
ソフトウェアアーキテクチャ ソフトウェア開発のためのパターン体系
http://www.kindaikagaku.co.jp/information/kd0283.htm
2000.12.04発売 未だに、いろいろな文献から よく引用されている
プログラマーの心得的な本
達人プログラマー システム開発の職人から名匠への道
その他1
Chef実践入門 ~コードによるインフラ構成の自動化
CakePHP2 実践入門
その他2
Webアプリケーション設計・実装のための フレームワーク活用の技術
Software Design (ソフトウェアデザイン) 2014年4月号 なぜMVCモデルは誤解されるのか?
ウンチクを語りたい人に おすすめの本
SMALLTALKで学ぶ オブジェクト指向プログラミングの本質
Smalltalk という言語で MVC について語られています
まとめ フレームワークを使う理由
• チーム開発のさいの共通認識になる
• 整理整頓された見渡しの良いプログラムになり変更が容易になる
• 近年のビジネス速度の変化に柔軟に対応できるアーキテクチャの構築ができる
ご清聴 ありがとうございました
Recommended