最近OOUIに関する本を読みました。この本は、オブジェクト指向でのユーザインターフェースの設計について書かれています。OOUIは、UIの設計にオブジェクト指向の考え方を取り入れる設計方法で、ユーザーが操作するオブジェクトをモデル化し、それらのオブジェクト間の関係を設計することで、UIの設計を行います。
現実世界で道具を使う際に、物を手に取って操作するのが自然な使われ方で、コンピュータ上でも同じようにオブジェクトを指定して操作することができると、ユーザーは直感的に操作することができるという考え方です。
この本では、主にUIについての設計方法が書かれているので、単純にモデルという名前で呼ばれていますが、実際のアプリケーション開発では、プログラミングを行う上でのモデルも存在しており、混同することがあると考えられます。
そこでこの記事では、ユーザーが認識できるソフトウェア上でのモデルを「概念モデル」とし、プログラム上でのモデルを「実装モデル」として区別し、それぞれの違いについて説明します。
概念モデルは、ユーザー視点から見たシステムの構造、機能、振る舞いを抽象的に表現したモデルです。ユーザーがシステムをどのように理解し、操作するかというメンタルモデルを反映しています。以下の手順で設計します。
ユースケースの分析: ユーザーがシステムで実行する主要な機能を洗い出します。
主要な概念の特定: ユースケースから主要な概念を抽出し、それらの関係性を明確にします。
概念モデルの作成: UMLのクラス図を使用して、各概念とその関係を視覚化します。
属性と操作の定義: 各クラスに対して属性(プロパティ)と操作(メソッド)を定義します。
実装モデルは、システムを実際に構築するための詳細な設計図であり、プログラミング言語やフレームワーク、データベースなどの技術的な制約を考慮して作成されます。概念モデルとは異なり、実装モデルは具体的な技術要件を満たすように設計されます。以下の手順で設計します。
実装上の制約を考慮: 実装モデルでは、具体的な技術的制約やパフォーマンス要件を考慮して設計します。
概念モデルの抽象化: 概念モデルを基に、必要な抽象化や具体化を行います。実装モデルは、概念モデルを参考にしながらも、詳細な技術的要件を満たすように設計します。
実装モデルの拡張: システムが複雑な場合、概念モデルでは表現しきれない追加の詳細を実装モデルに含めます。
概念モデルと実装モデルは、同じシステムを異なる視点から設計するため、密接に関連しています。概念モデルはユーザーの視点からシステムを抽象化したモデルであり、実装モデルはその概念モデルを具体的な技術要件に基づいて実装したモデルです。
必ずしも、概念モデルと実装モデルが一対一に対応するわけではありません。 例えば、Wordなどで文章を管理する際の概念としてDocumentという概念モデルがあるとします。 この概念モデルは、クラス図を用いて次のように書けます。
この概念モデルでは、Documentという概念がユーザーから見える形でUI上に存在することを表現しています。 プロパティとしては、タイトルや本文があり、操作としては保存、タイトルや本文の編集、エクスポート、閉じるなどがあります。 ユーザーはこのDocumentという概念を操作することで、文章を作成・編集・保存することができます。
しかしながら、実際の実装モデルでは、このDocument通りにクラスを作成するのは現実的でないのをソフトウェアを開発している人は知っているはずです。
saveやexportなどの操作は、ユースケースの責務であり、タイトルや本文の編集や閉じるなどは、UIの操作に関連するものであり、それぞれの操作に対応するクラスやメソッドが異なります。
実装モデルでは、Documentという概念を具体的なクラスやメソッドに分解し、それぞれの責務を適切に分散させる必要があります。
この操作を実装モデルにする場合、次のような感じになるのではないでしょうか?
実装モデルについては、ソフトウェアの技術的制約やコードの再利用性、保守性、拡張性などを考慮して設計されます。概念モデルと実装モデルは、同じシステムを異なる視点から設計するため、密接に関連していますが、それぞれの目的や視点が異なるため、一対一に対応するわけではありません。
概念モデルと実装モデルの違いとそれぞれの設計方法について説明しました。概念モデルはユーザー視点でシステムの主要な要素を捉え、実装モデルは具体的な技術的要件を反映させる役割を果たします。これにより、ユーザーにとって使いやすく、技術的に優れたシステムを構築することができるはずです。
まだ概念モデルについては、あまり意識していなかったので、今後の設計に活かしていき、実装モデルとの関連やUI設計についても考慮していきたいと思います。
ソフトウェアエンジニア。趣味は競馬、写真、ゲーム。
お問い合わせはTwitterのDMでお願いします。