$30 off During Our Annual Pro Sale. View Details »

PHP8によるデザインパターン入門 / Introduction to Design Patt...

PHP8によるデザインパターン入門 / Introduction to Design Patterns with PHP8

Futoshi Endo

March 18, 2023
Tweet

More Decks by Futoshi Endo

Other Decks in Programming

Transcript

  1. © 2012-2023 BASE, Inc. 2 氏名:Futoshi Endo 所属:BASE株式会社 入社:2023/01 ~

    業務:バックエンド エンジニア 趣味:料理、音楽鑑賞、ゲーム PHP歴は6年、昔からブログを書いたり、 Scrapboxで日記を書いています。 好きなデザインパターンは Facade • Endo Tech Blog • https://scrapbox.io/fendo181/ Fendo181 自己紹介
  2. © 2012-2023 BASE, Inc. 5 このタイトルにした背景には「PHPによるデザインパターン入門」 という、2006年に刊行された名書があります。本で書かれている PHPのバージョンは5.x系で、このとき型宣言も列挙型もまだ導入さ れていませんでした。 その後PHP7から「型宣言」が導入され、

    PHPは昔と比べて堅牢にコードが書けるプログラミング言語になり ました。 読み進めながら写経していると「はたして最新のPHP8で書き直し たらどんな違いがあるのか? もしくはデザインパターンで解決した い本質は変わらないのか?」という素朴な疑問が出てきて、掘り下 げてわかりやすく説明したいと思い上記のタイトルになりました。 自己紹介
  3. © 2012-2023 BASE, Inc. 8 「Design Patterns: Elements of Reusable

    Object-Oriented Software」 (邦題:「オブジェクト思考における再利用の為のデザインパターン」)出てくる「デザインパターン」を指します。 通称「GoF(Gang of Four)本」とも呼ばれています。 今日の発表のゴール
  4. © 2012-2023 BASE, Inc. 1 2 「デザインパターン」を学ぶ事で言語に 問わず、良い設計を身につけられること がわかる 9

    今日の発表のゴール 2 3 「デザインパターン」に興味が出てくる PHPというプログラミング言語が日々改善して 堅牢な言語になっている事がわかる
  5. © 2012-2023 BASE, Inc. アジェンダ 11 https://github.com/k1LoW/tbls • デザインパターンの歴史 •

    PHP5、PHP7、PHP8 の違い • Singletonでそれぞれ比較する • まとめ • 最後に伝えたい事 • (参考文献の紹介)
  6. © 2012-2023 BASE, Inc. デザインパターンの歴史 13 1984 1984年、建築家であるChristopher Alexander氏により 「A

    Pattern Language: Towns, Buildings, Construnction」(邦題:「パタン・ランゲー ジ―環境設計の手引き」/[鹿島出版会]という論文が発表される。
  7. © 2012-2023 BASE, Inc. デザインパターンの歴史 14 1987 1987年にKent Beck氏、Ward Cunningham氏がオブジェクト指向に関するカン

    ファレンスで「Using Pattern Languages for Object-Oriented Programs」 という論文を発表。ここでさしている Pattern Languages は Alexander氏が書 いた「A Pattern Language」から来ている。 1984
  8. © 2012-2023 BASE, Inc. デザインパターンの歴史 16 1990年、Bruce Anderson氏が「Toward an Architecture

    HandBook」を 作る為に、有志の集会「OOPSLA/ECCOP」を開催します。ここで再利用可 能なオブジェクト指向のソフトウェアについて議論が交わされる。 1987 1984 1990
  9. © 2012-2023 BASE, Inc. デザインパターンの歴史 17 ワークショップでErich Gamma氏、Richard Helm氏、Ralph Johnson氏、John

    Vlissides氏の4人が正式に顔合わせをする。後にこの4人はGang of For(GoF)とし て知られるようになる。※ここでいうGoFは「歴史に残る有名な4人組」という ニュアンスで使われています。 1992 1990 1987 1984
  10. © 2012-2023 BASE, Inc. デザインパターンの歴史 18 1992 1990 1987 1984

    1994 1994年の10月、GoFは「Design Patterns: Elements of Reusable Object-Oriented Software(オブジェクト思考における再利用の為のデザインパ ターン)」を発表。これはソフトウェア設計において繰り返し現れる構造をパター ンとしてまとめて、カタログにしたもので全部で23パターンが掲載されています。
  11. © 2012-2023 BASE, Inc. デザインパターンの歴史 19 生成関連 パターン Abstract Factory

    Builder Factory Method Prototype Singleton 振舞関連 パターン Chain of Responsibilty Command Interpreter Iteretor Mediator Memento Observe State Strategy Template Method Visitor 構造関連 パターン Adapter Bridge Composite Decorator Facade Flyweight Proxy
  12. © 2012-2023 BASE, Inc. デザインパターンの歴史 20 • GoF本のデザインパターンは建築における「パターン・ランゲージ」をソフトウェア業界に もって来た背景があった。 •

    デザインパターンとは建築同様に、何度も同じ設計をしていると出てくる共通の機能や問題 について解決する為に作られて「ノウハウ集」になっている。 • 建築物には数千年の歴史があり、利用できる古典も多いがソフトウェアの歴史はずっと短 く、古典と呼ばれるものはほとんどない。 • Alexander氏が提案したパターンによって完全な建物が生成できると主張するが、GoF本で 提案しているデザインパターンによって完全なプログラムが生成できるとは主張してない。 ◦ デザインパターンが確立されてから29年しか経ってない • GoF本の「デザインパターン」に記載されている23個のパターンはあくまでも有力なパター ンをまとめたものである。 ◦ Ward Cunningham氏の wiki には他のパターンも紹介されている。
  13. © 2012-2023 BASE, Inc. PHP5、PHP7、PHP8 の違い 23 1994 PHP Tools

    1994年、Rasmus Lerdorf (ラスマス・ラードフ)はオンラインで公開している経歴 書のアクセス履歴を調べるために使っていたスクリプト群を「Personal Home Page Tools」と命名。一般的には「PHP Tools」と呼ばれていました。 1995年、 PHP Tools のソースコードを公開 し開発者がバグ修正や機能改善をするよ うになりました。
  14. © 2012-2023 BASE, Inc. PHP5、PHP7、PHP8 の違い 25 1994 PHP7.xの大幅な変更として関数やメソッドの引数に対して、型の指定がで きるようになった。また、PHP7.xは、PHP5.xと比較して平均2倍の処理速

    度になった。これ以外にも null 合体演算子 が加えられて少ないコードで記 述できるようになった。 2004 2014 2015 PHP7.0 2019 PHP7.4 PHP5.0 PHP5.6 PHP Tools
  15. © 2012-2023 BASE, Inc. PHP5、PHP7、PHP8 の違い 26 1994 PHP8.xの大幅な変更としてユニオン型(UnionTypes)、名前付き引数、列 挙型(Enum)、finalクラス定数、readonlyプロパティ

    などPHP7.x以上に 堅牢にコードを書けるよう強化されています。また、JITが導入されCPUの 使用率が改善され、PHP7.xと比べて高速化が実現されました。 2004 2014 2015 2019 2020 2022 PHP8.0 PHP8.2 PHP7.0 PHP7.4 PHP5.0 PHP5.6 PHP Tools
  16. © 2012-2023 BASE, Inc. Singletonでそれぞれ比較する 30 Sigletonパターンの特徴 • Singletonは生成に関するデザインパターン の一つです。

    • クラスが一つのインスタンスのみを持つこと を保証するとともに、 このインスタンスへの アクセス・ポイントを提供します。 • Singleton パターンによって生成されたイン スタンスが他のコードによって変更されるの を防止します。 Singleton (https://refactoring.guru/ja/design-patterns/singleton)
  17. © 2012-2023 BASE, Inc. Singletonでそれぞれ比較する 31 PHP5.xで書いたパターン PHP5.xで書いたSigletonパターン • このコードでは、Singletonクラスが1つしかインス

    タンス化されないように、$instanceをprivateに設 定しています。 • __construct()もprivateに設定しているため、クラ スの外部から新しいインスタンスを生成することがで きません。 • getInstance()は、クラスの唯一のインスタンスを返 します。getInstance()は、まず$instanceが定義さ れているかどうかを確認します。もし$instanceが定 義されていなければ、new self()を使用して新しいイ ンスタンスを作成します。最後に、$instanceを返し ます。
  18. © 2012-2023 BASE, Inc. Singletonでそれぞれ比較する 32 PHP7.xで書いたパターン PHP7.xで書いたSigletonパターン • PHP

    7.xでは、?を使用してnullable型を指定できま す。$instanceはnullまたはselfのインスタンスであ るため、nullable型を使用して、$instanceプロパ ティがnullである可能性があることを明示的に示しま す。 • getInstance()は、戻り値に型を指定でき、戻り値に self型を指定しています。これは、getInstance()が Singletonクラス自体を返すことを示しています。 • doSomething()にはvoid型を指定しています。これ は、doSomething()メソッドが何も返さないことを示 しています。
  19. © 2012-2023 BASE, Inc. Singletonでそれぞれ比較する 33 PHP8.xで書いたパターン PHP8.xで書いたSigletonパターン • getInstance()の戻り値型をstaticに変更していま

    す。static型は、クラス自身またはクラスの派生クラ スのインスタンスを返すことができます ◦ この変更により、getInstance()がSingletonクラス 自身またはSingletonクラスの派生クラスのインス タンスを返すことができるようになります。 • また、getInstance()では、null合体代入演算子 (??=)を使用しています。 • $instanceがnullであれば、新しいインスタンスを作 成して代入し、$instanceに返します。 ◦ これにより、if文を使用してnullのチェックを行う 必要がなくなり、より簡潔なコードになります。
  20. © 2012-2023 BASE, Inc. Singletonでそれぞれ比較する 34 (https://php-play.dev/) • WebAssembly で作られている

    • 指定したバージョンのPHPがブラウザで動 作する。 • 同僚の @glassmonekey さんが制作しまし た。 ◦ 詳細はPHPerKaigi2023 で発表されます! (https://fortee.jp/phperkaigi-2023/proposal/de0c3936-8780-487b-a9ce-92a8b90da480)
  21. © 2012-2023 BASE, Inc. 37 まとめ PHP 3.0 5.0 5.6

    7.0 7.4 8.0 8.1 道具(プログラミング言語)はより利便性があがり、堅牢に書けるようになった。
  22. © 2012-2023 BASE, Inc. 41 The more enduring kind of

    knowledge is the “why”. Why does Angular exist? Why does it have the features that it has? What problems is it trying to solve? … In general, asking why is a recursive process, just like installing a software dependency. We have to follow all the recursive dependencies until they all resolve, otherwise we end up with broken software — or in this case, incomplete understanding. We have to continually dig deeper until we hit a layer whose value we understand. Kids know this intuitively! 最後に伝えたいこと
  23. © 2012-2023 BASE, Inc. 42 より永続的な種類の知識は「なぜ」です。 なぜAngularは存在するのですか? なぜその機能を持っているのです か? 解決しようとしている問題は何でしょうか?

    … 「なぜ」を求める事は一般的にソフトウェアの依存関係をインストール するのと同じように再帰的プロセスです。すべて解決するまでこの再帰 的な依存関係に従わなければなりません。そうでなければ壊れたソフト ウェアで終わり、不完全な理解のままで終わってしまいます。 私達は価値のあるレイヤーに当たるまで深く掘り下げて調べなければな りません。子供達はこれを直感的に知っています! 最後に伝えたいこと
  24. © 2012-2023 BASE, Inc. 44 Thanks for listening ! Enjoy

    YAPC::Kyoto 2023! Have a Nice Try and Catch!
  25. © 2012-2023 BASE, Inc. 46 参考文献 • PHPによるデザインパターン入門(秀和システム) • パターン、Wiki、XP

    ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ) • https://refactoring.guru/ja/design-patterns • https://designpatternsphp.readthedocs.io/ja/latest/README.html • https://github.com/DesignPatternsPHP/DesignPatternsPHP • https://www-public.imtbs-tsp.eu/~gibson/Teaching/Teaching-ReadingMaterial/BeckCunni ngham87.pdf • https://dl.acm.org/doi/10.1145/319016.319042 • https://www.php.net/manual/ja/history.php.php • https://www.jetbrains.com/ja-jp/lp/php-25/ • https://tech-blog.rakus.co.jp/entry/20211110/php#PHP80-%E6%96%B0%E6%A9%9F%E8 %83%BD • https://fukabori.fm/episode/48 • https://hackernoon.com/how-ages-faster-than-why-712e25c9eb3b • https://www.fendo181.me/entry/2017/02/12/153033