Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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.
    2023/03/18 YAPC::Kyoto 2023 Reject Con
    PHP8によるデザインパターン入門

    View full-size slide

  2. © 2012-2023 BASE, Inc. 2
    氏名:Futoshi Endo
    所属:BASE株式会社
    入社:2023/01 ~
    業務:バックエンド エンジニア
    趣味:料理、音楽鑑賞、ゲーム
    PHP歴は6年、昔からブログを書いたり、
    Scrapboxで日記を書いています。
    好きなデザインパターンは Facade
    ● Endo Tech Blog
    ● https://scrapbox.io/fendo181/
    Fendo181
    自己紹介

    View full-size slide

  3. © 2012-2023 BASE, Inc. 3
    自己紹介
    (BASEに入社してから初リリースするまでに経験した事を紹介します) 書籍「みんなのPHP 現場で役立つ最新ノウハウ!」
    (Laravelにおける「ファサードの役割と仕組みを理解する」章を執筆)

    View full-size slide

  4. © 2012-2023 BASE, Inc. 4
    自己紹介
    (YAPC::Kyoto 2023 前日祭の「YAPC::Kyoto 2023 Reject Con」で登壇します)

    View full-size slide

  5. © 2012-2023 BASE, Inc. 5
    このタイトルにした背景には「PHPによるデザインパターン入門」
    という、2006年に刊行された名書があります。本で書かれている
    PHPのバージョンは5.x系で、このとき型宣言も列挙型もまだ導入さ
    れていませんでした。 その後PHP7から「型宣言」が導入され、
    PHPは昔と比べて堅牢にコードが書けるプログラミング言語になり
    ました。
    読み進めながら写経していると「はたして最新のPHP8で書き直し
    たらどんな違いがあるのか? もしくはデザインパターンで解決した
    い本質は変わらないのか?」という素朴な疑問が出てきて、掘り下
    げてわかりやすく説明したいと思い上記のタイトルになりました。
    自己紹介

    View full-size slide

  6. © 2012-2023 BASE, Inc.
    今日の発表のゴール
    6

    View full-size slide

  7. © 2012-2023 BASE, Inc.
    今日の発表のゴール
    7
    PHP8によるデザインパターン入門

    View full-size slide

  8. © 2012-2023 BASE, Inc. 8
    「Design Patterns: Elements of Reusable Object-Oriented Software」
    (邦題:「オブジェクト思考における再利用の為のデザインパターン」)出てくる「デザインパターン」を指します。
    通称「GoF(Gang of Four)本」とも呼ばれています。
    今日の発表のゴール

    View full-size slide

  9. © 2012-2023 BASE, Inc.


    「デザインパターン」を学ぶ事で言語に
    問わず、良い設計を身につけられること
    がわかる
    9
    今日の発表のゴール

    3
    「デザインパターン」に興味が出てくる
    PHPというプログラミング言語が日々改善して
    堅牢な言語になっている事がわかる

    View full-size slide

  10. © 2012-2023 BASE, Inc.
    アジェンダ
    10

    View full-size slide

  11. © 2012-2023 BASE, Inc.
    アジェンダ
    11
    https://github.com/k1LoW/tbls
    ● デザインパターンの歴史
    ● PHP5、PHP7、PHP8 の違い
    ● Singletonでそれぞれ比較する
    ● まとめ
    ● 最後に伝えたい事
    ● (参考文献の紹介)

    View full-size slide

  12. © 2012-2023 BASE, Inc. 12
    デザインパターンの歴史

    View full-size slide

  13. © 2012-2023 BASE, Inc.
    デザインパターンの歴史
    13
    1984
    1984年、建築家であるChristopher Alexander氏により
    「A Pattern Language: Towns, Buildings, Construnction」(邦題:「パタン・ランゲー
    ジ―環境設計の手引き」/[鹿島出版会]という論文が発表される。

    View full-size slide

  14. © 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

    View full-size slide

  15. © 2012-2023 BASE, Inc.
    デザインパターンの歴史
    15
    つまりデザインパターンは元々は建築の環境設計における
    「パターン・ランゲージ」の考えをソフトウェアに流用した所から来て
    いる。
    1987
    1984

    View full-size slide

  16. © 2012-2023 BASE, Inc.
    デザインパターンの歴史
    16
    1990年、Bruce Anderson氏が「Toward an Architecture HandBook」を
    作る為に、有志の集会「OOPSLA/ECCOP」を開催します。ここで再利用可
    能なオブジェクト指向のソフトウェアについて議論が交わされる。
    1987
    1984 1990

    View full-size slide

  17. © 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

    View full-size slide

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

    View full-size slide

  19. © 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

    View full-size slide

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

    View full-size slide

  21. © 2012-2023 BASE, Inc.
    デザインパターンの歴史
    21
    おすすめです!!

    View full-size slide

  22. © 2012-2023 BASE, Inc. 22
    PHP5、PHP7、PHP8 の違い

    View full-size slide

  23. © 2012-2023 BASE, Inc.
    PHP5、PHP7、PHP8 の違い
    23
    1994
    PHP Tools
    1994年、Rasmus Lerdorf (ラスマス・ラードフ)はオンラインで公開している経歴
    書のアクセス履歴を調べるために使っていたスクリプト群を「Personal Home Page
    Tools」と命名。一般的には「PHP Tools」と呼ばれていました。
    1995年、 PHP Tools のソースコードを公開 し開発者がバグ修正や機能改善をするよ
    うになりました。

    View full-size slide

  24. © 2012-2023 BASE, Inc.
    PHP5、PHP7、PHP8 の違い
    24
    1994
    PHP5.xからオブジェクト指向機能の強化が行われてクラス、継承、抽象ク
    ラス、インターフェース、例外処理などが導入されました。
    PHP5.0
    2004 2014
    PHP5.6
    PHP Tools

    View full-size slide

  25. © 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

    View full-size slide

  26. © 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

    View full-size slide

  27. © 2012-2023 BASE, Inc.
    PHP5、PHP7、PHP8 の違い
    27
    紹介できない程、沢山の改善があります!

    View full-size slide

  28. © 2012-2023 BASE, Inc.
    PHP5、PHP7、PHP8 の違い
    28
    https://www.jetbrains.com/ja-jp/lp/php-25/

    View full-size slide

  29. © 2012-2023 BASE, Inc. 29
    Singletonでそれぞれ比較する

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. © 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()メソッドが何も返さないことを示
    しています。

    View full-size slide

  33. © 2012-2023 BASE, Inc.
    Singletonでそれぞれ比較する
    33
    PHP8.xで書いたパターン
    PHP8.xで書いたSigletonパターン
    ● getInstance()の戻り値型をstaticに変更していま
    す。static型は、クラス自身またはクラスの派生クラ
    スのインスタンスを返すことができます
    ○ この変更により、getInstance()がSingletonクラス
    自身またはSingletonクラスの派生クラスのインス
    タンスを返すことができるようになります。
    ● また、getInstance()では、null合体代入演算子
    (??=)を使用しています。
    ● $instanceがnullであれば、新しいインスタンスを作
    成して代入し、$instanceに返します。
    ○ これにより、if文を使用してnullのチェックを行う
    必要がなくなり、より簡潔なコードになります。

    View full-size slide

  34. © 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)

    View full-size slide

  35. © 2012-2023 BASE, Inc.
    まとめ
    35

    View full-size slide

  36. © 2012-2023 BASE, Inc. 36
    まとめ
    デザインパターンの本質は変わらない

    View full-size slide

  37. © 2012-2023 BASE, Inc. 37
    まとめ
    PHP 3.0 5.0 5.6 7.0 7.4 8.0 8.1
    道具(プログラミング言語)はより利便性があがり、堅牢に書けるようになった。

    View full-size slide

  38. © 2012-2023 BASE, Inc. 38
    まとめ
    我々建築者(エンジニア)は常に時代に合わせて、繰り返しでてくるパターンや道具を考慮
    して、その時にあった最適な構造を作る力が求められる。
    1年後 4年後 10年後

    View full-size slide

  39. © 2012-2023 BASE, Inc.
    最後に伝えたいこと
    39

    View full-size slide

  40. © 2012-2023 BASE, Inc. 40
    最後に伝えたいこと
    なぜ、デザインパターンを学ぶのか?
    ただ、デザインパターンを覚えればいいのか?

    View full-size slide

  41. © 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!
    最後に伝えたいこと

    View full-size slide

  42. © 2012-2023 BASE, Inc. 42
    より永続的な種類の知識は「なぜ」です。
    なぜAngularは存在するのですか? なぜその機能を持っているのです
    か? 解決しようとしている問題は何でしょうか?

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

    View full-size slide

  43. © 2012-2023 BASE, Inc. 43
    最後に伝えたいこと
    “How”は時代と共に廃れるので
    ”Why”を追い求めましょう

    View full-size slide

  44. © 2012-2023 BASE, Inc. 44
    Thanks for listening !
    Enjoy YAPC::Kyoto 2023!
    Have a Nice Try and Catch!

    View full-size slide

  45. © 2012-2023 BASE, Inc.
    参考文献
    45

    View full-size slide

  46. © 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

    View full-size slide