59
なぜフレームワークを 使うのか 第21回Creators MeetUp 2014/10/18 向井賢一

第21回Creators MeetUp

Embed Size (px)

DESCRIPTION

Session04「なぜフレームワークを使うのか」 プログラミング言語 (PHPなど) の文法は理解したが、Web アプリケーションフレームワークを使った事がない方を対象に、べた書き(モノリシック)なプログラムを、Web アプリケーションフレームワーク を使い修正し、何が違うのかを比較します。

Citation preview

Page 1: 第21回Creators MeetUp

なぜフレームワークを 使うのか

第21回Creators MeetUp 2014/10/18 向井賢一

Page 2: 第21回Creators MeetUp

会場のスタッフの皆様 株式会社LIG 様

ありがとうございます!

Page 3: 第21回Creators MeetUp

自己紹介

•向井賢一

• PHPカンファレンスのスタッフ

• https://twitter.com/mukaken

• https://www.facebook.com/mukaken

Page 4: 第21回Creators MeetUp

先日(10/11)開催されたPHPカンファレンス2014の 4F置いていたドリンクマシーンは

本日の主催者の小島さんにセットしてもらいました。 ありがとうございました!!

Page 5: 第21回Creators MeetUp

運営しているサイト• laravel.jp

• FuelPHP 日本語ニュース (facebook)

• Laravel 日本語ニュース (facebook)

• FuelPHP 英語コミュニティ (facebook)

• FuelPHP 日本語コミュニティ (facebook)

• Laravel jp 日本語コミュニティ (facebook)

Page 6: 第21回Creators MeetUp

注意!

Page 7: 第21回Creators MeetUp

Web フレームワークは プログラム が分からないと

使えません!$factorial = function($n) use (&$factorial) { if ($n <= 1) return 1; else return $n * $factorial($n - 1);};

var_dump($factorial(6));

Page 8: 第21回Creators MeetUp

Web アプリケーションフレームワーク

の事を

フレームワーク

と略しています

Page 9: 第21回Creators MeetUp

セッションの内容

• 何かしらのプログラミング言語 は一通り理解したが、 Web アプリケーションフレームワーク を使った事がない方を対象にべた書き(モノリシック)な プログラムを、Web アプリケーションフレームワーク を使い修正し、何が違うのかを比較をします

Page 10: 第21回Creators MeetUp

セッションの目次• フレームワークの説明でよく使われる用語の解説

• なぜフレームワークを使うのか ?

• 実際に PHP を使って説明

• 参考サイト と 参考文献

• まとめ

Page 11: 第21回Creators MeetUp

フレームワークの説明で よく使われる用語の解説

Page 12: 第21回Creators MeetUp

MVC モデル• 現在の フレームワーク で主流のアーキテクチャ

• MVCはモデル、ビュー、コントローラの略で、この3つの部品に分けて実装する

• Web で使われているフレームワークは、正確には元祖 MVC ではなく MVC 2

Page 13: 第21回Creators MeetUp

DRY 原則

• DRY は Don’t Repeat Yourself (繰り返しをさけること)の略

• プログラムを作る際にコピー&ペーストをすると、修正するときに大変な事になりますよ、との教訓

『達人プログラマー』の P.27 より

Page 14: 第21回Creators MeetUp

リファクタリング

• コードの記述のやり直し、再作業、再設計

• リファクタリングを行う場面は、二重化、直交してない設計、時代遅れの知識、パフォーマンスに問題がある場合

『達人プログラマー』の P.188 より

Page 15: 第21回Creators MeetUp

コーディング規約• プログラミング言語 はいろいろな記述ができるが、記述の統一性をもたせること

• 主には、命名規則、コーディングスタイル、禁止事項の事

• 例 : インデントをハードタブかソフトタブかのどちらかに統一する

Page 16: 第21回Creators MeetUp

• 一定のルールに従ってファイルやクラスの名前を決めていれば設定不要で動作する機構

• Ruby on Rails が取り入れた設計思想で話題になった

• 逆の設計思想で「規約より設定」を採用したフレームワークも多数ある

設定より規約 (CoC)

Page 17: 第21回Creators MeetUp

フレームワークの イメージ

ベテランのエンジニアに聞くと!

Page 18: 第21回Creators MeetUp

本棚に例えると

• 何も考えずに本を本棚にしまうと、どこに何の本があるか分からない

• フレームワークを使うと図書館のように整理整頓された本棚になり、どこに何があるかは一目瞭然

Page 19: 第21回Creators MeetUp

なぜフレームワークを使うのか ?

現代のソフトウェア開発の問題・要求

Page 20: 第21回Creators MeetUp

いままでの開発で、 こんな事に困った事ありませんか?• チームで開発するさいに、それぞれの開発スタイルがバラバラで、コミュニケーションに時間がかかる

• チームで開発するさいに、新たにチームに加わってもらう開発者に説明するのに時間がかかりすぎる

• 過去に自分で開発したソースを読み返すと、どこに何の記述がしてあるか分からなくて、解読するのに時間がかかる

Page 21: 第21回Creators MeetUp

近年のビジネス速度• 1990年代までのソフトウェアは業務の効率化を目的として作られ、一度作ったら長期間変更しないまま使い続ける

• 現在のソフトウェアはビジネスの変化に合わせて、その都度変更していく

• 現在ではソフトウェアのリリースサイクルが劇的に短くなってきている

Page 22: 第21回Creators MeetUp

現在のビジネスでは ソフトウェアは

常に作り替えなければならない

Amazon は1時間に1,000回以上

デプロイしているそうです

Page 23: 第21回Creators MeetUp

実際に PHP を使って 説明

http://www.slideshare.net/brtriver/php-14295877『フラットなPHPからフレームワークへ』から抜粋

前田さんの発表資料から引用・抜粋させて いただきました。

Page 24: 第21回Creators MeetUp

モノリシックなPHPを

フレームワークに 書き換える

リファクタリングによって

Page 25: 第21回Creators MeetUp

モノリシックなPHPView部分の分離

アプリケーション(ドメイン)部分の分離

フレームワーク

Page 26: 第21回Creators MeetUp

DBからデータ取得し 取得したデータを

HTMLで表示する

Page 27: 第21回Creators MeetUp

<?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

Page 28: 第21回Creators MeetUp

Browser PHP + HTML

list.php

クライアント サーバー

リクエスト

レスポンス

Page 29: 第21回Creators MeetUp

悪い点

アプリケーションの拡張性が無い 体系化されていない 再利用性がない

Page 30: 第21回Creators MeetUp

View部分の分離

Page 31: 第21回Creators MeetUp

<?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)部分

Page 32: 第21回Creators MeetUp

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';

別ファイルに分離

ロジック部分

Page 33: 第21回Creators MeetUp

Browser PHP

list.php

クライアント サーバー

リクエスト

レスポンス

HTMLtemplate/list.php

view

controller

Page 34: 第21回Creators MeetUp

Browser PHP

list.php

クライアント サーバー

リクエスト

jsontemplate/list-json.php

view

controller

レスポンス

Page 35: 第21回Creators MeetUp

テンプレートの変更に強い

View部分の分離

良い点

Page 36: 第21回Creators MeetUp

アプリケーション(ドメイン) 部分の分離

Page 37: 第21回Creators MeetUp

<?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

全てのポストを取得する

Page 38: 第21回Creators MeetUp

データベースへ接続する 全てのポストを取得する

ドメイン

model.php に分離

Page 39: 第21回Creators MeetUp

<?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

Page 40: 第21回Creators MeetUp

リファクタリング後のlist.php

<?php require 'model.php';

$posts = get_all_posts();

require 'templates/list.php';

コントローラーは制御するだけ

ロジック読込

全ポストを取得

ビュー読込

Page 41: 第21回Creators MeetUp

コントローラが本来のコントローラーに

良い点

アプリケーション(ドメイン)部分の分離

シンプルなMVC

Page 42: 第21回Creators MeetUp

Browser PHPlist.php

クライアント サーバー

リクエスト

レスポンス

HTMLtemplate/list.php

view

controller

Logicmodel.php

model

get_all_posts

$POSTS

Page 43: 第21回Creators MeetUp

フレームワークを 使っても失敗する例

フレームワークを使っても

意味がない例

Page 44: 第21回Creators MeetUp

よくある失敗例• フレームワークの約束(設計思想)に沿って作ってない (例 : フレームワークが用意した設定ファイルがあるのに、違う箇所に設定を書いてしまう)

• 通称ファット・コントローラとよばれている、動くからといって何の処理も1カ所に記述してしまう

Page 45: 第21回Creators MeetUp

フレームワークの種類プログラミング言語は、いろいろな用途のものがあるが、

フレームワークにも用途別に別れている。

Page 46: 第21回Creators MeetUp

PHPは歯ブラシである

PHPは歯ブラシくらい興奮に値する。シンプルで、毎日使う便利な道具。

http://j.ktamura.com/archives/1390

PHPの発案者 : Rasmus Lerdorf

Page 47: 第21回Creators MeetUp

プログラミング言語の分類

高級品 Haskell OCaml F# Scala

Ruby Python C Java

C#

日用品 PHP

小規模 大規模

※高級品は使うのに覚悟がいる、日用品は手軽に使える、という意味です

Page 48: 第21回Creators MeetUp

PHP フレームワークの分類

高級品 BEAR.Sunday Symfony

CakePHP Zend Framework 2

日用品 Laravel CodeIgniter

Yii

小規模 大規模

Page 49: 第21回Creators MeetUp

他言語でイメージ言語 大規模重量 高速軽量

PHP Symfony Laravel CodeIgniter

Ruby Ruby on Rails Sinatra

Python Django Flask

Haskell Yesod Snap

Page 50: 第21回Creators MeetUp

参考サイト・文献

Page 51: 第21回Creators MeetUp

参考サイト

• フラットなPHPからフレームワークへ

• http://www.slideshare.net/brtriver/php-14295877

Page 52: 第21回Creators MeetUp

PHP でアーキテクチャを 学ぶならこの本

効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門

パーフェクトPHP

Page 53: 第21回Creators MeetUp

アーキテクチャー集で 有名な本

ソフトウェアアーキテクチャ ソフトウェア開発のためのパターン体系

http://www.kindaikagaku.co.jp/information/kd0283.htm

2000.12.04発売 未だに、いろいろな文献から よく引用されている

Page 54: 第21回Creators MeetUp

プログラマーの心得的な本

達人プログラマー システム開発の職人から名匠への道

Page 55: 第21回Creators MeetUp

その他1

Chef実践入門 ~コードによるインフラ構成の自動化

CakePHP2 実践入門

Page 56: 第21回Creators MeetUp

その他2

Webアプリケーション設計・実装のための フレームワーク活用の技術

Software Design (ソフトウェアデザイン) 2014年4月号 なぜMVCモデルは誤解されるのか?

Page 57: 第21回Creators MeetUp

ウンチクを語りたい人に おすすめの本

SMALLTALKで学ぶ オブジェクト指向プログラミングの本質

Smalltalk という言語で MVC について語られています

Page 58: 第21回Creators MeetUp

まとめ フレームワークを使う理由

• チーム開発のさいの共通認識になる

• 整理整頓された見渡しの良いプログラムになり変更が容易になる

• 近年のビジネス速度の変化に柔軟に対応できるアーキテクチャの構築ができる

Page 59: 第21回Creators MeetUp

ご清聴 ありがとうございました