長期運用と依存戦略

全部入りにしない理由。依存の主導権はアプリ側に残します。

標準機能の範囲

Naifyは、HTTPの入口、ルーティング、RequestContext、Controllerディスパッチという骨格に責務を絞り、認証、バリデーション、キャッシュ、ジョブ、テンプレート、DB層などはアプリごとに選べるようにしています。

ここで重視しているのは、フレームワークが選んだ依存をアプリ全体の前提にしないことです。最初から全部を抱え込まなければ、あとから差し替える余地も残しやすいです。

必要な機能は、案件に応じてライブラリや追加パッケージを組み合わせます。
この判断がどんな長期運用システムの課題から出てきたかは 長期運用システムの課題 にまとめています。

依存はアプリごとに選ぶ

Naify自体はComposerを必須にしていませんが、アプリ側でComposerを使うこともできます。重要なのは、依存の選定権をフレームワークではなくアプリ側が持つことです。

関心ごとNaifyの立場アプリ側の選択
テンプレート標準搭載しないTwigやSmartyなどを選ぶ
DB層NaifyDbを使えるが必須ではないPDO直書きや別実装も選べる
認証固有の仕組みを抱え込まない案件に合う方式を決める
ログ本体で固定しないMonolog等を必要に応じて採用する
バリデーション本体で強制しないルールと実装をアプリで決める
Composerを避けたいのではなく、フレームワーク本体の寿命を特定の依存と結びつけすぎないことを優先しています。

規約を共有し、実装でも確認する

どのフレームワークでも、採用するだけで設計規約が守られるわけではありません。チームで決めた処理の配置や呼び出し順が守られないと、変更の影響を把握しにくくなり、不具合や保守負担につながります。

たとえば、共通の認証処理を通さない経路ができたり、複数の画面に同じ業務処理が分散したりすると、確認漏れや修正漏れが起こりやすいです。

Naifyでも、このリスクは同じです。共通処理をBaseControllerなどにまとめ、役割分担をコード上で確認しやすくします。規約の共有に加え、レビューとテストで実装を確認することを重視しています。

規約を確認しやすい構成にする

規約が複数の文書や実装に分散すると、途中から参加した人が判断に迷いやすいです。共通の処理と例外の扱いを明確にし、変更時に確認する場所を絞ります。

観点確認すること
処理の配置認証・出力・業務処理の担当が明確か
依存関係変更の影響を受ける箇所が分かるか
例外の扱い共通処理を通らない経路と、その理由を確認できるか

採用する構成をチームで決める

Naifyでは、認証やログなどの実装を案件に応じて選びます。実装前に担当する層と利用方法を共有し、選んだ理由を残しておきます。

  • 認証を行う場所を決める
  • 例外時のレスポンスを揃える
  • DBやテンプレートのライブラリを選ぶ
  • 共通処理と個別処理の境界を決める