📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

設計アプローチ②(MDA・SOA・ROA・OOAD)/デザインパターン

概要

  • 日程: Day 3 / セッション 3
  • 時間: [10:10-10:50](座学30分+ミニ演習10分)
  • 形式: 座学/ミニ演習
  • ゴール: MDA/SOA/ROA/OOADをそれぞれ一言で説明し、デザインパターン(GoF、ジェネレーションギャップパターン)の目的を説明できる
  • 学習形式: 対話型解説/AIディスカッション

導入(5分)

🗣️ 要約

  • 設計アプローチには、前回のPOA・DOAに加えて、MDA・SOA・ROA・OOADの4つがある
  • どのアプローチも「開発テーマの何を主役にするか」という同じ問いに対する異なる答え
  • このセッションで6つの設計アプローチの主役をそれぞれ説明できるようになる

前回は、POA(プロセス中心アプローチ)とDOA(データ中心アプローチ)を比べました。「処理の流れ」を主役にするか、「データの構造」を主役にするか、という視点の違いでしたね。

実は、設計アプローチはこの2つだけではありません。今日はさらに4つ、MDA・SOA・ROA・OOADを見ていきます。

ここで少し考えてみてください。もし開発テーマが「オークションシステム」だったら、「出品」「入札」「落札」という一連の処理を主役に考えますか? それとも「商品」「ユーザー」「取引」というモノを主役に考えますか?

実はこの4つのアプローチは、それぞれ「何を主役にするか」が違うだけで、根っこの問いは同じです。このセッションが終わる頃には、6つの設計アプローチを並べて、それぞれの「主役」が何かを説明できるようになっています。

本編(30分)

🗣️ 要約

  • MDA・SOA・ROA・OOADは、それぞれモデル・サービス・リソース・オブジェクトを主役にする設計アプローチ
  • デザインパターン(GoF・ジェネレーションギャップパターン)は、よくある課題への実装レベルの定石
  • 6つの設計アプローチは排他的ではなく、組み合わせて使ってよい

1. 設計アプローチ②(MDA・SOA・ROA・OOAD)

🗣️ 要約

  • MDAはモデル、SOAはサービス、ROAはリソース、OOADはオブジェクトをそれぞれ主役にする
  • ROAの代表例はRESTful APIで、リソース1つ1つにURLを割り当てる
  • 設計アプローチは開発テーマの切り取り方の違いであり、組み合わせて使える

まず全体像です。設計アプローチは、開発テーマという同じ題材を、どの単位で切り取るかの違いだと考えてください。

flowchart TD Theme["開発テーマ"] --> POA["POA(処理の流れが主役)"] Theme --> DOA["DOA(データの構造が主役)"] Theme --> MDA["MDA(モデルが主役)"] Theme --> SOA["SOA(サービスの単位が主役)"] Theme --> ROA["ROA(リソースの単位が主役)"] Theme --> OOAD["OOAD(オブジェクトが主役)"]

前回のPOA・DOAは「処理」か「データ」かという対立でした。今日の4つは、もう少し実装寄りの視点です。

  • MDA(モデル駆動型アーキテクチャ):モデルを主役にし、モデルから実装コードを自動的・半自動的に生成していく考え方です。Day2で作った「情報モデル」を土台にシステムを組み立てるイメージに近いです
  • SOA(サービス指向アーキテクチャ):「サービス」という機能のかたまりを単位にする考え方です。たとえば「決済サービス」「通知サービス」のように、システムをサービスの集合として捉えます
  • ROA(リソース指向アーキテクチャ):「リソース(資源)」を単位にする考え方です。RESTful APIはこの代表例で、「ユーザー」「商品」といったリソース1つ1つにURLを割り当てます
  • OOAD(オブジェクト指向分析設計):「オブジェクト」を単位にする考え方です。UML(統一モデリング言語)を使い、モノとその振る舞いをクラスとして表現します

たとえるなら、同じ「オーケストラの演奏」を、指揮者の動き(処理の流れ=POA)で見るか、楽譜のデータ構造(DOA)で見るか、演奏全体のモデル(MDA)で見るか、パート単位のサービス(SOA)で見るか、楽器というリソース(ROA)で見るか、演奏者というオブジェクト(OOAD)で見るか、という違いのようなものです。同じ演奏会でも、切り取り方によって見えるものが変わります。

では、なぜアプローチが6つも必要なのでしょうか。少し考えてみてください。もし設計アプローチが1つしかなかったら、どんな開発テーマにも同じ切り取り方を強制することになります。オークションシステムのように「取引の流れ」が大事なテーマにはPOAやSOAが向いているかもしれませんし、家計簿システムのように「データの正確な蓄積」が大事なテーマにはDOAやROAが向いているかもしれません。目的に応じて選べることが重要なのです(到達目標No.6「設計思想・アーキテクチャを理解し選択できる」)。

コード例・実例

ROAの考え方はイメージしやすいので、URLの例で見てみましょう。

  • GET /users/123(ユーザーというリソースを1件取得する)は該当しますが、GET /getUserInfo?id=123(処理の名前をURLに埋め込む)は該当しません。なぜなら、後者は「処理」を主役にしたPOA的な発想であり、「リソース」を主役にするROAの流儀に沿っていないからです

ここがポイント

特に注意してほしいのは、これらのアプローチは「どれか1つだけを選ばなければいけない」ものではないという点です。実際の開発では、DOAでデータベースを設計しつつ、ROAでAPIを設計する、というように組み合わせることが普通です。よくある間違いとして「MDAとOOADは対立するものだ」と考えてしまうケースがありますが、正しくは、OOADで分析・設計したモデルを、MDAの考え方でさらに自動生成に活用する、という補完関係になり得ます。

コラム

ROA(リソース指向アーキテクチャ)という考え方は、Webの生みの親の一人であるRoy Fieldingが2000年に書いた博士論文の中でRESTというスタイルを提唱したことがきっかけで広まりました。彼は「なぜWebはこんなに大規模でも壊れずにスケールするのか」を突き詰めて考え、その答えを「URLというリソースに対する統一的な操作」に見出したのです。たった1本の博士論文が、その後20年以上にわたって世界中のAPI設計の standard(標準)になった、というのはなかなか痛快な話だと思いませんか。

2. デザインパターン(GoF・ジェネレーションギャップパターン)

🗣️ 要約

  • デザインパターンは「よくある設計課題への実装レベルの定石」
  • GoFパターンは23種類あり、生成・構造・振る舞いの3種類に分類される
  • ジェネレーションギャップパターンは自動生成コードと手動コードを分離するパターン

設計アプローチが「何を主役にするか」という大きな方針だとすると、デザインパターンは「よくある課題に対する、実装レベルの定石」です。

  • GoF(Gang of Fourパターン):1994年に4人のソフトウェア技術者が「よくある設計課題とその解決策」を23種類にまとめたものです。「生成」「構造」「振る舞い」という3種類に分類されています
  • ジェネレーションギャップパターン:自動生成されるコードと、人間が手を加えるコードを、クラスを分けることで混ざらないようにするパターンです

ここまでで、設計アプローチとデザインパターンの違いについてイメージできましたか。設計アプローチが「都市計画(街全体をどう区画するか)」だとすると、デザインパターンは「よく使う部屋の間取りのテンプレート(このタイプの部屋にはこの配置が定石、という知恵)」のようなものです。

なぜデザインパターンが必要なのでしょうか。少し考えてみてください。もしパターンという共有知識がなければ、開発者は同じ課題に何度もゼロから頭を悩ませることになります。デザインパターンは、いわば「車輪の再発明を防ぐための共有ボキャブラリー」です。

💬 AIに聞いてみよう

🗣️ 要約

  • SOAとROAの違いの具体例、自分たちの開発テーマに向く設計アプローチ、GoFパターンの実務での使い方をAIに質問できる

ここまでの内容で疑問があれば、AIに質問してみましょう。たとえば:

  • 「SOAとROAの違いをもっと具体的な例で説明して」
  • 「自分たちの開発テーマ(〇〇)にはどの設計アプローチが向いていると思う?」
  • 「GoFのデザインパターンを1つ、実務でどう使うか教えて」

実習・演習(10分)

🗣️ 要約

  • 開発テーマで主役にしたい設計アプローチを1つ選び、理由を話し合う演習
  • 成果物は選んだ設計アプローチとその理由のメモ

課題

🗣️ 要約

  • 2人組で、開発テーマにどの設計アプローチ(POA・DOA・MDA・SOA・ROA・OOAD)を主役にしたいかを1つ選び、理由を1分ずつ話す

隣の人(またはチーム)と2人組になり、「自分たちの開発テーマなら、6つの設計アプローチ(POA・DOA・MDA・SOA・ROA・OOAD)のうちどれを『主役』にしたいか」を1つ選び、理由を1分ずつ話してください。

成果物

🗣️ 要約

  • 選んだ設計アプローチとその理由の一言メモ(次のセッション4の考察演習で使う)

選んだ設計アプローチと、その理由を一言メモ(次のセッション4の考察演習にそのまま使えます)

ヒント

🗣️ 要約

  • 「自分たちのテーマで一番大事にしたいもの」から逆算すると選びやすい
  • 言葉にできない場合はAIに向いている設計アプローチと理由を聞き、自分の意見と比べる

迷ったら、「自分たちのテーマで一番大事にしたいもの」(処理の速さか、データの正確さか、機能の独立性か)から逆算すると選びやすくなります。うまく言葉にできない場合は、AIに「(開発テーマ)にはどの設計アプローチが向いていると思う?理由も教えて」と聞いて、自分の意見と比べてみましょう。

まとめ(5分)

🗣️ 要約

  • 設計アプローチは開発テーマの切り取り方の違いであり、組み合わせて使ってよい
  • 次回は「アーキテクチャ」「設計」「駆動」「アプローチ」「パターン」という用語そのものの違いをIAの手法で考察する

今回学んだことを一言でまとめると、「設計アプローチは開発テーマの切り取り方の違いであり、組み合わせて使ってよい」ということです。POA・DOA・MDA・SOA・ROA・OOADの6つを、それぞれの「主役」とセットで思い出せるようにしておきましょう。

次回は、この6つの用語に加えて「アーキテクチャ」「設計」「駆動」「アプローチ」「パターン」という言葉そのものの違いを、Day1で学んだIAの手法を使って考察します。今回の内容が土台になるので、しっかり復習しておきましょう。

🔄 振り返りチェック

🗣️ 要約

  • MDA・SOA・ROA・OOADがそれぞれ何を主役にしているか
  • デザインパターンとは何か、たとえ話を使って説明できるか

以下の問いに答えられるか確認してみましょう:

  • MDA・SOA・ROA・OOADが、それぞれ何を「主役」にしているか説明できますか?
  • デザインパターンとは何か、たとえ話を使って説明できますか?

答えに自信がない場合は、該当部分を読み返すか、AIに質問してみてください。

補足資料

🗣️ 要約

  • 参考資料はRoy Fieldingの「Architectural Styles and the Design of Network-based Software Architectures」
  • 発展課題は、開発テーマの主要機能をSOA視点とROA視点の両方で設計し比較すること
  • 参考リンク: Roy Fielding「Architectural Styles and the Design of Network-based Software Architectures」(REST提唱論文)
  • 発展課題: 自分たちの開発テーマの主要機能を1つ選び、SOA視点(サービス)とROA視点(リソース)の両方で設計してみて、どちらが説明しやすいか比べてみましょう

学習ガイド

🗣️ 要約

  • 受講者からよく出る質問への回答例と、つまずきやすいポイントへの対処法をまとめている

このセクションは、受講者が理解を深めることをサポートする参考情報です。

想定される質問と回答例

🗣️ 要約

  • SOAは動詞的なサービス単位、ROAは名詞的なリソース単位で区切る点が違う
  • MDAは骨格の自動生成+人手での実装という組み合わせになることが多い
  • OOADはオブジェクト単位の分析・設計、MVCはその実装をModel/View/Controllerに配置する構造
質問 ヒント
SOAとROAって結局どう違うの? SOAは「〇〇する」という動詞的なサービス単位、ROAは「〇〇」という名詞的なリソース単位で区切る点が違う。RESTful APIのURL設計はROAの発想に基づく
MDAって結局モデルを描けばコードが全部できるの? 完全自動生成できる範囲はツールや現場によって差があり、多くの場合は骨格の自動生成+人手での実装、という組み合わせになる
OOADとMVC(後日学ぶ)はどう関係するの? OOADはオブジェクト単位で分析・設計する考え方、MVCはその実装をModel/View/Controllerという役割で配置する構造。OOADで設計したクラスをMVCの各層に配置するイメージ

つまずきやすいポイント

🗣️ 要約

  • 6つの設計アプローチをどれか1つに絞ろうとしてしまいやすいが、実務では組み合わせて使うのが普通
  • デザインパターンを「難しい理論」だと身構えてしまいやすいが、よくある悩みへの定石集にすぎない
  • ジェネレーションギャップパターンをGoFの23種類の1つだと誤解しやすいが、別の文脈のパターン
つまずきポイント ヒント
6つの設計アプローチをどれか1つに絞ろうとしてしまう 実務では組み合わせて使うのが普通。「主役」の切り口が違うだけで排他的ではないことを思い出す
デザインパターンを「難しい理論」だと身構えてしまう パターンは「よくある悩みへの定石集」というだけ。まずは名前と目的をセットで覚えれば十分
GoFとジェネレーションギャップパターンを同列の23種類の1つだと誤解する ジェネレーションギャップパターンはGoFの23種類には含まれない、別の文脈(自動生成コードとの共存)で使われるパターン
読み上げを開始します...

AIに質問する