Slide 1

Slide 1 text

© 2012-2023 BASE, Inc. 2023/03/18 YAPC::Kyoto 2023 Reject Con PHP8によるデザインパターン入門

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

© 2012-2023 BASE, Inc. 1 2 「デザインパターン」を学ぶ事で言語に 問わず、良い設計を身につけられること がわかる 9 今日の発表のゴール 2 3 「デザインパターン」に興味が出てくる PHPというプログラミング言語が日々改善して 堅牢な言語になっている事がわかる

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

© 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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

© 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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

© 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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

© 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

Slide 26

Slide 26 text

© 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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

© 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