SlideShare ist ein Scribd-Unternehmen logo
1 von 28
@Hiraku
自己紹介
 @Hiraku(中野 拓)
 Webプログラマやってます
 PHP歴4年


 http://blog.tojiru.net/
 https://github.com/hirak
Wikipedia先生の解説

 アスペクト指向プログラミング
 Aspect Oriented Programming


   オブジェクト指向ではうまく分離できな
    い特徴(クラス間を横断 (cross-
    cutting) するような機能)を「アスペ
    クト」とみなし、アスペクト記述言語を
    もちいて分離して記述することでプログ
    ラムに柔軟性をもたせようとする試み。
具体例
 例外処理
 関数キャッシュ
 ロギング
 トランザクション
 実行時間の計測


   etc..
try {
  doSomething();
  //…

} catch (OutOfBoundsException $e) {
  recoverError($e);

} catch (RangeException $e) {
  recoverError($e);

}

    例外処理
class A {

                                      よくある光景
  function a() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function b() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function c() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
}
例外処理の問題
   いくらエラーの回復処理を関数化しても、
    try ~ catchブロック自体は何度も書く
    ことに

 DRY(Don't Repeat Yourself)じゃない
 「これ、さっきも書いたコードだな…」
   クラス分割や関数分割だけだとうまくモ
    ジュール化できないもの




     横断的関心事=Aspect
こういうパターンが多い
                  function a() {
                    try {
                      doSomething();
                      //…
                    } catch (RuntimeException $e) {
                      processError($e);
                    }
                  }

                                            こう分割できたらいいのに…


try {                                       function a() {
  //…                                         doSomething();
} catch (RuntimeException $e) {               //…
  processError($e);                         }
}
pecl-AOP
 AOPをextensionによって実装したもの
 http://pecl.php.net/package/AOP


 インストールさえできれば文法はわかり
  やすい
 runkitっぽい


# pecl install aop-beta
AOP用語(pecl-AOPの場合)
   Advice
     Aspectをモジュール化したもの。pecl-AOP
     ではコールバック関数で実装
   Joinpoint
     Adviceを織り込める場所。
   weave
     AdviceをJoinpointに差し込むこと。
例外処理をAdvice化
function processError(AopJoinpoint $joinpoint) {
  try {
    return $joinpoint->process();

    } catch (RuntimeException $e) {
      //エラー処理

    }
}
Weave(織り込む)
aop_add_around('A->*()', 'processError');

   AクラスのすべてのメソッドにprocessError()を織り込む、という指令
   これでAクラスのすべてのメソッドは、processError経由で呼ばれるよ
    うになる
class A {
  function a() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function b() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function c() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
}
class A {

                                         DRYになったね!
  function a() {
    doSomething();
    //…
  }
  function b() {
    doSomething();
    //…
  }
  function c() {
    doSomething();
    //…
  }
}

aop_add_around('A->*()', function (AopJoinpoint $joinpoint) {
  try {
    return $joinpoint->process();
  } catch (RuntimeException $e) {
    //エラー処理
  }
});
対応Joinpoint
 before any method / function call
 after any method / function call
 around any method / function call
 During the arousing of an exception
  of any method / function
 after any method / function call,
  should the method terminate
  normally or not (triggers an
  exception or not)
応用例はいっぱいありそう
 例外処理
 関数キャッシュ
 入出力のフィルタリング
 ロギング
 トランザクション
 実行時間の計測


   etc..
関数キャッシュ
   関数自体にキャッシュシステムを組み込む
add_aop_around('A->*()', function (AopJoinpoint $joinpoint) {
  $key = $joinpoint->getClassName() . '->' . $joinpoint->getMethodName();
  $cache = apc_fetch($key, $success);

 if ($success) {
   return $cache;
 }

 $result = $joinpoint->process();
 apc_store($key, $result);

  return $result;
});
pecl-AOPのヤバいところ
   既存の関数やメソッドなら何でも置き換
    え可能

   テストのモックとして強力
rand()の固定化
aop_add_around('rand()', function () {
  return 0;
});

var_dump(rand());
var_dump(rand());
var_dump(rand());




 rand()を同じ値しか返さない関数で置換
 何度実行しても0を返す
time()の固定化
aop_add_around('time()', function () {
  return 0;
});

var_dump(time());




   time()も初期値を自由に変更できる

   201X年を再現する、ということが可能
     timecopの方が特化してて便利だけど…
      それに近いことが可能
     https://github.com/hnw/php-timecop
何でも置き換え
 WebAPIにリクエストする部分を固定化
  とか
 DBに接続する部分を固定化とか


 要はクラスの継承と無関係な継承・上書
  きが可能
 自由すぎてわけわからん


   超強力 & 凶悪
pecl-AOP面白いよ
   超強力 & 凶悪

 テストのお供に
 書きにくいコードをすっきりDRYに


   PHPのゆるさが5割増しになるのが悩ま
    しい
注意点
 まだbeta扱いです。
 インストールもこけたりテストもこけた
  りする
 segmentation faultもよく起きる


   実戦投入はまだ危険

Weitere ähnliche Inhalte

Was ist angesagt?

PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話infinite_loop
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会Takinami Kei
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
言語処理系入門€6
言語処理系入門€6言語処理系入門€6
言語処理系入門€6Kenta Hattori
 
Javascript with Generative Art
Javascript with Generative ArtJavascript with Generative Art
Javascript with Generative ArtShinsuke Matsuda
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみるftnk
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32kikairoya
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4Kenta Hattori
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosTomohiro Kumagai
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Keisuke Fukuda
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数Wataru Terada
 

Was ist angesagt? (20)

PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
PHP language update 201211
PHP language update 201211PHP language update 201211
PHP language update 201211
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
言語処理系入門€6
言語処理系入門€6言語処理系入門€6
言語処理系入門€6
 
Javascript with Generative Art
Javascript with Generative ArtJavascript with Generative Art
Javascript with Generative Art
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
Task
TaskTask
Task
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
 
Mock and patch
Mock and patchMock and patch
Mock and patch
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4
 
ALPSチュートリアル(6) Matplotlib入門
ALPSチュートリアル(6) Matplotlib入門ALPSチュートリアル(6) Matplotlib入門
ALPSチュートリアル(6) Matplotlib入門
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
 
Okinawapm #1
Okinawapm #1Okinawapm #1
Okinawapm #1
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 

Andere mochten auch

『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイントkenjis
 
Xml builderの紹介
Xml builderの紹介Xml builderの紹介
Xml builderの紹介Hiraku Nakano
 
PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介Hiraku Nakano
 
composer-scriptsについて
composer-scriptsについてcomposer-scriptsについて
composer-scriptsについてHiraku Nakano
 
こわくない同時実行制御
こわくない同時実行制御こわくない同時実行制御
こわくない同時実行制御Hiraku Nakano
 
Scrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudyScrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudyHiraku Nakano
 
最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm晃 遠山
 
composerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudycomposerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudyHiraku Nakano
 
Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt Hiraku Nakano
 
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-Jumpei Miyata
 
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成Rakuten Group, Inc.
 
ポストJenkins時代のCI戦略
ポストJenkins時代のCI戦略ポストJenkins時代のCI戦略
ポストJenkins時代のCI戦略Hiroshi Maekawa
 
WordCamp Kansai 2015 CI ハンズオン
WordCamp Kansai 2015 CI ハンズオンWordCamp Kansai 2015 CI ハンズオン
WordCamp Kansai 2015 CI ハンズオンタカシ キタジマ
 
Jenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションJenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションMasanori Satoh
 
はじめての CircleCI
はじめての CircleCIはじめての CircleCI
はじめての CircleCIYosuke Mizutani
 

Andere mochten auch (17)

『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
 
Xml builderの紹介
Xml builderの紹介Xml builderの紹介
Xml builderの紹介
 
PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介
 
composer-scriptsについて
composer-scriptsについてcomposer-scriptsについて
composer-scriptsについて
 
JSON SchemaとPHP
JSON SchemaとPHPJSON SchemaとPHP
JSON SchemaとPHP
 
こわくない同時実行制御
こわくない同時実行制御こわくない同時実行制御
こわくない同時実行制御
 
Scrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudyScrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudy
 
最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm
 
composerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudycomposerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudy
 
Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt
 
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
 
URLで遊ぼう
URLで遊ぼうURLで遊ぼう
URLで遊ぼう
 
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
 
ポストJenkins時代のCI戦略
ポストJenkins時代のCI戦略ポストJenkins時代のCI戦略
ポストJenkins時代のCI戦略
 
WordCamp Kansai 2015 CI ハンズオン
WordCamp Kansai 2015 CI ハンズオンWordCamp Kansai 2015 CI ハンズオン
WordCamp Kansai 2015 CI ハンズオン
 
Jenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションJenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーション
 
はじめての CircleCI
はじめての CircleCIはじめての CircleCI
はじめての CircleCI
 

Ähnlich wie pecl-AOPの紹介

速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)taskie
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
Flow.js
Flow.jsFlow.js
Flow.jsuupaa
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験Toshio Ehara
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部haruki ueno
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravelRisa Ohnishi
 

Ähnlich wie pecl-AOPの紹介 (20)

速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
Flow.js
Flow.jsFlow.js
Flow.js
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
 
Junit4
Junit4Junit4
Junit4
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 

Kürzlich hochgeladen

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 

Kürzlich hochgeladen (9)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 

pecl-AOPの紹介

  • 2. 自己紹介  @Hiraku(中野 拓)  Webプログラマやってます  PHP歴4年  http://blog.tojiru.net/  https://github.com/hirak
  • 3.
  • 4. Wikipedia先生の解説  アスペクト指向プログラミング  Aspect Oriented Programming  オブジェクト指向ではうまく分離できな い特徴(クラス間を横断 (cross- cutting) するような機能)を「アスペ クト」とみなし、アスペクト記述言語を もちいて分離して記述することでプログ ラムに柔軟性をもたせようとする試み。
  • 5. 具体例  例外処理  関数キャッシュ  ロギング  トランザクション  実行時間の計測  etc..
  • 6. try { doSomething(); //… } catch (OutOfBoundsException $e) { recoverError($e); } catch (RangeException $e) { recoverError($e); } 例外処理
  • 7. class A { よくある光景 function a() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function b() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function c() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } }
  • 8. 例外処理の問題  いくらエラーの回復処理を関数化しても、 try ~ catchブロック自体は何度も書く ことに  DRY(Don't Repeat Yourself)じゃない  「これ、さっきも書いたコードだな…」
  • 9. クラス分割や関数分割だけだとうまくモ ジュール化できないもの 横断的関心事=Aspect
  • 10. こういうパターンが多い function a() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } こう分割できたらいいのに… try { function a() { //… doSomething(); } catch (RuntimeException $e) { //… processError($e); } }
  • 11.
  • 12. pecl-AOP  AOPをextensionによって実装したもの  http://pecl.php.net/package/AOP  インストールさえできれば文法はわかり やすい  runkitっぽい # pecl install aop-beta
  • 13. AOP用語(pecl-AOPの場合)  Advice  Aspectをモジュール化したもの。pecl-AOP ではコールバック関数で実装  Joinpoint  Adviceを織り込める場所。  weave  AdviceをJoinpointに差し込むこと。
  • 14. 例外処理をAdvice化 function processError(AopJoinpoint $joinpoint) { try { return $joinpoint->process(); } catch (RuntimeException $e) { //エラー処理 } }
  • 15. Weave(織り込む) aop_add_around('A->*()', 'processError');  AクラスのすべてのメソッドにprocessError()を織り込む、という指令  これでAクラスのすべてのメソッドは、processError経由で呼ばれるよ うになる
  • 16. class A { function a() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function b() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function c() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } }
  • 17. class A { DRYになったね! function a() { doSomething(); //… } function b() { doSomething(); //… } function c() { doSomething(); //… } } aop_add_around('A->*()', function (AopJoinpoint $joinpoint) { try { return $joinpoint->process(); } catch (RuntimeException $e) { //エラー処理 } });
  • 18. 対応Joinpoint  before any method / function call  after any method / function call  around any method / function call  During the arousing of an exception of any method / function  after any method / function call, should the method terminate normally or not (triggers an exception or not)
  • 19. 応用例はいっぱいありそう  例外処理  関数キャッシュ  入出力のフィルタリング  ロギング  トランザクション  実行時間の計測  etc..
  • 20. 関数キャッシュ  関数自体にキャッシュシステムを組み込む add_aop_around('A->*()', function (AopJoinpoint $joinpoint) { $key = $joinpoint->getClassName() . '->' . $joinpoint->getMethodName(); $cache = apc_fetch($key, $success); if ($success) { return $cache; } $result = $joinpoint->process(); apc_store($key, $result); return $result; });
  • 21.
  • 22. pecl-AOPのヤバいところ  既存の関数やメソッドなら何でも置き換 え可能  テストのモックとして強力
  • 23. rand()の固定化 aop_add_around('rand()', function () { return 0; }); var_dump(rand()); var_dump(rand()); var_dump(rand());  rand()を同じ値しか返さない関数で置換  何度実行しても0を返す
  • 24. time()の固定化 aop_add_around('time()', function () { return 0; }); var_dump(time());  time()も初期値を自由に変更できる  201X年を再現する、ということが可能  timecopの方が特化してて便利だけど… それに近いことが可能  https://github.com/hnw/php-timecop
  • 25. 何でも置き換え  WebAPIにリクエストする部分を固定化 とか  DBに接続する部分を固定化とか  要はクラスの継承と無関係な継承・上書 きが可能  自由すぎてわけわからん  超強力 & 凶悪
  • 26.
  • 27. pecl-AOP面白いよ  超強力 & 凶悪  テストのお供に  書きにくいコードをすっきりDRYに  PHPのゆるさが5割増しになるのが悩ま しい
  • 28. 注意点  まだbeta扱いです。  インストールもこけたりテストもこけた りする  segmentation faultもよく起きる  実戦投入はまだ危険