設計アプローチ②(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を割り当てる 設計アプローチは開発テーマの切り取り方の違いであり、組み合わせて使える
まず全体像です。設計アプローチは、開発テーマという同じ題材を、どの単位で切り取るかの違いだと考えてください。
前回の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種類には含まれない、別の文脈(自動生成コードとの共存)で使われるパターン |