設計モデル
2025年3月25日
浅海智晴
クラウドアプリケーションのための
オブジェクト指向分析設計講座
第45回
ケース・スタディ
SimpleModeling2021
• オブジェクト指向分析設計での共通範囲
• UML/UP
• 本講座で使用するUMLプロファイル
• プロファイル:SimpleModeling2021 (SM2021)
• オブジェクト指向分析設計の基本からの拡張部を明確化
• アジャイル開発
• Communication
• Embrace Change
• Travel Light
• Scaling
• Component-Based Development
• クラウド・アプリケーション
• モデル駆動開発
SM2021
Travel Light
Embrace Change
Cloud
Model-Driven
Scaling
CBD
Testability
Serviceability
• 非機能要件
• Testability
• Serviceability
第1部 基本編の構成(1)
• 概論 [第1回]
• 開発プロセス [第2回]
• 基本モデル [第3回]
• 静的モデル(1) [第4回]
• 静的モデル(2) [第5回]
• 動的モデル [第6回]
• 協調モデル [第7回]
• 関数モデル [第8回]
• 物理モデル [第9回]
• 作業分野 [第10回]
• ビジネス・モデリング [第11回]
• 要求 [第12回]
• 要求/ユースケース [第13回]
• 要求/シナリオ [第14回]
• 分析 [第15回]
• 分析/コンポーネント分析 [第16回]
• 分析/イベント駆動 [第17回]
• 作業分野
• 設計 [第18回]
• 設計/アーキテクチャ設計 [第19回]
• 設計/コンポーネント設計(1) [第20回]
• 設計/コンポーネント設計(2) [第21回]
• 設計/コンポーネント設計(3) [第22回]
• 設計/ドメイン設計(1) [第23回]
• 設計/ドメイン設計(2) [第24回]
• 設計/ドメイン設計(3) [第25回]
• 設計/ドメイン設計(4) [第26回]
• 設計/ドメイン設計(5) [第27回]
• 設計/原理 [第28回]
• 設計/ UX/UI設計 [第29回]
• 実装(1) [第30回]
• 実装(2) [第31回]
• 実装(3) [第32回]
• テスト [第33回]
第1部 基本編の構成(2)
• アプリケーション・アーキテクチャ [第34回]
• Cloud Native CBD [第35回]
• ドメイン・サブシステム [第36回]
• アプリケーション・サブシステム [第37回]
• プレゼンテーション・サブシステム [第38回]
• Cloud Native Component Framework [第39回]
• ケーススタディ[第40回]
• ビジネス・モデル [第41回]
• 要求モデル [第42回]
• 要求モデル/BDD [第43回]
• 分析モデル [第44回]
• 設計モデル [第45回]
• 実装 [第46回]
• テスト [第47回]
本講座のアプローチ
• オブジェクト指向分析設計の基本を確認
• UML + UP(Unified Process)
• CBD (Component-Based Development)
• 最新技術でアップデート
• クラウド・コンピューティング
• イベント駆動、分散・並列
• ビッグデータ、AI、IoT
• コンテナ
• 関数型
• OFP(Object-Functional Programming), Reactive Streams
• ルール, AI
• DevOps
• アジャイル開発
• DX (Digital Transformation)
第25回 アプリケーション・アーキテクチャ
第2回 開発プロセス
第9回 物理モデル
第11回 ビジネス・モデリング
第2部 クラウド・アプリケーション編
第21回 設計/ドメイン設計
第20回 設計/コンポーネント設計
第2部 クラウド・アプリケーション編
原理 (Principle)
• Agile Software Development [ASD]
• SRP (The Single Responsibility Principle)
• OCP (The Open-Close Principle)
• LSP (The Liskov Substitution Principle)
• …
• GRASP (General Responsibility Assignment Software Patterns or principles)
• Low Coupling
• High Cohesion
• …
• Writing Effective Use Cases [WEUC]
• Scope
• …
パターン (Pattern)
• Design Patterns [DP]
• Observer, Strategy, …
• Domain Driven Design [DDD]
• Ubiquitous Language, Intention-
Revealing Interfaces, …
• Analysis Patterns [AP]
• Party, Quantity, …
• Pattern-Oriented Software
Architecture [POSA]
• Layers, Pipes and Filters, …
• Patterns of Enterprise
Application Architecture [PEAA]
• Unit of Work, Data Transfer Object,
…
• Enterprise Integration Patterns
[EIP]
• Message Bus, Aggregator, …
• Patterns for Effective Use
Cases [PEUC]
• CompleteSingleGoal,
VerbPhraseName, …
• AntiPatterns [AnP]
• Stovepipe System, Analysis
Paralysis, …
内容
• 設計モデル
• プラクティス
• Make Cloud Native CBD
ケーススタディ
• ブック・カフェPieris Booksの販売システム
• 新刊・古本などの書籍に加えてアクセサリーや日用品などのセ
レクト商品を販売
• もともと新刊・古本の販売も行うブックカフェでしたが、新し
くアクセサリーや日用品のセレクト商品販売を併設することに
した
• セレクト商品は見本品の展示を基本と考えており、見本品に対
してECでオーダをする方式を主に考えている
• 見本品はECサイトでの販売も行う
再掲 第40回 ケーススタディ
開発体制
• 背景
• オブジェクト指向分析設計に興味を持つ関係者がいない環境
• クラウド・アプリケーション開発、アジャイル開発、
• 自分一人でアジャイル開発によるオブジェクト指向開発を進める
• 登場人物
• A(私) : バックエンド開発
• 開発プロセスをマスターして、より大きな規模の開発につなげたい
• Uさん:フロントエンド開発
• 手練れのUIエンジニア。モデリングには興味がなくプログラミング中心で開発を行う
• Bさん:ブック・カフェPieris Booksの店長
• ビジネスでやりたいことは明確にもっているが、ビジネス・モデリング的なアプロー
チには興味がない
再掲 第40回 ケーススタディ
設計モデル
作業分野とモデルの関係 第10回 作業分野
再掲
PracticeのActivity
(マイ開発プロセス版改2)
設計の方法論
• 設計 [第18回]
• 設計/アーキテクチャ設計 [第19回]
• 設計/コンポーネント設計(1) [第20回]
• 設計/コンポーネント設計(2) [第21回]
• 設計/コンポーネント設計(3) [第22回]
• 設計/ドメイン設計(1) [第23回]
• 設計/ドメイン設計(2) [第24回]
• 設計/ドメイン設計(3) [第25回]
• 設計/ドメイン設計(4) [第26回]
• 設計/ドメイン設計(5) [第27回]
• 設計/原理 [第28回]
• 設計/ UX/UI設計 [第29回]
分析と設計
• 分析
• PIM (Platform Independent Model)
• 設計
• PSM (Platform Specific Model)
第9回 物理モデル
第16回 分析
第18回 設計
再掲
再掲
再掲
再掲 第20回 コンポーネント設計 (1)
プラクティス
プラクティス
• Identify Subsystems
• 分析モデルを作成
• Make Cloud Native CBD
• 設計モデルを作成
プラクティス
• Make Cloud Native CBD
• Cloud Native CBDに則った設計モデルを作成する
• アクティビティ
• Define the System Architecture
• Finalize the Interface Design
• Develop the internal structure of the subsystem
• Develop the Domain Model
Make Cloud Native CBD
Make Cloud Native CBD
• Cloud Native CBDに則った設計モデルを作成する
• Event-Centric (Event-Driven)
• CQRS
• Eventually Consistency
• アクティビティ
• Define the System Architecture
• Finalize the SubSystem Specification
• Develop the Internal Structure of the SubSystem
• Develop the Domain Model
プロジェクト構造
BDD/TDD
• 要求モデル
• BDDを用いて要求シナリオを実装に連結
• 分析モデル
• TDDを用いてシステム境界の振る舞いとシステムの基本構造の分析を
実装に連結
• 設計以降の作業でもTDDを用いて仕様と実装を連結していく
DevOpsとCI/CD
第9回 物理モデル
再掲
Define the System Architecture
Define the System Architecture
• システム・アーキテクチャを決定する
• 複数のサブシステムで構成されるシステム構成
• ミドルウェアの選択
• 品質属性
設計のポイント(1)
• Cloud Native CBDを採用
• クラウド・アプリケーションとして機能させる
• 初期開発は小規模なので小さく作って、今後の拡張により本格的な
Cloud Nativeにスケールアップできる構造にしておきたい
• Cloud Nativeにするための仕組みはComponent Frameworkに任せ
る
• Component Frameworkへスムーズに繋がる構造を採用
• 3 Tier Architecture
• 標準的な3ティア構造を採用
• Microservice & Serverless
• 3ティア構造の実現はMicroserviceとServerlessの併用で
• 可能な限りServerless化
設計のポイント(2)
• セキュリティ
• Component Frameworkが用意する機能を用いて実現
• Observability
• OpenTelemetryとPrometheus, Grafanaで実現
• 必要な情報はComponent Frameworkが採取してOpenTelemetryに送
る
• データ分析
• まずS3とAthenaで軽量に実現してみる
• Functional Programming
• Catsエコシステムを採用
Cloud Nativeの要件
• 要件
• Reactive
• Scalability
• Resiliency
• 制約
• Eventually Consistency
• CQRS
• メカニズム
• Event-Centric
再掲 第39回 Cloud Native Component Framework
Cloud Native CBD
• オブジェクト指向分析・設計をクラウド・アプリケーション開
発に適用するためのアプローチ
• CBD (Component-Based Development)をクラウド・アプリ
ケーション開発用に拡張
• キーワード
• Reactive
• Event-Driven
• Eventually Consistency
• Modular Monolith
• Microservice
CBD
再掲 第35回 Cloud Native CBD
Application FrameworkとComponent Framework 再掲 第37回 アプリケーション・サブシステム
コンポーネント・フレームワーク
(Component Framework)
• コンポーネントの実行基盤
• メカニズム
• DI (Dependency Injection)
• 拡張点
• 変化点
• 実行コンテキスト
• 配備
• ライブラリ管理
• モニタリング
• 機能
• ログ
• セキュリティ
• 認証、認可、監査
• 機能(続き)
• イベント駆動
• イベント
• サービス・バス
• 状態機械
• ジョブ管理
• 非同期実行
• バッチ実行
• 国際化
• RPC
• データストア入出力
• キャッシュ
• 非同期書き込み
• データ整列化
• エラー体系
Cloud
再掲 第5回 静的モデル(2)
本講座用の仮想のコンポーネント・フレー
ムワークを用いる予定
再掲 第20回 コンポーネント設計 (1)
Quality Attributes 再掲 第39回 Cloud Native Component Framework
System Architectureの例 再掲 第37回 アプリケーション・サブシステム
三層アーキテクチャ構成例 再掲 第38回 プレゼンテーション・サブシステム
方式の選択
• Presentation Tier
• Contentを主軸に動的処理をServerless
• Application Tier
• Serverlessを主軸に必要に応じてMicroservice
• Domain Tier
• Microservice
Functional Programming
• Cats
• 純粋関数型プログラミング・ライブラリ
• Cats Effect
• 純粋関数型I/Oライブラリ
• Doobie
• データベース・アクセス
• Circle
• JSON
• FS2
• Reactive Streams
• Http4s
• HTTPクライアントとして使用
• HTTPサーバーはAkka-HTTPで実現
データストア
Microservice間の通信
• gRPCを基本
• 外部に対してはRESTを公開
gPRC & REST
Observabilityとデータ分析
物理モデル
• Subsystem単位でDocker化して配備の単位とする
• System全体はDocker化したSubsystemをKubernetesで運用
• テスト時はテスト対象のサブシステムをMonolith構成でリンク
して直接テスト動作
• アーキテクチャ・スタイル
• Monolith
• Microservice
• Serverless
再掲 第39回 Cloud Native Component Framework
Finalize the SubSystem Specification
Finalized the SubSystem Specification
• サブシステム仕様を確立する
• 分析ではPIM(プラットフォーム独立)のサブシステム仕様が成
果物
• 設計でPSM(プラットフォーム固有)のサブシステム仕様にする
ための肉付けを行う
設計のポイント
• Component Frameworkに準拠した構造
• Cloud Native
• Event-Centric (Event-Driven)
• CQRS
• Eventually Consistency
• サブシステムごとにソースコードのプロジェクトを作成
• ソースコードはMulti-ModuleではなくSingle-Module
設計時の注意点
コンポーネント仕様 (Component Specification)
• インタフェース
• 提供インタフェース (Provided Interface)
• 要求インタフェース (Required Interface)
• レセプション
• イベント
• 生成
• ファクトリ
• DI (Dependency Injection)
• 拡張点
• 変化点
• メトリックス (Metrics)
• データ分析
再掲 第21回 コンポーネント設計 (2)
実行コンテキスト (Execution Context)
• コンポーネントの実行文脈を切り替えるメカニズム
• コンポーネントのユニットテストにも必要
• スコープ
• セッション・コンテキスト
• アプリケーション・コンテキスト
• システム・コンテキスト
• 機能
• 認証済みプリンシパル
• トランザクション
• UnitOfWork
• 時間
• 日時、タイムゾーン
• 国際化
• ロケール、メッセージ、通貨
再掲 第5回 静的モデル(2)
本講座用の仮想のコンポーネント・フレームワー
クが提供する実行コンテキストを用いる予定
インタフェース設計
• インタフェースの種類
• 提供インタフェース(provided interface)
• 要求インタフェース (required interface)
• 契約による設計 (Design by Contract)
• 事前条件、事後条件、不変条件を使ってオペレーションの仕様をより
精密に記述する
• ISP (The Interface Segregation Principle)
• いろいろな用途に使える巨大インタフェースではなく、目的ごとに定
義したインタフェースを複数用意する
再掲 第21回 コンポーネント設計 (2)
オペレーション設計の方針
• コンポーネントのオペレーション設計は通常のオペレーションより
も頑健さを目指す
• 仕様の明確化・暗黙の仕様を排除
• 仕様をできるだけ型に落とし込んでコンパイル時にエラー検出できるように
する
• 用途に特化したDTOやデータ型の採用
• 関数型
• 型で記述できない仕様もDbC(契約による設計)などを用いて仕様化
• 仕様の明確化
• 実行時チェック
• 部品としての再利用性を高める
• 仕様変更が起きにくい仕様
• ソース互換/バイナリ互換
再掲 第21回 コンポーネント設計 (2)
オペレーション設計 再掲 第21回 コンポーネント設計 (2)
契約による設計 (DbC: Design by Contract)
• Scala/Javaではオペレーションに対する制約で実現
• 不変条件 (invariant) : オブジェクトで常に真となる条件
• 事前条件 (pre-condition) : オペレーションの実行の前提となる条件
• 事後条件 (post-condition) : オペレーションの実行完了の前提となる条
件
• 仕様を明示する
• 実行時にエラーチェックが行われる
• 型のエラー・チェックはコンパイル時
再掲 第21回 コンポーネント設計 (2)
レセプション
• レセプションで受け付ける刺激(stimulus)
• イベント
• メッセージ
• イベント
• (サービス・バスなどを経由した)外部からの刺激
• レセプションでイベント・オブジェクトを受け取る
• レセプションの呼び出しはコンポーネント・フレームワークが行う
• メッセージ
• 本講座ではAkka Actorを使用
再掲 第21回 コンポーネント設計 (2)
イベント・モデル
• コンポーネントで定義するイベント
• ビジネス・イベント
• ドメイン・イベント
• アプリケーション・イベント
再掲 第21回 コンポーネント設計 (2)
生成
• コンポーネントの生成方法
• コンストラクタ
• ファクトリ
• ビルダー
• DI (Dependency Injection)
• コンポーネントのカスタマイズ項目を生成時のパラメタでなく
変化点や実行コンテキストとして実現することで生成処理を単
純化できる
再掲 第21回 コンポーネント設計 (2)
DI (Dependency Injection)
• 本講座ではコンストラクタに対するDIを採用する
• コンストラクタで必要な依存性情報を受取り設定する構造にす
る
• アノテーションなどでコンストラクタをDI対象に指定
再掲 第21回 コンポーネント設計 (2)
拡張点 (extension point)
• 要求インタフェースを使用して、後付で機能拡張を可能にする
• 部品化による再利用には重要な機能
• 拡張点の実現方法
• コンストラクタでパラメタとして受け取る
• DIで注入
• 外部リソース(環境変数、ファイル、DB)の情報から設定
• 拡張点にOSGiを採用することでライブラリ・バージョン衝突
問題(ライブラリ・ヘル)を解決できる
再掲 第21回 コンポーネント設計 (2)
変化点 (variation point)
• 各種デフォルト値や処理ロジックの選択などを起動時の外部パ
ラメタで与える
• 部品化による再利用には重要な機能
• 変化点の実現方法
• コンストラクタでパラメタとして受け取る
• DIで注入
• 外部リソース(環境変数、ファイル、DB)の情報から設定
再掲 第21回 コンポーネント設計 (2)
メトリクス
• コンポーネントの振る舞いに関する記録
• 例:オペレーションのコール数、キャッシュのヒット率
• テスト容易性、保守性の向上に寄与
• コンポーネント・フレームワークで採取、一元管理するのが望
ましい
再掲 第21回 コンポーネント設計 (2)
データ分析
• データ分析用の実行記録デー
タ採取
• 用途
• レポート作成
• コンポーネントから使用できる
データに加工
• AIサービスの学習データ
• 実行記録データの種類、採取
場所、採取方法を設計する
第2部 クラウド・アプリケーション編
再掲 第21回 コンポーネント設計 (2)
Develop the Internal Structure of
the SubSystem
Develop the Internal Structure of the
SubSystem
• サブシステム内部構造を開発
• サブシステムが巨大な場合は、複数のコンポーネントに分割し
て対応
設計のポイント
• 今回は小規模なのでサブシステム=1コンポーネントとする
• ソースコードの構成
• Component Frameworkの提供するDSL上にロジックを構築
• Object-Functional Programming
• 可能な限りFunctional Programming
• 状態の操作の箇所だけObject-Oriented Programming
• Free Monadを使ってFunctionalとObject-Orientedをバランスよく接
続する
Component Frameworkメカニズム (例) 再掲 第39回 Cloud Native Component Framework
ドメイン・コンポーネントの構造(例)
再掲 第23回 ドメイン設計 (1)
Develop the Domain Model
Develop the Domain Model
• ドメイン・モデルを開発する
• 設計図を描くというより、プログラミング言語を仕様記述言語
としても活用していく方向性
• 必要に応じてUML図を併用
設計のポイント
• 汎用設計
• Domain Datatype
• Value Object
• 状態機械
• Powertype
• Cloud Nativeに対応
• Aggregate
• Event
まとめ
• ケーススタディ
• ブック・カフェPieris Booksの販売システム
• プラクティス
• Make Cloud Native CBD
• アクティビティ
• Define the System Architecture
• Finalize the SubSystem Specification
• Develop the Internal Structure of the SubSystem
• Develop the Domain Model
参考文献
• The Unified Modeling Language Reference
Manual, 2nd (Rumbaugh他, 2004)
• The Unified Modeling Language User Guide,
2nd (Booch他, 2004)
• The Unified Software Development Process
(Jacobson他, 1999)
• The Object Constraint Language, 2nd (Warmer
他, 2003)
• UML 2 and the Unified Process: Practical
Object-Oriented Analysis and Design (Arlow
他, 2005)
• OMG Unified Modeling Language Version 2.5
(OMG, 2015)
• 上流工程UMLモデリング (浅海, 2008)
• The Essentials of Modern Software
Engineering: Free the Practices from the
Method Prisons! (Jacobson他, 2019)

設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】

  • 1.
  • 2.
    SimpleModeling2021 • オブジェクト指向分析設計での共通範囲 • UML/UP •本講座で使用するUMLプロファイル • プロファイル:SimpleModeling2021 (SM2021) • オブジェクト指向分析設計の基本からの拡張部を明確化 • アジャイル開発 • Communication • Embrace Change • Travel Light • Scaling • Component-Based Development • クラウド・アプリケーション • モデル駆動開発 SM2021 Travel Light Embrace Change Cloud Model-Driven Scaling CBD Testability Serviceability • 非機能要件 • Testability • Serviceability
  • 3.
    第1部 基本編の構成(1) • 概論[第1回] • 開発プロセス [第2回] • 基本モデル [第3回] • 静的モデル(1) [第4回] • 静的モデル(2) [第5回] • 動的モデル [第6回] • 協調モデル [第7回] • 関数モデル [第8回] • 物理モデル [第9回] • 作業分野 [第10回] • ビジネス・モデリング [第11回] • 要求 [第12回] • 要求/ユースケース [第13回] • 要求/シナリオ [第14回] • 分析 [第15回] • 分析/コンポーネント分析 [第16回] • 分析/イベント駆動 [第17回] • 作業分野 • 設計 [第18回] • 設計/アーキテクチャ設計 [第19回] • 設計/コンポーネント設計(1) [第20回] • 設計/コンポーネント設計(2) [第21回] • 設計/コンポーネント設計(3) [第22回] • 設計/ドメイン設計(1) [第23回] • 設計/ドメイン設計(2) [第24回] • 設計/ドメイン設計(3) [第25回] • 設計/ドメイン設計(4) [第26回] • 設計/ドメイン設計(5) [第27回] • 設計/原理 [第28回] • 設計/ UX/UI設計 [第29回] • 実装(1) [第30回] • 実装(2) [第31回] • 実装(3) [第32回] • テスト [第33回]
  • 4.
    第1部 基本編の構成(2) • アプリケーション・アーキテクチャ[第34回] • Cloud Native CBD [第35回] • ドメイン・サブシステム [第36回] • アプリケーション・サブシステム [第37回] • プレゼンテーション・サブシステム [第38回] • Cloud Native Component Framework [第39回] • ケーススタディ[第40回] • ビジネス・モデル [第41回] • 要求モデル [第42回] • 要求モデル/BDD [第43回] • 分析モデル [第44回] • 設計モデル [第45回] • 実装 [第46回] • テスト [第47回]
  • 5.
    本講座のアプローチ • オブジェクト指向分析設計の基本を確認 • UML+ UP(Unified Process) • CBD (Component-Based Development) • 最新技術でアップデート • クラウド・コンピューティング • イベント駆動、分散・並列 • ビッグデータ、AI、IoT • コンテナ • 関数型 • OFP(Object-Functional Programming), Reactive Streams • ルール, AI • DevOps • アジャイル開発 • DX (Digital Transformation) 第25回 アプリケーション・アーキテクチャ 第2回 開発プロセス 第9回 物理モデル 第11回 ビジネス・モデリング 第2部 クラウド・アプリケーション編 第21回 設計/ドメイン設計 第20回 設計/コンポーネント設計 第2部 クラウド・アプリケーション編
  • 6.
    原理 (Principle) • AgileSoftware Development [ASD] • SRP (The Single Responsibility Principle) • OCP (The Open-Close Principle) • LSP (The Liskov Substitution Principle) • … • GRASP (General Responsibility Assignment Software Patterns or principles) • Low Coupling • High Cohesion • … • Writing Effective Use Cases [WEUC] • Scope • …
  • 7.
    パターン (Pattern) • DesignPatterns [DP] • Observer, Strategy, … • Domain Driven Design [DDD] • Ubiquitous Language, Intention- Revealing Interfaces, … • Analysis Patterns [AP] • Party, Quantity, … • Pattern-Oriented Software Architecture [POSA] • Layers, Pipes and Filters, … • Patterns of Enterprise Application Architecture [PEAA] • Unit of Work, Data Transfer Object, … • Enterprise Integration Patterns [EIP] • Message Bus, Aggregator, … • Patterns for Effective Use Cases [PEUC] • CompleteSingleGoal, VerbPhraseName, … • AntiPatterns [AnP] • Stovepipe System, Analysis Paralysis, …
  • 8.
  • 9.
    ケーススタディ • ブック・カフェPieris Booksの販売システム •新刊・古本などの書籍に加えてアクセサリーや日用品などのセ レクト商品を販売 • もともと新刊・古本の販売も行うブックカフェでしたが、新し くアクセサリーや日用品のセレクト商品販売を併設することに した • セレクト商品は見本品の展示を基本と考えており、見本品に対 してECでオーダをする方式を主に考えている • 見本品はECサイトでの販売も行う 再掲 第40回 ケーススタディ
  • 10.
    開発体制 • 背景 • オブジェクト指向分析設計に興味を持つ関係者がいない環境 •クラウド・アプリケーション開発、アジャイル開発、 • 自分一人でアジャイル開発によるオブジェクト指向開発を進める • 登場人物 • A(私) : バックエンド開発 • 開発プロセスをマスターして、より大きな規模の開発につなげたい • Uさん:フロントエンド開発 • 手練れのUIエンジニア。モデリングには興味がなくプログラミング中心で開発を行う • Bさん:ブック・カフェPieris Booksの店長 • ビジネスでやりたいことは明確にもっているが、ビジネス・モデリング的なアプロー チには興味がない 再掲 第40回 ケーススタディ
  • 11.
  • 12.
  • 13.
  • 14.
    設計の方法論 • 設計 [第18回] •設計/アーキテクチャ設計 [第19回] • 設計/コンポーネント設計(1) [第20回] • 設計/コンポーネント設計(2) [第21回] • 設計/コンポーネント設計(3) [第22回] • 設計/ドメイン設計(1) [第23回] • 設計/ドメイン設計(2) [第24回] • 設計/ドメイン設計(3) [第25回] • 設計/ドメイン設計(4) [第26回] • 設計/ドメイン設計(5) [第27回] • 設計/原理 [第28回] • 設計/ UX/UI設計 [第29回]
  • 15.
    分析と設計 • 分析 • PIM(Platform Independent Model) • 設計 • PSM (Platform Specific Model)
  • 16.
    第9回 物理モデル 第16回 分析 第18回設計 再掲 再掲 再掲 再掲 第20回 コンポーネント設計 (1)
  • 17.
  • 18.
    プラクティス • Identify Subsystems •分析モデルを作成 • Make Cloud Native CBD • 設計モデルを作成
  • 19.
    プラクティス • Make CloudNative CBD • Cloud Native CBDに則った設計モデルを作成する • アクティビティ • Define the System Architecture • Finalize the Interface Design • Develop the internal structure of the subsystem • Develop the Domain Model
  • 20.
  • 21.
    Make Cloud NativeCBD • Cloud Native CBDに則った設計モデルを作成する • Event-Centric (Event-Driven) • CQRS • Eventually Consistency • アクティビティ • Define the System Architecture • Finalize the SubSystem Specification • Develop the Internal Structure of the SubSystem • Develop the Domain Model
  • 22.
  • 23.
    BDD/TDD • 要求モデル • BDDを用いて要求シナリオを実装に連結 •分析モデル • TDDを用いてシステム境界の振る舞いとシステムの基本構造の分析を 実装に連結 • 設計以降の作業でもTDDを用いて仕様と実装を連結していく
  • 24.
  • 25.
    Define the SystemArchitecture
  • 26.
    Define the SystemArchitecture • システム・アーキテクチャを決定する • 複数のサブシステムで構成されるシステム構成 • ミドルウェアの選択 • 品質属性
  • 27.
    設計のポイント(1) • Cloud NativeCBDを採用 • クラウド・アプリケーションとして機能させる • 初期開発は小規模なので小さく作って、今後の拡張により本格的な Cloud Nativeにスケールアップできる構造にしておきたい • Cloud Nativeにするための仕組みはComponent Frameworkに任せ る • Component Frameworkへスムーズに繋がる構造を採用 • 3 Tier Architecture • 標準的な3ティア構造を採用 • Microservice & Serverless • 3ティア構造の実現はMicroserviceとServerlessの併用で • 可能な限りServerless化
  • 28.
    設計のポイント(2) • セキュリティ • ComponentFrameworkが用意する機能を用いて実現 • Observability • OpenTelemetryとPrometheus, Grafanaで実現 • 必要な情報はComponent Frameworkが採取してOpenTelemetryに送 る • データ分析 • まずS3とAthenaで軽量に実現してみる • Functional Programming • Catsエコシステムを採用
  • 29.
    Cloud Nativeの要件 • 要件 •Reactive • Scalability • Resiliency • 制約 • Eventually Consistency • CQRS • メカニズム • Event-Centric 再掲 第39回 Cloud Native Component Framework
  • 30.
    Cloud Native CBD •オブジェクト指向分析・設計をクラウド・アプリケーション開 発に適用するためのアプローチ • CBD (Component-Based Development)をクラウド・アプリ ケーション開発用に拡張 • キーワード • Reactive • Event-Driven • Eventually Consistency • Modular Monolith • Microservice CBD 再掲 第35回 Cloud Native CBD
  • 31.
    Application FrameworkとComponent Framework再掲 第37回 アプリケーション・サブシステム
  • 32.
    コンポーネント・フレームワーク (Component Framework) • コンポーネントの実行基盤 •メカニズム • DI (Dependency Injection) • 拡張点 • 変化点 • 実行コンテキスト • 配備 • ライブラリ管理 • モニタリング • 機能 • ログ • セキュリティ • 認証、認可、監査 • 機能(続き) • イベント駆動 • イベント • サービス・バス • 状態機械 • ジョブ管理 • 非同期実行 • バッチ実行 • 国際化 • RPC • データストア入出力 • キャッシュ • 非同期書き込み • データ整列化 • エラー体系 Cloud 再掲 第5回 静的モデル(2) 本講座用の仮想のコンポーネント・フレー ムワークを用いる予定 再掲 第20回 コンポーネント設計 (1)
  • 33.
    Quality Attributes 再掲第39回 Cloud Native Component Framework
  • 34.
    System Architectureの例 再掲第37回 アプリケーション・サブシステム
  • 35.
    三層アーキテクチャ構成例 再掲 第38回プレゼンテーション・サブシステム
  • 36.
    方式の選択 • Presentation Tier •Contentを主軸に動的処理をServerless • Application Tier • Serverlessを主軸に必要に応じてMicroservice • Domain Tier • Microservice
  • 37.
    Functional Programming • Cats •純粋関数型プログラミング・ライブラリ • Cats Effect • 純粋関数型I/Oライブラリ • Doobie • データベース・アクセス • Circle • JSON • FS2 • Reactive Streams • Http4s • HTTPクライアントとして使用 • HTTPサーバーはAkka-HTTPで実現
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
    物理モデル • Subsystem単位でDocker化して配備の単位とする • System全体はDocker化したSubsystemをKubernetesで運用 •テスト時はテスト対象のサブシステムをMonolith構成でリンク して直接テスト動作 • アーキテクチャ・スタイル • Monolith • Microservice • Serverless 再掲 第39回 Cloud Native Component Framework
  • 43.
  • 44.
    Finalized the SubSystemSpecification • サブシステム仕様を確立する • 分析ではPIM(プラットフォーム独立)のサブシステム仕様が成 果物 • 設計でPSM(プラットフォーム固有)のサブシステム仕様にする ための肉付けを行う
  • 45.
    設計のポイント • Component Frameworkに準拠した構造 •Cloud Native • Event-Centric (Event-Driven) • CQRS • Eventually Consistency • サブシステムごとにソースコードのプロジェクトを作成 • ソースコードはMulti-ModuleではなくSingle-Module
  • 46.
  • 47.
    コンポーネント仕様 (Component Specification) •インタフェース • 提供インタフェース (Provided Interface) • 要求インタフェース (Required Interface) • レセプション • イベント • 生成 • ファクトリ • DI (Dependency Injection) • 拡張点 • 変化点 • メトリックス (Metrics) • データ分析 再掲 第21回 コンポーネント設計 (2)
  • 48.
    実行コンテキスト (Execution Context) •コンポーネントの実行文脈を切り替えるメカニズム • コンポーネントのユニットテストにも必要 • スコープ • セッション・コンテキスト • アプリケーション・コンテキスト • システム・コンテキスト • 機能 • 認証済みプリンシパル • トランザクション • UnitOfWork • 時間 • 日時、タイムゾーン • 国際化 • ロケール、メッセージ、通貨 再掲 第5回 静的モデル(2) 本講座用の仮想のコンポーネント・フレームワー クが提供する実行コンテキストを用いる予定
  • 49.
    インタフェース設計 • インタフェースの種類 • 提供インタフェース(providedinterface) • 要求インタフェース (required interface) • 契約による設計 (Design by Contract) • 事前条件、事後条件、不変条件を使ってオペレーションの仕様をより 精密に記述する • ISP (The Interface Segregation Principle) • いろいろな用途に使える巨大インタフェースではなく、目的ごとに定 義したインタフェースを複数用意する 再掲 第21回 コンポーネント設計 (2)
  • 50.
    オペレーション設計の方針 • コンポーネントのオペレーション設計は通常のオペレーションより も頑健さを目指す • 仕様の明確化・暗黙の仕様を排除 •仕様をできるだけ型に落とし込んでコンパイル時にエラー検出できるように する • 用途に特化したDTOやデータ型の採用 • 関数型 • 型で記述できない仕様もDbC(契約による設計)などを用いて仕様化 • 仕様の明確化 • 実行時チェック • 部品としての再利用性を高める • 仕様変更が起きにくい仕様 • ソース互換/バイナリ互換 再掲 第21回 コンポーネント設計 (2)
  • 51.
    オペレーション設計 再掲 第21回コンポーネント設計 (2)
  • 52.
    契約による設計 (DbC: Designby Contract) • Scala/Javaではオペレーションに対する制約で実現 • 不変条件 (invariant) : オブジェクトで常に真となる条件 • 事前条件 (pre-condition) : オペレーションの実行の前提となる条件 • 事後条件 (post-condition) : オペレーションの実行完了の前提となる条 件 • 仕様を明示する • 実行時にエラーチェックが行われる • 型のエラー・チェックはコンパイル時 再掲 第21回 コンポーネント設計 (2)
  • 53.
    レセプション • レセプションで受け付ける刺激(stimulus) • イベント •メッセージ • イベント • (サービス・バスなどを経由した)外部からの刺激 • レセプションでイベント・オブジェクトを受け取る • レセプションの呼び出しはコンポーネント・フレームワークが行う • メッセージ • 本講座ではAkka Actorを使用 再掲 第21回 コンポーネント設計 (2)
  • 54.
    イベント・モデル • コンポーネントで定義するイベント • ビジネス・イベント •ドメイン・イベント • アプリケーション・イベント 再掲 第21回 コンポーネント設計 (2)
  • 55.
    生成 • コンポーネントの生成方法 • コンストラクタ •ファクトリ • ビルダー • DI (Dependency Injection) • コンポーネントのカスタマイズ項目を生成時のパラメタでなく 変化点や実行コンテキストとして実現することで生成処理を単 純化できる 再掲 第21回 コンポーネント設計 (2)
  • 56.
    DI (Dependency Injection) •本講座ではコンストラクタに対するDIを採用する • コンストラクタで必要な依存性情報を受取り設定する構造にす る • アノテーションなどでコンストラクタをDI対象に指定 再掲 第21回 コンポーネント設計 (2)
  • 57.
    拡張点 (extension point) •要求インタフェースを使用して、後付で機能拡張を可能にする • 部品化による再利用には重要な機能 • 拡張点の実現方法 • コンストラクタでパラメタとして受け取る • DIで注入 • 外部リソース(環境変数、ファイル、DB)の情報から設定 • 拡張点にOSGiを採用することでライブラリ・バージョン衝突 問題(ライブラリ・ヘル)を解決できる 再掲 第21回 コンポーネント設計 (2)
  • 58.
    変化点 (variation point) •各種デフォルト値や処理ロジックの選択などを起動時の外部パ ラメタで与える • 部品化による再利用には重要な機能 • 変化点の実現方法 • コンストラクタでパラメタとして受け取る • DIで注入 • 外部リソース(環境変数、ファイル、DB)の情報から設定 再掲 第21回 コンポーネント設計 (2)
  • 59.
    メトリクス • コンポーネントの振る舞いに関する記録 • 例:オペレーションのコール数、キャッシュのヒット率 •テスト容易性、保守性の向上に寄与 • コンポーネント・フレームワークで採取、一元管理するのが望 ましい 再掲 第21回 コンポーネント設計 (2)
  • 60.
    データ分析 • データ分析用の実行記録デー タ採取 • 用途 •レポート作成 • コンポーネントから使用できる データに加工 • AIサービスの学習データ • 実行記録データの種類、採取 場所、採取方法を設計する 第2部 クラウド・アプリケーション編 再掲 第21回 コンポーネント設計 (2)
  • 61.
    Develop the InternalStructure of the SubSystem
  • 62.
    Develop the InternalStructure of the SubSystem • サブシステム内部構造を開発 • サブシステムが巨大な場合は、複数のコンポーネントに分割し て対応
  • 63.
    設計のポイント • 今回は小規模なのでサブシステム=1コンポーネントとする • ソースコードの構成 •Component Frameworkの提供するDSL上にロジックを構築 • Object-Functional Programming • 可能な限りFunctional Programming • 状態の操作の箇所だけObject-Oriented Programming • Free Monadを使ってFunctionalとObject-Orientedをバランスよく接 続する
  • 64.
    Component Frameworkメカニズム (例)再掲 第39回 Cloud Native Component Framework
  • 65.
  • 66.
  • 67.
    Develop the DomainModel • ドメイン・モデルを開発する • 設計図を描くというより、プログラミング言語を仕様記述言語 としても活用していく方向性 • 必要に応じてUML図を併用
  • 68.
    設計のポイント • 汎用設計 • DomainDatatype • Value Object • 状態機械 • Powertype • Cloud Nativeに対応 • Aggregate • Event
  • 70.
    まとめ • ケーススタディ • ブック・カフェPierisBooksの販売システム • プラクティス • Make Cloud Native CBD • アクティビティ • Define the System Architecture • Finalize the SubSystem Specification • Develop the Internal Structure of the SubSystem • Develop the Domain Model
  • 71.
    参考文献 • The UnifiedModeling Language Reference Manual, 2nd (Rumbaugh他, 2004) • The Unified Modeling Language User Guide, 2nd (Booch他, 2004) • The Unified Software Development Process (Jacobson他, 1999) • The Object Constraint Language, 2nd (Warmer 他, 2003) • UML 2 and the Unified Process: Practical Object-Oriented Analysis and Design (Arlow 他, 2005) • OMG Unified Modeling Language Version 2.5 (OMG, 2015) • 上流工程UMLモデリング (浅海, 2008) • The Essentials of Modern Software Engineering: Free the Practices from the Method Prisons! (Jacobson他, 2019)