MVC(Model-View-Controller)
入力(Controller)・業務ロジック(Model)・表示(View)を分離し、変更に強くする。
ソフトウェアアーキテクチャ(システムアーキテクチャ)は「システム全体の構造とルールを決める設計の土台」です。
AIで爆速実装したはいいけど、気づいたらスパゲッティコードが山盛り…なんて経験ありませんか?このように、AIで実装速度が上がる時代、「AIが書いた大量のコードを、誰が、どうやって統制するのか?」という課題が出てきます。 たとえば、同じ機能が増殖したり、依存関係が絡まって直すたびに別の場所が壊れたり、AIに指示を出すための『説明』に時間がかかりすぎたり…。
このページでは、用語の説明だけで終わらせず、AI時代に効く、
といった3つの判断軸を、AI時代に必要な視点で解説します。一緒にAI時代のソフトウェアアーキテクチャを身につけましょう!
良いアーキテクチャは、システムを「変更に強く」「保守しやすく」します。
アーキテクチャは全体の方針を決めるもの、設計はその方針を各画面・各機能・各クラスに落とし込むものです。
言い換えると、アーキテクチャが「地図」、設計が「道順」です。地図が曖昧だと、どれだけ丁寧に道順を書いても迷いやすくなります。
代表パターンは「どれが正解か」ではなく、対象のシステムと運用条件に合わせて選びます。
入力(Controller)・業務ロジック(Model)・表示(View)を分離し、変更に強くする。
層ごとに責務を分け、依存方向を揃えることで保守しやすくする。
ドメインごとに小さなサービスへ分割し、独立リリースを可能にする。
向いている場面: 画面遷移中心のWebアプリ、UIと業務ロジックを切り離したいとき。
落とし穴: Controller肥大化で、実質的に責務分離が崩れやすくなります。
向いている場面: 小〜中規模で、責務分離を明快にしたいとき。
落とし穴: 依存方向が崩れると、層の意味が消えて保守性が急落します。
向いている場面: ドメイン境界が明確で、チームごとに独立開発・独立デプロイしたいとき。
落とし穴: 通信、監視、データ整合性の運用負荷が高く、分割しすぎると逆効果です。
補足として、境界をさらに厳密に扱いたい場合はクリーンアーキテクチャやヘキサゴナル(Port and Adapter)も有効です。
MVC は、入力の制御(Controller)、データと業務ルール(Model)、 表示(View)を分ける構成です。UI変更と業務ロジック変更の影響を分離しやすくします。
基本の流れは、ユーザー操作 → Controller →(Model更新 / View選択)です。
レイヤードアーキテクチャは、ソフトウェアを層(レイヤー)に分けて、 「上の層が下の層を呼び出す」形で組み立てる構成です。責務ごとに層を分けることで、変更の影響を閉じ込めます。
マイクロサービスアーキテクチャは、システム全体を小さなサービスの集合として構成します。 各サービスは独立してデプロイでき、自分専用のデータとビジネスルールを持ちます。
AIで実装速度が上がるほど、「コードをどう分割し、どこまで渡せば正確に直せるか?」が差になります。 巨大な1ファイルは文脈が崩れやすく、層や境界が分かれた構造は渡す範囲が明確で精度が上がりやすい──という “あるある” を対比で整理します。
→ 「AI時代の3つの視点(コンテキスト整理・交換可能性・データとプロンプトフロー)」を見る
ポイントは「AIが忘れないこと」ではなく、AIに渡すべき文脈を“短く・正確に”切り出せる構造を作ることです。
AIに渡す文脈を「短く・正確に」切り出せる構造こそが、AI時代のアーキテクチャの勝ち筋となります。
層や境界(コンテキスト)を決めておくと、AIをチームメンバーとして使ったときの修正精度が上がりやすくなります!
ここからが「AI時代の勝ち筋」パートです。AIを使う開発では、実装速度よりも「どの秩序(順番)で積み上げるか」が成果を分けます。
なぜなら、秩序があるほどAIの修正精度が上がるからです。
※さっきの対比図の「差」は、この3つで説明できます。ここから順にいきましょう🍊
AIは、開いているファイルや周辺コードを参照して提案します。だからこそ境界とルールが明確なほど、提案精度が上がります。
たとえば「ドメイン層にDB操作を書かない」「依存は上位層から下位層へ」のような禁止ルールが明文化されていると、AIも配置ミスを起こしにくくなります。 逆にルールがバラバラだと、AIはどこに何を書くべきか判断できず、カオスを量産します。
Good: UI -> Application -> Domain <- Infrastructure(implements) Bad : UI <-> Domain <-> Infrastructure (mutual references)
AIモデルの進化は速く、昨日の最適解が今日には古くなります。呼び出しをインターフェースで抽象化し、実装をAdapterとして切り分けると安全に差し替えられます。
App(Service) -> AiClient(Port) <- OpenAiClient / ClaudeClient(Adapter)
interface AiClient {
public function summarize(string $text): string;
}
final class OpenAiClient implements AiClient { /* ... */ }
final class ClaudeClient implements AiClient { /* ... */ }
final class AiService {
public function __construct(private AiClient $client) {}
}
これからの中核は If-Then だけではなく、RAGのような「検索 → 解釈 → 実行」の連鎖です。 どこで真実のデータを扱い、どこでAIの推論を扱うかを分離して設計します。
UI -> API -> Retriever -> Context -> LLM -> Tool(DB/External) -> Response
^ |
Indexer -> VectorDB
最後に一言でまとめると、ルールが明確なアーキテクチャほどAIの精度が上がる、これがいま再評価される最大の理由です。
経験:Webアプリ/業務システム
得意:PHP・JavaScript・MySQL・CSS
個人実績:フォーム生成基盤/クイズ学習プラットフォーム 等
詳しいプロフィールはこちら! もちもちみかんのプロフィール