Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< Previous PageNext Page >

オブジェクトモデリング

このセクションでは、CocoaバインディングとCore Dataフレームワークに固有のオブジェクトモデリングとキー値コーディングに関して、用語の定義と具体例を紹介します。これらのテクノロジーを活用するためには、キーパスなどの用語を理解することが基本になります。オブジェクト指向の設計やキー値コーディングに初めて取り組む場合は、このセクションを読むことをお勧めします。

Core Dataフレームワークを使用するときは、ビューやコントローラに依存しないモデルオブジェクトを表現する方法が必要になります。再利用可能な優れた設計とするためには、ビューやコントローラにおいて、プロパティどうしの依存関係を前提しないモデルプロパティへのアクセス方法が必要になります。Core Dataフレームワークでは、データベーステクノロジー、具体的にはエンティティ-関係モデルの概念や用語を流用することによって、この問題を解決しています。

エンティティ-関係モデリングはオブジェクトの表現方法の1つで、通常はデータソースのデータ構造を表現するために使われ、オブジェクト指向システムにおいてそれらのデータ構造をオブジェクトにマッピングすることが可能になります。エンティティ-関係モデリングはCocoa独自のものではなく、データベースに関する文献で一定の規則や用語とともに提示されている一般的な考えかたです。この表現方法によって、データソースにおけるオブジェクトの格納と取得がしやすくなります。データソースとしては、データベース、ファイル、Webサービスその他の永続ストアが対象になります。このモデリングはデータソースの種類には依存しないため、あらゆる種類のオブジェクトやオブジェクトどうしの関係を表現するのにも使用できます。

Cocoaではエンティティ-関係モデリングの従来の規則を改訂したものを使用しており、この記事ではオブジェクトモデリングと呼んでいます。オブジェクトモデリングは、Model-View-Controller (MVC)デザインパターンにおけるモデルオブジェクトの表現に特に便利です。これは驚くことではありません。なぜなら、シンプルなCocoaアプリケーションであっても通常はモデルは永続的であり、なんらかのデータコンテナ(単なるファイルの場合もあります)に格納されるからです。

In this section:

エンティティ
属性
関係
プロパティへのアクセス


エンティティ

MVCデザインパターンでは、モデルは指定されたデータをカプセル化し、そのデータを操作するメソッドを提供する、アプリケーション内のオブジェクトです。モデルは通常は永続的ですが、それより重要なことは、モデルは、データがユーザに対してどのように表示されるかには依存しないという点です。

エンティティ-関係モデルでは、モデルをエンティティ、エンティティの構成要素を属性と呼び、他のモデルに対する参照を関係と呼びます。また、属性と関係をまとめてプロパティと呼びます。これら3つの単純な構成要素(エンティティ、属性、関係)を使うことで、どのような複雑なシステムでもモデリングできます。

たとえば、オブジェクトモデルを使って、会社の顧客ベースや書籍のライブラリ、コンピュータのネットワークを表現できます。ライブラリの蔵書には、書名、ISBN番号、著作権の年度などの属性があります。そして、著者やライブラリの会員といった、他のオブジェクトとの関係があります。理論的には、システムの個々の部分を特定できるのであれば、そのシステムをオブジェクトモデルとして表現することが可能です。

Figure 4-7は、従業員管理アプリケーションで使われるオブジェクトモデルの例です。このモデルでは、Departmentによって部署を、Employeeによって従業員を、それぞれモデリングしています。


Figure 4-7  従業員管理アプリケーションのオブジェクト図

Figure 4-7 従業員管理アプリケーションのオブジェクト図

属性

属性は、データを格納する構造を表します。一般に、オブジェクトの属性はスカラー値(たとえばintegerfloatdouble)などの単純な値ですが、C言語の構造体(たとえばcharNSPoint)や、プリミティブクラスのインスタンス(たとえばCocoaのNSNumberNSDataNSColor)であることもあります。NSColorなどの不変オブジェクトも、通常は属性とみなされます(NSAttributeDescriptionで説明しているように、Core Dataはネイティブでは特定の属性タイプだけをサポートします。ただし、『Core Data Programming Guide』の「非標準属性」で説明しているように、追加の属性タイプを使うことができます)。

Cocoaでは、通常、属性はモデルのインスタンス変数やアクセサメソッドに対応します。たとえば、EmployeeにはfirstNamelastNamesalaryなどのインスタンス変数があります。従業員管理アプリケーションでは、Employeeオブジェクトの集まりとそれらの属性の一部を表示するFigure 4-8のようなテーブルビューを実装することが考えられます。テーブル内の各行はEmployeeのインスタンスに対応し、各カラムはEmployeeの属性に対応しています。


Figure 4-8  Employeesテーブルビュー

Figure 4-8 Employeesテーブルビュー

関係

モデルのプロパティは、必ずしもすべてが属性というわけではなく、一部のプロパティは他のオブジェクトに対する関係を表します。アプリケーションは通常、複数のクラスによってモデリングされます。実行時には、オブジェクトモデルはオブジェクトグラフを構成する関連オブジェクトの集まりです。関連オブジェクトは通常、ドキュメントベースのアプリケーションのように、ユーザが作成し、アプリケーションを終了する前になんらかのデータコンテナやファイルに保存する、永続的なオブジェクトです。これらのモデルオブジェクト間の関係を実行時にたどることによって、関連オブジェクトのプロパティにアクセスすることができます。

たとえば、従業員管理アプリケーションでは、従業員と、その従業員が仕事をしている部署との間に関係が存在するほか、従業員と、その従業員の上司との間にも関係が存在します。後者のような関係は、あるエンティティからそのエンティティ自身への関係を表す再帰関係の一例です。

関係は本質的に双方向です。そのため概念的には、部署と、その中で仕事をしている従業員との間に少なくとも関係が存在し、従業員と、その従業員の直属の部下との間にも関係が存在します。Figure 4-9は、Department(部署)エンティティとEmployee(従業員)エンティティの関係、およびEmployeeの再帰関係を示します。この例では、Departmentエンティティの“employees”関係は、Employeeエンティティの“department”関係の逆関係です。ただし、一方向にだけナビゲーションが可能な関係、つまり、逆関係がまったく存在しない関係もあり得ます。たとえば、部署オブジェクトを起点としてそのオブジェクトに関連付けられている従業員を知る必要がまったくなければ、その関係をモデリングする必要はありません(一般的な事例ではこのことが成り立ちますが、Core Dataでは一般的なCocoaオブジェクトモデリングに対してさらに制約が課せられる場合があります。逆関係をモデリングしないという事例はきわめて高度な選択肢と考えてください)。


Figure 4-9  従業員管理アプリケーションにおける関係

Figure 4-9 従業員管理アプリケーションにおける関係

関係の濃度と所有権

関係はすべて濃度を持ちます。濃度によって、いくつの対象オブジェクトが関係を解決できる(可能性がある)かがわかります。対象オブジェクトが単一のオブジェクトの場合、その関係のことを対一関係と呼びます。対象の中に複数のオブジェクトが存在し得る場合、その関係のことを対多関係と呼びます。

関係は必須の場合と任意の場合があります。必須関係とは、対象を必要とする関係のことです。たとえば、従業員はすべてなんらかの部署に関連付けられます。任意関係とは、その名前が示すように関係の有無が任意であることです。たとえば、すべての従業員が直属の部下を持つとは限りません。

また、濃度の範囲を指定することも可能です。対一の任意関係の範囲は、0~1となります。従業員は、任意の人数の直属の部下を持つことができます。あるいは、0~15のように、最小と最大を指定する範囲を持つことができます。これも、対多の任意関係を示します。

Figure 4-10は、従業員管理アプリケーションにおける濃度を示します。EmployeeオブジェクトとDepartmentオブジェクトの関係は必須の対一関係です。従業員は必ず1つの部署に所属し、かつ、ただ1つの部署にしか所属できません。DepartmentオブジェクトとそのEmployeeオブジェクトの関係は任意の対多関係です(“*”で表しています)。従業員と上司の関係は任意の対一関係です(範囲0~1で示しています)。最上位の従業員は上司を持ちません。


Figure 4-10  関係の濃度

Figure 4-10 関係の濃度

関係の対象オブジェクトは、所有されることもあれば、共有されることもあります。

プロパティへのアクセス

モデル、ビュー、コントローラがそれぞれ互いに依存しないようにするためには、モデルの実装とは独立した方法でプロパティにアクセスする必要があります。これを実現するには、キーと値のペアを使用します。

キー

モデルのプロパティは、単純なキー(文字列であることも多い)を使って指定します。対応するビューまたはコントローラは、キーを使って、対応する属性のを参照します。「属性に対応する値」という構造により、属性自身は必ずしもデータを格納するわけではないという概念が実現され、値を間接的に取得したり導き出したりできるようになります。

この参照を実行するために使うのがキー値コーディングです。キー値コーディングはオブジェクトのプロパティに間接的に(場合によっては自動的に)アクセスするための仕組みです。キー値コーディングは、オブジェクトのプロパティの名前(通常はそのインスタンス変数やアクセサメソッド)を、これらのプロパティの値にアクセスするキーとして使うことで機能します。

たとえば、nameキーを使ってDepartmentオブジェクトの名前を取得することが考えられます。Departmentオブジェクトがnameという名前のインスタンス変数またはメソッドのどちらかを持っていれば、キーに対応する値を取得できます(どちらも持っていなければエラーになります)。同様に、firstNamelastNamesalaryの各キーを使ってEmployee属性を取得することが考えられます。

ある特定の属性の値はすべて同じデータ型です。属性のデータ型は、その属性に対応するインスタンス変数の宣言の中か、またはその属性のアクセサメソッドの戻り値の中で指定します。たとえば、Departmentオブジェクトのname属性のデータ型を、Objective-CのNSStringオブジェクトにすることができます。

キー値コーディングではオブジェクトの値だけが返されることに注目してください。指定したキーに対応する値を得るために使った特定のアクセサメソッドまたはインスタンス変数の戻り型またはデータ型がオブジェクトでない場合は、その値に対してNSNumberオブジェクトまたはNSValueオブジェクトが作成され、それが代わりに返されます。Departmentのname属性がNSString型ならば、Departmentオブジェクトのnameキーを指定してキー値コーディングを使ったときに返される値はNSStringオブジェクトです。Departmentのbudget属性がfloat型ならば、Departmentオブジェクトのbudgetキーを指定してキー値コーディングを使ったときに返される値はNSNumberオブジェクトです。

同様に、キー値コーディングを使って値を設定するとき、指定のキーに対応するアクセサまたはインスタンス変数が必要とするデータ型がオブジェクトでない場合、渡したオブジェクトから、該当する -<型>Value メソッドを使って値が取り出されます。

対一関係の値は、単純にその関係の対象オブジェクトです。たとえば、Employeeオブジェクトのdepartmentプロパティの値はDepartmentオブジェクトです。対多関係の値は、その関係の対象オブジェクトが含まるコレクションオブジェクトです(集合または配列。Core Dataを使っている場合は集合です。それ以外の場合、通常は配列です)。たとえば、Departmentオブジェクトのemployeesプロパティの値はEmployeeオブジェクトを含んでいるコレクションです。Figure 4-11は、従業員管理アプリケーションのオブジェクトグラフの例です。


Figure 4-11  従業員管理アプリケーションのオブジェクトグラフ

Figure 4-11 従業員管理アプリケーションのオブジェクトグラフ

キーパス

キーパスはドットで区切られたキーからなる文字列のことで、たどるべき一連のオブジェクトプロパティを指定します。最初のキーのプロパティは前のプロパティによって決まり、後続のキーはそれぞれの前のプロパティに対する相対的な関係から決まります。キーパスにより、モデルの実装に依存することなく、関連オブジェクトのプロパティを指定できるようになります。キーパスを使うと、オブジェクトグラフの中で、関連オブジェクトの特定の属性に至るまでの任意の深さの経路を指定できます。

キー値コーディングの仕組みには、キーと値のペアの場合に似た、キーパスの指定による値の参照が実装されています。たとえば、会計アプリケーションでdepartment.nameキーパスを使い、Employeeオブジェクトを経由してDepartmentの名前にアクセスすることが考えられます。ここで、departmentはEmployeeの関係で、nameはDepartmentの属性です。キーパスは対象エンティティの属性を表示したい場合に便利です。たとえば、Figure 4-12に示す従業員テーブルビューは、部署オブジェクトそのものではなく、従業員の部署オブジェクトの名前を表示するように設定されています。Cocoaバインディングを使い、表示される配列の中で、“Department”カラムの値を従業員オブジェクトのdepartment.nameにバインドしています。


Figure 4-12  部署名が表示された従業員テーブルビュー

Figure 4-12 部署名が表示された従業員テーブルビュー

キーパス内の関係のすべてが必ずしも値を持つわけではありません。たとえば、従業員がCEOならば、manager関係がnilである可能性があります。この場合でも、キー値コーディングの仕組みが成り立たなくなることはありません。単にパスをたどることを止めてnilなどの適切な値を返すだけです。



< Previous PageNext Page >


Last updated: 2006-05-23




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice