"config" ってなんだ? / What is "config"?
by
Shohei Okada
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 を活用しよう まとめ