フレームワークを使うべき 3 つの理由

12,750 views

Published on

PHP カンファレンス関西 2014 の発表資料です。

13:30-14:00 フレームワークを使うべき 3 つの理由
http://conference.kphpug.jp/2014/

Published in: Technology
0 Comments
32 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
12,750
On SlideShare
0
From Embeds
0
Number of Embeds
140
Actions
Shares
0
Downloads
36
Comments
0
Likes
32
Embeds 0
No embeds

No notes for slide

フレームワークを使うべき 3 つの理由

  1. 1. フレームワークを使うべき 3 つの理由 PHP カンファレンス関西 2014 2014/6/28 向井賢一
  2. 2. ご来場 ありがとうございます 自宅(横浜)の 近所の居酒屋の看板 漫☆画太郎?
  3. 3. 会場のスタッフの皆様 マジでリスペクト!
  4. 4. 自己紹介 • 向井賢一 • 職業 : 雑用係 • https://twitter.com/mukaken • https://www.facebook.com/mukaken
  5. 5. 運営しているサイト・イベント • FuelPHP 日本語ニュース (facebook) • Laravel 日本語ニュース (facebook) • FuelPHP 英語コミュニティ (facebook) • FuelPHP 日本語コミュニティ (facebook) • Laravel jp 日本語コミュニティ (facebook) • Laravel Meetup Tokyo (次回 7/4(金) 19:00- 東京都渋谷区)
  6. 6. 好きな曲 PHP The Anthem http://www.youtube.com/watch?v=S8zhmiS-1kw
  7. 7. 注意!
  8. 8. PHPWebフレームワークは PHPが分からないと 使えません $factorial = function($n) use (&$factorial) {! if ($n <= 1)! return 1;! else! return $n * $factorial($n - 1);! };! ! var_dump($factorial(6));
  9. 9. Webアプリケーションフレームワーク の事を フレームワーク と略しています
  10. 10. セッションの内容 • PHP の文法は一通り理解したが、 Web アプリ ケーションフレームワーク を使った事がない方 を対象にべた書き(モノリシック)な PHP プログ ラムを、Web アプリケーションフレームワーク を使い修正し、何が違うのかを比較をします。 • PHP の Web アプリケーションフレームワークで 代表的なものを紹介し、それぞれを比較します。
  11. 11. 今朝の基調講演で郡山さんが話さ れていた「フレームワークとは?」 • アプリケーションの制約 • 原則に従う • 長期的な変更 当セッションで 言いたい事は同じ!
  12. 12. セッションの目次 • フレームワークの説明でよく使われる用語の解説 • なぜフレームワークを使うのか ? • 実際に PHP を使って説明 • PHP フレームワークの種類 • 参考サイト 参考文献 • まとめ
  13. 13. フレームワークの説明で よく使われる用語の解説
  14. 14. MVC モデル • 現在の フレームワーク で主流のアーキテクチャ • モデル、ビュー、コントローラの3つに分けて実 装する • Web で使われているフレームワークは、正確に は元祖 MVC ではなく MVC 2
  15. 15. DRY 原則 • DRY は Don’t Repeat Yourself (繰り返しをさける こと)の略 • プログラムを作る際にコピー&ペーストをする と、修正するときに大変な事になりますよ、と の教訓 『達人プログラマー』の P.27 より
  16. 16. リファクタリング • コードの記述のやり直し、再作業、再設計 • リファクタリングを行う場面は、二重化、直交 してない設計、時代遅れの知識、パフォーマン スに問題がある場合 『達人プログラマー』の P.188 より
  17. 17. コーディング規約 • PHP はいろいろな記述ができるが、記述の統一 性をもたせること • 主には、命名規則、コーディングスタイル、禁 止事項の事 • 例 : インデントをハードタブかソフトタブかのど ちらかに統一する
  18. 18. • 一定のルールに従ってファイルやクラスの名前を 決めていれば設定不要で動作する機構 • Ruby on Rails が取り入れた設計思想で話題に なった • 逆の設計思想で「規約より設定」を採用したフ レームワークも多数ある 設定より規約 (CoC)
  19. 19. フレームワークの イメージ ベテランのエンジニアに聞くと!
  20. 20. 本棚に例えると • 何も考えずに本を本棚にしまうと、どこに何の 本があるか分からない • フレームワークを使うと図書館のように整理整 頓された本棚になり、どこに何があるかは一目 瞭然
  21. 21. なぜフレームワークを 使うのか ? 現代のソフトウェア開発の問題・要求
  22. 22. いままでの開発で、 こんな事に困った事ありませんか? • チームで開発するさいに、それぞれの開発スタイル がバラバラで、コミュニケーションに時間がかかる • チームで開発するさいに、新たにチームに加わって もらう開発者に説明するのに時間がかかりすぎる • 過去に自分で開発したソースを読み返すと、どこに 何の記述がしてあるか分からなくて、解読するのに 時間がかかる
  23. 23. 近年のビジネス速度 • 1990年代までのソフトウェアは業務の効率化を 目的として作られ、一度作ったら長期間変更し ないまま使い続ける • 現在のソフトウェアはビジネスの変化に合わせ て、その都度変更していく • 現在ではソフトウェアのリリースサイクルが劇的 に短くなってきている
  24. 24. 現在のソフトウェアは 常に作り替えなければならない Amazonは1時間に1,000回以上 デプロイしているそうです
  25. 25. 実際に PHP を使って 説明 http://www.slideshare.net/brtriver/php-14295877 『フラットなPHPからフレームワークへ』から抜粋 前田さんの発表資料から引用・抜粋させて いただきました。
  26. 26. モノリシックなPHPを フレームワークに 書き換える リファクタリングよって
  27. 27. モノリシックなPHP View部分の分離 アプリケーション(ドメイン)部分の分離 フレームワーク
  28. 28. DBからデータ取得し 取得したデータを HTMLで表示する
  29. 29. <?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
  30. 30. Browser PHP + HTML list.php クライアント サーバー リクエスト レスポンス
  31. 31. 悪い点 アプリケーションの拡張性が無い 体系化されていない 再利用性がない
  32. 32. View部分の分離
  33. 33. <?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)部分
  34. 34. 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'; 別ファイルに分離 ロジック部分
  35. 35. Browser PHP list.php クライアント サーバー リクエスト レスポンス HTML template/list.php view controller
  36. 36. Browser PHP list.php クライアント サーバー リクエスト json template/list-json.php view controller レスポンス
  37. 37. テンプレートの変更に強い View部分の分離 良い点
  38. 38. アプリケーション(ドメイン) 部分の分離
  39. 39. <?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 全てのポストを取得する
  40. 40. データベースへ接続する 全てのポストを取得する ドメイン model.php に分離
  41. 41. <?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
  42. 42. リファクタリング後のlist.php <?php require 'model.php'; ! $posts = get_all_posts(); ! require 'templates/list.php'; コントローラーは制御するだけ ロジック読込 全ポストを取得 ビュー読込
  43. 43. コントローラが本来のコントローラーに 良い点 アプリケーション(ドメイン)部分の分離 シンプルなMVC
  44. 44. Browser PHP list.php クライアント サーバー リクエスト レスポンス HTML template/list.php view controller Logic model.php model get_all_posts $POSTS
  45. 45. フレームワークを使って 書き直したら
  46. 46. PHP でメジャーなフレームワークを 使って構築してみます • Codeigniter を使用 • 覚える事が少ないので初心者向き • バージョン 2系 を使います
  47. 47. デモ
  48. 48. フレームワークを 使っても失敗する例 フレームワークを使っても 意味がない例
  49. 49. よくある失敗例 • フレームワークの約束(設計思想)に沿って作って ない (例 : フレームワークが用意した設定ファイ ルがあるのに、違う箇所に設定を書いてしまう) • 通称ファット・コントローラとよばれている、 動くからといって何の処理も1カ所に記述してし まう
  50. 50. PHP フレームワーク の種類
  51. 51. PHP の フレームワークといえば?
  52. 52. •Laravel - 10,516 •Symfony - 8,536 •CodeIgniter - 7,760 •Zend Framework 2 - 4,763 Github ★の数 2014/6/27現在
  53. 53. Google トレンド (世界) http://www.google.com/trends/explore#q=Laravel%2C%20symfony%2BSymfony2%2C %20Codeigniter%2C%20Yii%2C%20CakePHP&cmpt=q
  54. 54. PHPは歯ブラシである PHPは歯ブラシくらい興奮に値する。 シンプルで、毎日使う便利な道具。 http://j.ktamura.com/archives/1390 PHPの発案者 : Rasmus Lerdorf
  55. 55. プログラミング言語の分類 高級品 Haskell OCaml F# Scala Ruby Python C Java C# 日用品 PHP 小規模 大規模 ※高級品は使うのに覚悟がいる、日用品は手軽に使える、という意味です
  56. 56. PHP フレームワークの分類 高級品 BEAR.Sunday Symfony CakePHP Zend Framework 2 日用品 Laravel CodeIgniter Yii 小規模 大規模
  57. 57. 他言語でイメージ 言語 大規模重量 高速軽量 PHP Symfony Laravel CodeIgniter Ruby Ruby on Rails Sinatra Python Django Flask Haskell Yesod Snap
  58. 58. 世界での転職市場の求人数 •CodeIgniter 54件 •Symfony 50件 •CakePHP 48件 •Laravel 37件 •FuelPHP 2件 http://www.monster.com/ MONSTER 2014/6/27 調査
  59. 59. 各フレームワークの 比較
  60. 60. Laravel • URL : http://laravel.com/ • ライセンス : MIT • 対応する PHP : 5.4 以上 • 安定版最新バージョン : 4.2 • 開発元 : taylor otwell • 日本語のドキュメント : あり
  61. 61. Laravel の特徴 • 近年、爆発的に人気急上昇 • PHP ではないようなキレイなソースが書ける • 日本語の書籍が充実 • Laravel の書籍 まとめ http://qiita.com/mukaken/items/ 2058a193ee0ce6fbfd30 • 信頼性の高い Symfony エコスステムの上に構築
  62. 62. Symfony • URL : http://symfony.com • ライセンス : MIT • 対応する PHP : 5.3.3 以上 • 安定版最新バージョン : 2.5 • 開発元 : フランスのSensio社
  63. 63. Symfony の特徴 • 大規模重厚 • 多機能な分、インストールや習得に多くの時 間がかかる • 重いといわれていたが、2で改良され、シンプ ル・高速 • メンテナンスのロードマップが明確に提示 • 「PHP界のインフラ」と言われている
  64. 64. Laravel と Symfony の違い http://www.reddit.com/r/PHP/comments/1bdln1/symfony2_vs_laravel/c96ohf1 Laravel の作者 Taylor Otwell 曰く「Symfony 2 と Laravel 4 は Debian と Ubuntu の関係に近い」だそうで す。 ! Taylor Otwell が Symfony のカンファレンスに参加したり、 逆に Symfony プロジェクト の Fabien が Laravel のカンファレンス に参加したりと、お互いを意識しながらプロジェクトを進めてい る。
  65. 65. CodeIgniter • URL : http://codeigniter.com • ライセンス : CodeIgniter License • 対応する PHP : 5.2.4 以上 • 安定版最新バージョン : 2.2.0 • 開発元 : アメリカのEllisLab • 日本語のドキュメント : あり
  66. 66. CodeIgniterの特徴 • 軽量高速 • 小規模開発向け • 日本国内ではライセンス問題で話題になったが、 国外ではそれほどでもない感じがする • 世界では根強い人気 • 現在、開発元が売りに出している • 国内での採用実績 : MTV Japan
  67. 67. FuelPHP • URL : http://fuelphp.com • ライセンス : MIT • 対応する PHP : 5.3 以上 • 安定版最新バージョン : 1.7.1 • 開発元 : コミュニティ • 日本語のドキュメント : あり
  68. 68. FuelPHPの特徴 •軽量高速 •小規模開発に向いている •規約より設定 (覚える事が少ない) •イースター・エッグが満載(喋るなど) •作る事に主眼を置いている •CodeIgniter に使い方が似ている
  69. 69. Codeigniter vs FuelPHP http://ilikekillnerds.com/2012/10/codeigniter-vs-fuelphp-revisited/ Documentation ORM/ Database Abstraction PHPの互換性 The Community Codeigniter 選ぶポイントにな るほどすばらしい 本格的なORMほど ではないが database query builder がある 変化している が、レガシー PHPサポート による肥大化 かなり巨大 FuelPHP 新しいデザイン CIほど堅牢ではな い 強力な ORM PHPの新機能 をサポート より活発になっ てきている 10/25
  70. 70. CakePHP • URL : http://cakephp.org • ライセンス : MIT • 対応する PHP : 5.2.8 以上 • 安定版最新バージョン : 2.5.2 • 開発元 : アメリカのCakeソフトウェア財団
  71. 71. CakePHPの特徴 • 小・中規模向け • 設定よりも規約(多くのルールがある) • CakePHP2は、内部の構造や基本的なルール が見直された • 用語がケーキ関連
  72. 72. 参考サイト・文献
  73. 73. 参考サイト • フラットなPHPからフレームワークへ • http://www.slideshare.net/brtriver/php-14295877
  74. 74. PHP でアーキテクチャを 学ぶならこの本 効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門 パーフェクトPHP
  75. 75. アーキテクチャー集で 有名な本 ソフトウェアアーキテクチャ ソフトウェア開発のためのパターン体系 http://www.kindaikagaku.co.jp/information/kd0283.htm 2000.12.04発売 未だに、いろいろな文献から よく引用されている
  76. 76. プログラマーの心得的な本 達人プログラマー システム開発の職人から名匠への道
  77. 77. その他1 Chef実践入門 ~コードによるインフラ構成の自動化 CakePHP2 実践入門
  78. 78. その他2 Webアプリケーション設計・実装のための フレームワーク活用の技術 Software Design (ソフトウェアデザイン) 2014年4月号 なぜMVCモデルは誤解されるのか?
  79. 79. ウンチクを語りたい人に おすすめの本 SMALLTALKで学ぶ オブジェクト指向プログラミングの本質 Smalltalk という言語で MVC について語られています
  80. 80. まとめ フレームワークを使う3つの理由 • チーム開発のさいの共通認識になる • 整理整頓された見渡しの良いプログラムになり 変更が容易になる • 近年のビジネス速度の変化に柔軟に対応できる アーキテクチャの構築ができる
  81. 81. ご清聴 ありがとうございました

×