Slide 1

Slide 1 text

"config" ってなんだ? 2024-04-13 PHP カンファレンス小田原 2024

Slide 2

Slide 2 text

所属:株式会社ウィルゲート 登壇: 寄稿: おかしょい/岡田 正平 X: @okashoi GitHub: @okashoi

Slide 3

Slide 3 text

本トークは登壇者の調査、考察にもとづく私見です ※参考となる情報源等があれば教えていただけると幸いです🙏 おことわり

Slide 4

Slide 4 text

config(configuration)

Slide 5

Slide 5 text

※他の FW や他の言語でも適用できるお話です config ファイル:Laravel の例

Slide 6

Slide 6 text

「定数を何でも突っ込む場所」 になってないだろうか?

Slide 7

Slide 7 text

例:特定の概念の表示にまつわる定数や文言 3, /** * 社内権限名 */ 'office_authority_name' => 'ウィルゲート' ];

Slide 8

Slide 8 text

例:マスタデータの ID と名前の対応 [ 'saving' => [ 'id' => 1, 'name' => '普通', ], 'checking' => [ 'id' => 2, 'name' => '当座', ], ], 'other' => [ 'name' => 'その他', ], ];

Slide 9

Slide 9 text

configuration ≠ constant

Slide 10

Slide 10 text

フレームワークの公式ドキュメントを見ても...... • config の書き方についての説明はある • 一方で「config とは何か(= 何を書くべきか)」 についてはほとんど説明されていない(私調べ) これについて考えてみる config とはいったい何なのか

Slide 11

Slide 11 text

英単語 configuration の語義 https://eow.alc.co.jp/search?q=configuration&ref=wl

Slide 12

Slide 12 text

英単語 configuration の語義 https://eow.alc.co.jp/search?q=configuration&ref=wl

Slide 13

Slide 13 text

英単語 configuration の語義 https://dictionary.cambridge.org/ja/dictionary/english/configuration

Slide 14

Slide 14 text

英単語 configuration の語義 https://dictionary.cambridge.org/ja/dictionary/english/configuration

Slide 15

Slide 15 text

英単語 configuration の語義 https://dictionary.cambridge.org/ja/dictionary/english/configuration

Slide 16

Slide 16 text

• システムの構成に関わる情報をハードコードしないための仕組み • ミドルウェアの種類とか接続情報とか • アプリケーションとその外界との境界、つながりを記述する • 環境変数と組み合わせるなどして、環境ごとにカスタマイズできる • テスト環境/ステージング環境/本番環境 • 開発者ごとの開発環境 config(configuration)ファイルの役割

Slide 17

Slide 17 text

• システムの構成に関わる情報をハードコードしないための仕組み • ミドルウェアの種類とか接続情報とか • アプリケーションとその外界との境界、つながりを記述する • 環境変数と組み合わせるなどして、環境ごとにカスタマイズできる • テスト環境/ステージング環境/本番環境 • 開発者ごとの開発環境 config(configuration)ファイルの役割

Slide 18

Slide 18 text

アプリケーション (コード)

Slide 19

Slide 19 text

RDB アプリケーション (コード) SMTP サーバー 暗号鍵 メッセージキュー KVS タイムゾーン

Slide 20

Slide 20 text

RDB アプリケーション (コード) SMTP サーバー 暗号鍵 メッセージキュー KVS タイムゾーン 動作環境に依らず不変なもの

Slide 21

Slide 21 text

RDB アプリケーション (コード) KVS SMTP サーバー タイムゾーン 暗号鍵 メッセージキュー 動作環境毎に異なるもの(外界)

Slide 22

Slide 22 text

RDB アプリケーション (コード) SMTP サーバー 暗号鍵 メッセージキュー KVS タイムゾーン config によって外界の情報を与えることで 特定の環境でのシステム全体を動作させられる

Slide 23

Slide 23 text

じゃあ (冒頭のコードのような) 定数はどこに定義すべきか?

Slide 24

Slide 24 text

• マジックナンバーを避けて値の意図を明らかにする • 一箇所の変更で済むようにする(DRY 原則) →「名前づけ」と「共通化」(関数定義などと同じ) 定数(constant)を使う動機とは

Slide 25

Slide 25 text

ロジックと同じで「凝集性」がポイント ↓ 関連するクラス、モジュール等に定数として定義しよう じゃあ定数はどこに定義すべきか?

Slide 26

Slide 26 text

じゃあ定数はどこに定義すべきか? 3, /** * 社内権限名 */ 'office_authority_name' => 'ウィルゲート' ]; before

Slide 27

Slide 27 text

じゃあ定数はどこに定義すべきか? 表示に関する責務であれば Controller あたり あるいは View とか ViewModel みたいなものがあればそこに

Slide 28

Slide 28 text

じゃあ定数はどこに定義すべきか? [ 'saving' => [ 'id' => 1, 'name' => '普通', ], 'checking' => [ 'id' => 2, 'name' => '当座', ], ], 'other' => [ 'name' => 'その他', ], ]; before

Slide 29

Slide 29 text

じゃあ定数はどこに定義すべきか? 1, 'name' => '普通', ]; private const ACCOUNT_TYPE_CHECKING = [ 'id' => 2, 'name' => '当座', ]; // 略 } Bank モデルが定義されているならそのクラス定数に → Bank に関する知識をちゃんとモデルに閉じ込めてあげる after - 1

Slide 30

Slide 30 text

じゃあ定数はどこに定義すべきか? Enum のようなものを使うという手も (PHP の場合は 8.1〜) '普通', BankAccountType::Checking => '当座', }; } } after - 2

Slide 31

Slide 31 text

• configuration ≠ constants • 「構成」と「共通化」を区別しよう • もし定数にあてはまるものを書くときは 凝集度を意識して、クラス定数や Enum を活用しよう まとめ