EOClassMultiplicity
2007/03/30 (Fri) 22:07:46 JST
クラス間の多重度
WebObjectsでは複雑に絡み合っているオブジェクトが多く、各クラスの役割がわかっても実際にどう動いているのか、どうアクセスすればいいのかがわかりにくい面があります。 WebObjectsは難しい、敷居が高いと言われることがありますが、この多重度がフレームワークの理解を阻む壁の一つではないでしょうか。 そこで、主要なクラスであるアクセスレイヤーとコントロールレイヤーのクラス間の多重度を整理することで、全体の流れを把握する手助けにしたいと思います。
図:クラス間の多重度 (EOClassMultiplicityFigures)
次のように、各クラスをレイヤーと役割に応じて場所と色を変えています。
- アクセスレイヤー(上半分)
- アダプタレベル(左上、紫)
- データベースレベル(中央、青)
- モデル(右上、緑)
- コントロールレイヤー(下半分、黄)
太い枠で囲まれているクラスは、アプリケーションごとに1つのインスタンスが用意されます。
アクセスレイヤー
アクセスレイヤーのクラスは大きく3つに分けられます。 データベースに接続し操作するアダプタレベル、データベース操作を抽象化するデータベースレベル、データベースをオブジェクトにマッピングするモデルクラスです。
モデル
まずはわかりやすいモデルクラスから見ていきましょう。 モデルの中心となるのはEOModel、エンティティや属性などのマッピング情報をまとめるクラスです。 EOModelはデータベースごとに用意されます。 このクラスのオブジェクトを用意するのが、名前の通りの開発ツールのEOModelerです。
EOEntity, EOAttribute, EORelationship, ?EOStoredProcedureは、これも名前の通りの要素をマッピングするおなじみのクラスです。 EORelationshipはリレーション元とリレーション先の属性を指定したEOJoinを複数持ちます。
?EOModelGroupはEOModelを一元管理します。 管理するEOModelとEOEntityを取得するメソッドが用意されており、モデルオブジェクトにアクセスするなら?EOModelGroupをたどるのが簡単です。
アダプタレベル
EOF上でこのデータベースにあたるのがEOAdaptorとその関連クラスです。 データベース操作はアダプタレベル、データベースレベル、コントロールレイヤーと三重に抽象化され、通常アダプタレベルまで気にすることはありません。
EOAdaptorはデータベースへ接続するための情報を管理します。 アダプタレベルの各クラスから参照されます。 EOModelはEOAdaptorを1つ利用しますが、複数のEOModelから同じEOAdaptorを参照できます。 EOModelerで言うと、モデルファイルはデータベースごとに用意されることになりますが、複数のモデルファイルで同じデータベースを使うことができます。
?EOAdaptorChannelはデータベースと接続する通信チャネル、?EOAdaptorContextはトランザクションを操作するクラスです。 データベースレベルのクラスと深く関わってきます。
データベースレベル
データベースレベルのクラスはアダプタレベルと対応しており、多重度だけで見るとアダプタレベルから独立しているように見えますが、単純なラッパーではありません。 特にEODatabaseContextにアクセスするときは注意してください。 実際はEODatabaseContextがアダプタレベルのオブジェクトを直接使っているようです。
多重度はアダプタレベルとほぼ同じです。 Operationクラスの多重度が異なりますが、?EOAdaptorOperationは?EODatabaseOperationのデータベース操作命令から、具体的なデータベース処理を組み立てるためです。 さらに?EOAdaptorOperationがEOSQLExpressionに変換され、データベースにSQL文が送られます。
コントロールレイヤー
このレイヤーに普段EOFを操作するのに使う多くのクラスがあります。 中でも重要なのはEOObjectStoreCoordinator、EOEditingContext、?EOEnterpriseObjectの関係と、?EOEnterpriseObject、EOGlobalID、スナップショット(特別なクラスではありませんが)の関係です。
各?EOEnterpriseObjectは1つのEOEditingContextに所属し、各EOEditingContextは1つのEOObjectStoreCoordinatorに所属します。 一方EOGlobalID、スナップショットと?EOEnterpriseObjectは1対多の関係です。 これは実際には、?EOEnterpriseObjectはスナップショットのコピーに相当し、各コピーはEOEditingContextに1つずつ所属するということになります。
Inverse Pages: WebObjects基礎研究室