Enterprise Objects Framework

Enterprise Objects Framework（EOF）とは、1994年にNeXTのNeXTSTEPおよびOpenStep向けに導入された初期のオブジェクト関係マッピング製品である。EOFは関係データベースとのやり取りの過程を抽象化し、データベース内の行をJavaやObjective-Cのオブジェクトにマッピングする。これにより、開発者は低レベルなSQLコードを書く作業からほぼ解放される。EOFは1990年代中盤に金融関係でそれなりの成功を収めた。1997年にNeXTがApple Computerに吸収合併されると、EOFはAppleのアプリケーションサーバ WebObjects の一部として統合され、同製品の特徴とされるようになった。 1990年代初期NeXTは、データベース利用が多くのビジネスにとって基本であり、かつそれがかなり複雑であることを認識していた。データのソースが違えばアクセス言語（あるいはAPI）も違うため、学習に要するコストや各社製品を使うことによるコストが問題となっていた。NeXT の技術者はオブジェクト指向プログラミングの利点を生かし、オブジェクトに関係データベースと対話させようと考えた。オブジェクト指向と関係データベースは全く異なる技術であるため、何らかの抽象化層を作る必要があると考えられた。それによって、開発者が低レベルで各データソースに固有な手続き的コード (SQL) を書くことから解放されるのである。 最初の試みは1992年にリリースされた Database Kit (DBKit) であった。これはオブジェクト指向フレームワークで任意のデータベースを覆ってしまおうというものである。しかし、当時のNEXTSTEPの性能が足りず、DBKitの設計は実用には向いていなかった。 1994年にNeXTはEnterprise Objects Framework (EOF) バージョン 1をリリースした。DBKitよりさらに強力だが、基本的な考え方は変わっていない。 その後根本的に書き換えを行って、モジュール性を強化しつつOpenStepにも対応させ、1995年後半にEOF 2.0がリリースされた。EOF 2.0はNeXTがFoundation Kitを使った初の製品であった。開発チームはたった3人で構成されていた (Craig Federighi, Eric Noyau、Dan Willhite)。 EOFは1990年代中盤に金融業系のプログラミングである程度の人気を得たが、やがてWorld Wide Webの成長とウェブアプリケーションの概念が生まれたことで本領を発揮することになった。EOFを使えば、古いデータベースを全くいじらずに、そのデータをWebに利用できることは明らかだった。EOFを核とし、状態管理、負荷分散、動的HTML生成などのフレームワークを追加して、NeXTは1996年に世界初のオブジェクト指向アプリケーションサーバWebObjectsをリリースした。 2000年、Apple ComputerはEOFを独立した製品とし、Mac OS Xでのデスクトップアプリケーション開発に利用できるようにした。ただし、同時にWebObjectsの主要コンポーネントとしても使われ続けている。2001年にリリースされたWebObjects 5では、そのフレームワークをObjective-CからJavaへ移植した。この変更に批判的な人は、EOFの能力の大半がObjective-Cと深く結びついており、Javaへの移植によってEOFが持っていた美しさと単純さが失われたと指摘している。サードパーティーのツール（EOGeneratorなど）は、Objective-CとJavaの差異を埋める助けとなる（主な問題は、カテゴリ機能が無くなったことに起因する）。 EOFはオブジェクト関係マッピングのためのツールとフレームワークを提供する。この技術は、JDBC経由の関係データベースやJNDIディレクトリといった各種データソースからデータを検索する機構と、それらデータソースにデータを書き戻す機構を提供することに特化したものである。その機構は階層化・抽象化されており、開発者は特定のデータソースやそのベンダーを意識することなく、高い抽象レベルでデータの読み書きを考えることができる。 その中心となるのはモデルファイル ("EOModel") であり、視覚化ツールEOModelerかXcodeのEOModelerプラグインを使って構築する。そのマッピングは以下のように行われる。 データベースの表をクラスにマッピングする。 データベースの列（カラム）をクラスの属性にマッピングする。 データベースの行（ロウ）をオブジェクト（クラスのインスタンス）にマッピングする。 既存のデータソースに基づいてデータモデルを構築することもできるし、一から構築することもできる（その場合、データベースも一から構築される）。結果として、データベースのレコードがJavaのオブジェクトに変換される。 データモデルを使う利点は、固有な性質を持つデータソースとアプリケーションを分離できる点にある。アプリケーションのビジネスロジックをデータベースから分離することで、アプリケーションに変更を加えることなくデータベースを置き換えることが可能となる。 EOFは他のツールには見られないレベルでデータベース透過性を提供しており、同じモデルを使って異なるデータベースにアクセスでき、さらには複数の異なるデータベースを同時に扱うことも可能である。 EOFでは、オブジェクト指向の特徴である継承を活用している。オブジェクトは、より汎用的な上位のオブジェクトを「継承」し、それに何らかの特殊化を施す。オブジェクト指向プログラミングでは、全てのオブジェクトがこのような継承関係の階層に位置づけられる。しかし、関係データベースはこのような階層は持たない。EOFを使ってデータモデルを構築すると、そこにはオブジェクトの階層が反映される。すなわち、Enterprise Objectsが複数の表にマップされるかビューにマップされるように設計することで、データベースの表群が継承をサポートするかのように設計することが可能である。 Enterprise Object（直訳すれば「企業オブジェクト」）は、オブジェクト指向プログラミングでビジネスオブジェクトと呼ばれるものに似ている。ビジネスオブジェクトとは、ビジネス領域での具体的あるいは概念的オブジェクト（例えば、顧客、注文、商品など）をモデル化したクラスである。EO (Enterprise Objects) が他のオブジェクトと異なるのは、そのインスタンスが何らかのデータソースとマッピングされている点である。典型的なEnterprise Objectは、キーと値のペアを含み、関係データベースの行を表している。キーは列（カラム）の名前であり、その値はデータベース内のその行のそのカラムに格納されている値に他ならない。従って、EOの属性は永続性があると言える。 より正確に言えば、Enterprise Objectとは、com.webobjects.eocontrol.EOEnterpriseObjectインタフェースを実装したクラスのインスタンスである。 Enterprise Objectには対応するモデル (EOModel) があり、そのクラスのオブジェクトモデルとデータベースのスキーマとのマッピングが定義されている。しかし、Enterprise Object自体にはそのモデルに関する知識は存在しない。このような抽象化によって、データベース製品を切り換えても、コードを修正せずに済むのである。そのため、Enterprise Objectsは高度な再利用性を有する。 EOF の概念の多くは、2005年4月にリリースされたMac OS X Tigerにおいてデスクトップアプリケーション向けに導入された。Core Dataは、Cocoa APIを使った開発者向けのオブジェクト-グラフ管理と永続性フレームワークである。つまり、Core Dataはアプリケーションのモデル層をメモリ上に定義されたデータオブジェクト群に編成する。Core Dataはそれらオブジェクトの変化を監視し、必要に応じてその変化を取り消すことができる（ユーザーがundoコマンドを実行したような場合）。そして、アプリケーションのデータの変更点をセーブする際、Core Dataがオブジェクトを永続性のある記憶装置に格納する作業を行う。 このように2つの技術はよく似ているが、目的は異なる。EOFは、クライアントをデータベースサーバに接続するためのJavaベースのフレームワークである。Core Dataは、デスクトップアプリケーション開発をサポートするよう設計されたObjective-Cベースのフレームワークである。Core DataとEOFには、それぞれもう一方にはない固有の機能がある。 ^ Weinberger, Matt (2018年8月7日). “初期の成功、次なる野望、混乱、追放劇、さらなる混乱、驚きの復活劇……時価総額1兆ドル、アップルの波乱万丈”. www.businessinsider.jp. 2022年2月24日閲覧。 ^ Object graph editing context and methods of use US 5956728 A Apple documentation: Enterprise Objects Apple WebObjects product page article in linuxjournal about GDL2