Slide 1

Slide 1 text

Monologの実装に学ぶ Interfaceの使いどころ PHPカンファレンス福岡2023

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

自己紹介 名前:おぎ PHPer歴:3年 住んでるところ:秘境グンマー 所属:Innovator Japan.inc 特技:スノーボード

Slide 4

Slide 4 text

Innovator Japan Inc. 「人の可能性を最大限に引き出し、ウェルビーイングな社会を実現する 」 日本発のビジネスデザインカンパニー

Slide 5

Slide 5 text

本日、カンファレンス初登壇🎉

Slide 6

Slide 6 text

アウトライン 1. Interfaceとは 2. MonologのInterface a. Monologとは b. 代表的なInterface c. HandlerInterface 3. まとめ

Slide 7

Slide 7 text

Interfaceとは

Slide 8

Slide 8 text

自分のインターフェースのイメージ(約1年前) - 実装が書けない?これ何のためにあるの? - ライブラリとか作る人じゃないと使わないんじゃないの? - 実装を差し替えるなんてそうそうなくない?

Slide 9

Slide 9 text

インタフェース、インタフェイス、インターフェイスとも書き、英語で界面や接触 面、中間面などといった意味を持ち、転じてコンピュータと周辺機器の接続部分 を表すようになった。さらに、ユーザーインターフェースなどのように、人間と自 動機械との間の複雑な操作をする手順・規則との意味にも使われる。 出典: フリー百科事典『ウィキペディア( Wikipedia)』より抜粋 インターフェース

Slide 10

Slide 10 text

JavaやC#などのオブジェクト指向プログラミング言語においてサポートされる、 実装を持たない抽象型のことである。これらの言語において、クラスは実装の 多重継承をサポートしない代わりに、任意の数のインタフェースを実装 (implement) することができ、これにより型の多重継承をサポートする。 出典: フリー百科事典『ウィキペディア( Wikipedia)』より抜粋 インタフェース (抽象型)

Slide 11

Slide 11 text

なる...ほど...?🤔

Slide 12

Slide 12 text

キーワードっぽいもの - 抽象型...? - 依存性逆転...? - 振る舞い...?

Slide 13

Slide 13 text

Interfaceってよくわからない…🫠

Slide 14

Slide 14 text

MonologのInterface

Slide 15

Slide 15 text

Monologとは ● PHP製のロガーライブラリ ● Laravel、Symfonyでもデフォルトのロ ガーとして採用されている ● ファイル、ソケット、メール、DBへのロ ギングをサポート ● デフォルトではサポートされていない ログ転送も自前で実装することで拡 張可能 Monolog - Logging for PHP

Slide 16

Slide 16 text

代表的なInterface Processor - ロギングの前処理(ホスト名の追加、UIDの付与等) Formatter - ログデータの加工処理(特定のフォーマットへの加工) Handler - ログの書き出し(ログの出力・記録)

Slide 17

Slide 17 text

LoggerInterfaceのDIの設定 Handlerと呼ばれるログの出力を 処理するクラスを登録

Slide 18

Slide 18 text

pushHandler()の実装 Interface!

Slide 19

Slide 19 text

HandlerInterface

Slide 20

Slide 20 text

Monolog/Loggerのメソッド内部

Slide 21

Slide 21 text

addRecord()内部(抜粋) 登録された各ハンドラーの handleメソッド の呼び出し

Slide 22

Slide 22 text

つまり 1. HandlerInterface実装した具象クラスを作成 2. ↑をpushHandlerでLoggerに登録 3. いい感じに整形したデータ(LogRecord)を渡してくれる! ライブラリ側のコードを一切変えずに ログの出力先(≒ふるまい)を拡張可能

Slide 23

Slide 23 text

まとめ

Slide 24

Slide 24 text

Interfaceは「使う側」と「使われる側」を疎結合にする - MonologはHandlerが渡したLogRecordをどう処理するか知らない - HandlerはLogRecordがどんな処理をされて届くか知らない - 知らないからこそお互いに影響を受けにくい (≒拡張の自由度が高い) Monolog Handler Handler Interface handle() 呼んだことで 何が起こるかは知らない implements 約束を守ることで 整形済のデータ(LogRecord) を受け取れる

Slide 25

Slide 25 text

Interfaceのつかいどころ ≒後に実装の追加・変更が予想される箇所 例: - 通知(メール、Push) - アプリが利用する決済サービス(変更、追加等) - データストア(CSV、RDB、KV)

Slide 26

Slide 26 text

Interfaceを賢く使って 変更や拡張に強いプログラムを書こう!

Slide 27

Slide 27 text

参考: - ちょうぜつソフトウェア設計入門 - 良いコード/悪いコードで学ぶ設計入門 - interfaceの本質と使いどころ - Monolog - Logging for PHP - PSR-3: Logger Interface

Slide 28

Slide 28 text

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