Upgrade to Pro — share decks privately, control downloads, hide ads and more …

設計原則、アーキテクチャパターン、アーキテクチャスタイルの違いって何?いつどう向き合ったらいい...

katzumi
February 22, 2025

 設計原則、アーキテクチャパターン、アーキテクチャスタイルの違いって何?いつどう向き合ったらいいの?を考えてみる

PHPカンファレンス名古屋2025
https://phpcon.nagoya/2025/

katzumi

February 22, 2025
Tweet

More Decks by katzumi

Other Decks in Technology

Transcript

  1. 今日お話すること・話さないこと 🚫セッションでは扱わない こと 個々の設計パターンの詳細な解説 具体的な実装方法やコード例の紹介 特定のアーキテクチャの採用判断基準 ✨セッションで得られるこ と 設計に関する概念を体系的に理解する視点 各設計概念の位置づけと相互の関係性

    設計概念の発展背景と解決してきた課題の理解 狙いは「設計概念を体系的に理解し、個々のパターンを把握するための助けとする」です 個別の設計パターンやアーキテクチャの詳 細は、巻末の参考資料参照📚
  2. 見慣れた風景 " このプロジェクトは Clean Architecture で…" " ここは ServiceLayer パターンを使って…"

    "SOLID の原則に従って設計しましょう" " マイクロサービスアーキテクチャに移行して…" ドキュメントやブログで目にする アーキテクチャやパターンの数々 設計に関する用語が飛び交う日々…
  3. 「TECHNICAL MASTER はじめてのPHP エンジニア入 門編」のおすすめ章 Chapter09: 設計原則とパターン 本セッションとも関連が高くて気に入るはずです この章では、ソフトウェア開発における設計原則の重要性とアーキテクチャパターンの具体的な適用方法について詳しく解説 します。

    まず、アーキテクチャの定義とその必要性を説明し、SOLID 原則を通じて設計の基本概念を理解します。その後、さまざまな アーキテクチャパターン(MVC 、 レイヤードアーキテクチャ、クリーンアーキテクチャ、ヘキサゴナルアーキテクチャ)を紹 介します。 また、設計パターンとアンチパターンをとりあげ、実際の開発における適用例や回避すべき設計の落とし穴についても解説し ます。 “
  4. 設計に関する用語の3 つのカテゴリ 〇〇の原則・法則 SOLID, KISS, YAGNI, DRY, コマンドクエリ分離原則(CQS) , デメテルの法則(最小知識の原則),

    驚き最小の原 則 → 設計の原則 〇〇パターン MVC, ActiveRecord, Value Object, Server Session State, Domain Model, CQRS → アーキテクチャパターン 〇〇アーキテクチャ Layered, Clean, Hexagonal, Event Driven, Pipeline, Service Oriented → アーキテクチャスタイル 1. UNIX 哲学 "Basics of the Unix Philosophy" の基本原則の一つ ↩︎ 数多の用語がどういうカテゴリになるのか? [1]
  5. デザインパターンとの違い 項目 デザインパターン(GoF ) アーキテクチャパターン 設計レベル クラス/ オブジェクトの設計レベル システム構造レベル パターン数

    23 個のパターンで完結 POSA 、PoEAA 、EIP で体系化 適用範囲 言語非依存の解決策 エンタープライズアプリケーション特有 1. Pattern-Oriented Software Architecture ↩︎ 2. Patterns of Enterprise Application Architecture ↩︎ 3. Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions ↩︎ パターンにも色々ある [1] [2] [3]
  6. 設計に関する3 つの概念カテゴリ比較 項目 適用範囲 抽象度 決定の影響 設計原則 メソッド/ クラスレベルがメイン 具象的(直接的な指針)

    局所的な影響 アーキテクチャパターン モジュール/ コンポーネントレベル 中間(再利用可能な解決策) 中規模な影響 アーキテクチャスタイル システム/ アプリケーションレベル 抽象的(全体的な方針) 全体的な影響 抽象度が低→高、影響度も小→大となる
  7. 設計原則の役割 主な目的 1. コードの保守性向上 2. 再利用性の促進 3. 拡張性の確保 4. バグの減少

    5. 開発効率の向上 ソフトウェア開発の品質向上と効率化を目指す 解決しようとした課題 1. コードの複雑性 大規模なソフトウェアシステムの複雑さを管理し、 理解しやすく保守しやすいコードを作成する。 2. 変更への対応 ビジネス要件の変更や技術の進歩に柔軟に対応でき るシステムを設計する。 3. 品質の向上 バグの少ない、信頼性の高いソフトウェアを開発す るための指針が求められた。 4. 開発効率の改善 開発時間の短縮と、チーム間のコミュニケーション 改善が必要。
  8. 設計原則の役割 主な目的 1. コードの保守性向上 2. 再利用性の促進 3. 拡張性の確保 4. バグの減少

    5. 開発効率の向上 ソフトウェア開発の品質向上と効率化を目指す 解決しようとした課題 1. コードの複雑性 大規模なソフトウェアシステムの複雑さを管理し、 理解しやすく保守しやすいコードを作成する。 2. 変更への対応 ビジネス要件の変更や技術の進歩に柔軟に対応でき るシステムを設計する。 3. 品質の向上 バグの少ない、信頼性の高いソフトウェアを開発す るための指針が求められた。 4. 開発効率の改善 開発時間の短縮と、チーム間のコミュニケーション 改善が必要。 変更に強く理解しやすいコードにする 変更容易性と理解容易性を高くする
  9. 設計原則による課題解決マトリクス 課題 単一責任原則 (SRP ) オープン/ クローズド 原則(OCP ) リスコフの置換原則

    (LSP ) インターフェース 分離原則(ISP ) 依存性逆転原則 (DIP ) コード の複雑 性 クラスの目的 を明確化 継承やポリモーフィ ズムを活用 一貫した振る舞いの 提供 必要な機能だけを 提供 抽象化と依存関 係の最小化 変更へ の対応 変更理由の一 つに限定 新機能追加時に既存 コードを変更しない クライアントコード の変更を最小限に インターフェース の分離 依存関係の逆転 による柔軟性 品質向 上 高凝集を実現 変更影響範囲の最小 化 クライアントコード との結合を維持 高凝集のインター フェース モジュール間の 独立性向上 SOLID 原則での課題解決事例
  10. アーキテクチャパターンの役割 複雑化するエンタープライズアプリケーションの設計と統合における共通課題に対処するための体系化 解決しようとした課題 1. 複雑性の管理 大規模エンタープライズアプリケーションの複雑さ を管理し、理解しやすく保守しやすいシステムを設 計する必要。 2. 再利用性の向上

    共通のパターンを識別し、再利用可能なソリューシ ョンを提供することで、開発効率を向上させる必 要。 3. システム統合の複雑さ 異なるシステム間の統合が複雑化し、標準化された アプローチが必要。 主な目的 PoEAA (Patterns of Enterprise Application Architecture ) 1. エンタープライズアプリケーションの設計に関す る知識の体系化 2. 複雑なビジネスロジックとデータ処理の効率的な 実装方法の提供 3. スケーラブルで保守性の高いアプリケーション構 築のための指針提供 EIP (Enterprise Integration Patterns ) 1. 分散システム間の統合パターンの標準化 2. メッセージングシステムを使用した効果的な統合 方法の提供
  11. アーキテクチャパターンの役割 複雑化するエンタープライズアプリケーションの設計と統合における共通課題に対処するための体系化 解決しようとした課題 1. 複雑性の管理 大規模エンタープライズアプリケーションの複雑さ を管理し、理解しやすく保守しやすいシステムを設 計する必要。 2. 再利用性の向上

    共通のパターンを識別し、再利用可能なソリューシ ョンを提供することで、開発効率を向上させる必 要。 3. システム統合の複雑さ 異なるシステム間の統合が複雑化し、標準化された アプローチが必要。 主な目的 PoEAA (Patterns of Enterprise Application Architecture ) 1. エンタープライズアプリケーションの設計に関す る知識の体系化 2. 複雑なビジネスロジックとデータ処理の効率的な 実装方法の提供 3. スケーラブルで保守性の高いアプリケーション構 築のための指針提供 EIP (Enterprise Integration Patterns ) 1. 分散システム間の統合パターンの標準化 2. メッセージングシステムを使用した効果的な統合 方法の提供
  12. アーキテクチャスタイルの役割 ソフトウェアシステムの複雑化と多様化が大きく影響して発展 解決しようとした課題 1. システム全体の複雑性管理 大規模システムの全体構造を簡素化し、理解しやす くする必要。 2. スケーラビリティとパフォーマンスの最適化 システム全体のスケーラビリティを向上させ、大規

    模なデータ処理や高負荷に対応する必要。 3. 分散システムの課題への対応 ネットワーク遅延、部分的な障害、データの一貫性 など、分散システム特有の問題に対処する必要。 4. 異種システム間の統合 異なる技術や標準を使用するシステム間の効果的な 統合方法が求められた。 主な目的 1. システムの全体的な構造を定義 2. コンポーネント間の関係を明確にする 3. アーキテクチャ特性をカバーする 4. 経験豊富なアーキテクト間の共通言語として機能す る 5. システムの品質属性(パフォーマンス、スケーラビ リティ、セキュリティなど)を達成する 6. コンポーネントや機能の再利用性を向上させる 7. システム内のコンポーネントや外部システムとの統 合を容易にする 8. 将来的な変更や拡張に対する柔軟性を確保する
  13. アーキテクチャスタイルの役割 ソフトウェアシステムの複雑化と多様化が大きく影響して発展 解決しようとした課題 1. システム全体の複雑性管理 大規模システムの全体構造を簡素化し、理解しやす くする必要。 2. スケーラビリティとパフォーマンスの最適化 システム全体のスケーラビリティを向上させ、大規

    模なデータ処理や高負荷に対応する必要。 3. 分散システムの課題への対応 ネットワーク遅延、部分的な障害、データの一貫性 など、分散システム特有の問題に対処する必要。 4. 異種システム間の統合 異なる技術や標準を使用するシステム間の効果的な 統合方法が求められた。 主な目的 1. システムの全体的な構造を定義 2. コンポーネント間の関係を明確にする 3. アーキテクチャ特性をカバーする 4. 経験豊富なアーキテクト間の共通言語として機能す る 5. システムの品質属性(パフォーマンス、スケーラビ リティ、セキュリティなど)を達成する 6. コンポーネントや機能の再利用性を向上させる 7. システム内のコンポーネントや外部システムとの統 合を容易にする 8. 将来的な変更や拡張に対する柔軟性を確保する
  14. 相互補完の効果 役割・効果 設計原則 アーキテクチャパターン アーキテクチャスタイル 品質の確保 - コードの品質基準 - 変更容易性の確保

    - モジュール構造の一貫性 - 再利用性の向上 - システム全体の整合性 - 長期的な保守性 実装の指針 - 具体的な実装の判断基準 - コードレベルの品質確保 - コンポーネントの実装方針 - インターフェースの定義 - システム構造の大枠決定 - 主要コンポーネントの特定 変更への対応 - 局所的な変更の容易さ - テスタビリティの確保 - モジュール単位の変更管理 - 依存関係の制御 - 大規模な変更の制御 - 進化の方向性の提供 各概念は独立ではなく、相互に補完
  15. 相互補完の効果 役割・効果 設計原則 アーキテクチャパターン アーキテクチャスタイル 品質の確保 - コードの品質基準 - 変更容易性の確保

    - モジュール構造の一貫性 - 再利用性の向上 - システム全体の整合性 - 長期的な保守性 実装の指針 - 具体的な実装の判断基準 - コードレベルの品質確保 - コンポーネントの実装方針 - インターフェースの定義 - システム構造の大枠決定 - 主要コンポーネントの特定 変更への対応 - 局所的な変更の容易さ - テスタビリティの確保 - モジュール単位の変更管理 - 依存関係の制御 - 大規模な変更の制御 - 進化の方向性の提供 各概念は独立ではなく、相互に補完 協調して機能することで、より堅牢で適応性の高いソフトウェア設計が可能
  16. 1980-1990 年代: パッケージソフトウェアの台頭 【設計原則の確立】 1988: CRC (Class-Responsibility-Collaboration ) 1995: SOLID

    原則(Robert C. Martin ) 1999: DRY, YAGNI 等の原則 【デザインパターンの体系化】 1987: Kent Beck & Ward Cunningham がパターン言語を提唱 1994: GoF 本「Design Patterns 」出版 オブジェクト指向設計の知見を集約 原則の体系化とパターンの出現
  17. 2000 年代:SaaS/Web サービスの時代 【アーキテクチャパターンの整理】 1996 〜2009: Pattern-Oriented Software Architecture (POSA

    )シリーズ 広範なシステムアーキテクチャパターン を扱う 2002: Patterns of Enterprise Application Architecture (PoEAA) エンタープライズアプリケーションの知見集約 2004: Enterprise Integration Patterns(EIP) システム統合のパターン化 1. 基本的なアーキテクチャパターンから始まり、分散コンピューティングからリソース管理、パターン言語ま で幅広いトピックをカバーしています ↩︎ 2. アーキテクチャパターンのカタログとしてまとめられています ↩︎ エンタープライズパターンの体系化 [1] [2]
  18. 1960-1970 年代:ハードウェア依存時代 【ソフトウェアの形態】 メインフレーム専用のソフトウェア 顧客固有のカスタムシステム ハードウェアの付属品的な位置づけ 【開発スタイル】 ウォーターフォール型 少人数での開発 ハードウェア仕様に強く依存

    専用ハードウェアでのみ動作する組み込み型システムを、少人数でウォーターフォール型の開発で作り上げる 時代 利用形態が限定的。ワンオフで作りきり、修正ができない
  19. 1980 年代:パッケージソフトウェアの台頭 【ソフトウェアの形態】 パッケージソフトウェア クライアント/ サーバーシステム 汎用的な業務アプリケーション 【開発スタイル】 複数バージョンの管理 チーム開発の一般化

    品質管理プロセスの確立 各 PC にインストールして利用するパッケージを、バージョン管理とリリース計画に基づくチーム開発で進め る時代 利用形態が多様化。ソフトウェアも大規模化する。開発スタイルも複雑化。
  20. 1990 年代:エンタープライズ化 【ソフトウェアの形態】 エンタープライズパッケージ Web ベースの ERP/CRM カスタマイズ可能なプラットフォーム 【開発スタイル】 コンポーネントベース開発

    反復型開発の導入 グローバル開発チーム 大規模な業務システムをコンポーネント単位で開発・カスタマイズし、組織全体に展開する反復型開発の時代
  21. 1990 年代:エンタープライズ化 【ソフトウェアの形態】 エンタープライズパッケージ Web ベースの ERP/CRM カスタマイズ可能なプラットフォーム 【開発スタイル】 コンポーネントベース開発

    反復型開発の導入 グローバル開発チーム 大規模な業務システムをコンポーネント単位で開発・カスタマイズし、組織全体に展開する反復型開発の時代 パッケージソフトウェア時代からSaaS 時代への重要な過渡期 カスタイマイズも入り、システムに求められる要件も高度化
  22. 2000 年代:SaaS/Web サービスの時代 【ソフトウェアの形態】 SaaS モデル Web アプリケーション サブスクリプションベース 【開発スタイル】

    アジャイル開発 継続的デリバリー フィーチャー単位の開発 ブラウザを通じて継続的に進化するサービスを、アジャイル開発による迅速な機能改善で実現する時代
  23. 2000 年代:SaaS/Web サービスの時代 【ソフトウェアの形態】 SaaS モデル Web アプリケーション サブスクリプションベース 【開発スタイル】

    アジャイル開発 継続的デリバリー フィーチャー単位の開発 ブラウザを通じて継続的に進化するサービスを、アジャイル開発による迅速な機能改善で実現する時代 Ruby on Rails の普及 新興のWeb アプリケーションフレームワークがたくさん生まれた
  24. 2010 年代以降:クラウドネイティブ時代 【ソフトウェアの形態】 クラウドネイティブアプリケーション マイクロサービス API エコノミー 【開発スタイル】 DevOps コンテナベース開発

    インフラのコード化 クラウド上のサービス群を組み合わせて利用するシステムを、DevOps による自動化と分散開発で構築する時 代
  25. 2010 年代以降:クラウドネイティブ時代 【ソフトウェアの形態】 クラウドネイティブアプリケーション マイクロサービス API エコノミー 【開発スタイル】 DevOps コンテナベース開発

    インフラのコード化 クラウド上のサービス群を組み合わせて利用するシステムを、DevOps による自動化と分散開発で構築する時 代 インフラのコード化 モバイルアプリ化や、Single Page Application も台頭してきた
  26. 変化の本質 変化の方向性 パッケージソフトウェア時代 SaaS/Web サービス時代 クラウドネイティブ時代 提供形態 パッケージ販売 サブスクリプション 従量課金/

    サービス連携 開発スタイル ウォーターフォール 反復型/ アジャイル 継続的デリバリー チーム構造 少人数チーム 大規模チーム 分散自律チーム アーキテクチャ モノリシック コンポーネントベース マイクロサービス 変化のまとめ
  27. ソフトウェア開発の進化 1960-1970 ハードウェア依存時代 💻 専⽤システム メインフレーム専⽤ カスタムシステム ハードウェア依存 1980 パッケージソフトウェア

    📦💻🖥 汎⽤的なアプリケーション パッケージソフトウェア クライアント/ サーバーシステム 複数バージョン管理 2000 SaaS/Web サービス 🌐🔗💡 分散・接続型サービス Web アプリケーション サブスクリプションモデル 継続的デリバリー 2010 以降 クラウドネイティブ 🌈☁🔬🚀🌍 グローバル・柔軟なシステム マイクロサービス コンテナ・サーバーレス DevOps ・継続的統合
  28. ソフトウェア開発の進化 1960-1970 ハードウェア依存時代 💻 専⽤システム メインフレーム専⽤ カスタムシステム ハードウェア依存 1980 パッケージソフトウェア

    📦💻🖥 汎⽤的なアプリケーション パッケージソフトウェア クライアント/ サーバーシステム 複数バージョン管理 2000 SaaS/Web サービス 🌐🔗💡 分散・接続型サービス Web アプリケーション サブスクリプションモデル 継続的デリバリー 2010 以降 クラウドネイティブ 🌈☁🔬🚀🌍 グローバル・柔軟なシステム マイクロサービス コンテナ・サーバーレス DevOps ・継続的統合 ソフトウェアはよりリッチで大規模化する 考慮する要素も増え、複雑さが増し、開発の難易度も高まり続けている
  29. 変化の方向性 1. ビジネスモデルの変化 一時販売 → 継続的な収益 カスタマイズ → セルフサービス クローズド

    → オープン連携 2. 開発プロセスの変化 長期計画 → 短期サイクル 品質保証 → 継続的改善 固定要件 → 柔軟な適応 3. 技術的な変化 密結合 → 疎結合 単一障害点 → 分散システム 手動運用 → 自動化 これらの変化に対応するため、設計概念も領域が拡大する
  30. アーキテクチャスタイルはいつ考えるべきか? 【タイミング】 チーム規模の拡大時 チーム間の責務分離が必要に 独立したデプロイの必要性 ビジネス要件の変化時 スケーラビリティ要件の変化 新規ドメインの追加(新規プロジェクト立ち上げ時 も) リファクタリングの契機

    技術的負債の蓄積。保守性の課題 【アプローチ方法】 小規模な時は設計原則に集中 必要なタイミングで戦略的に判断 ビジネスの成長に合わせた漸進的な改善 組織/ ビジネスの転換点で検討する
  31. アーキテクチャスタイルはいつ考えるべきか? 【タイミング】 チーム規模の拡大時 チーム間の責務分離が必要に 独立したデプロイの必要性 ビジネス要件の変化時 スケーラビリティ要件の変化 新規ドメインの追加(新規プロジェクト立ち上げ時 も) リファクタリングの契機

    技術的負債の蓄積。保守性の課題 【アプローチ方法】 小規模な時は設計原則に集中 必要なタイミングで戦略的に判断 ビジネスの成長に合わせた漸進的な改善 組織/ ビジネスの転換点で検討する オーバーエンジニアリングを避け、必要な タイミングで適切な投資判断 チームの成長を考慮した判断を行う
  32. 参考資料 & 書籍 【書籍】 「TECHNICAL MASTER はじめてのPHP エンジニア入門編」 Pattern-Oriented Software

    Architecture Patterns of Enterprise Application Architecture Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions 【資料】 Patterns of Enterprise Application Architecture - Martin Fowler’s Bliki (ja) Table of Contents - Enterprise Integration Patterns 紹介した書籍や、学習に使えるページ