translation:adc:cocoa:foundation:introduction_to_dynamically_loading_code:0500_multibundleapps

複数バンドルアプリケーション

本項では、複数の読込み可能コンポーネントを使ったアプリケーションの設計方法を説明します。 この概念は、アプリケーションを多くのロード可能コンポーネントとして構築する開発者、拡張可能なプラグイン機構を設計する開発者の両者に関係します。

コンポーネントはオブジェクト指向プログラミングモデルの核心です。 込み入ったコードの寄せ集めからなる一枚岩(monolithic)なものよりむしろ、適切に設計されたアプリケーションは多数のコンポーネントから構築され、これらの各々が明確に定義された機能単位のいくつかを扱います。 このコンポーネント化は、単純なデータオブジェクトから統合HTMLビューワ(integrated HTML viewers)といった多数の自己完結型(self-contained)コンポーネントに至るまで、多くの段階で発生します。 Cのような“非オブジェクト指向”言語で書かれたアプリケーションでさえ、この種のコンポーネント化が見られます。

読込み可能バンドルを使うことで、コンポーネントを実行時に動的読込みが可能な、独立した実行可能パッケージに分割することが出来ます。 アプリケーション設計の際、複数の読込み可能バンドルを用いて、他に依存せずに開発、コンパイル、読み込みが行えるが、協調して動作する明確に定義されたコンポーネント単位にアプリケーションを分けたいと思うかもしれません。 シンプルなデータオブジェクトに複数バンドルを用いる必要はないでしょうが、より巨大な機能の部品には最適かもしません。

例として、はがき・バナー・ニュースレターを統合的に扱うアプリケーションを取り上げます。 この3つのコンポーネントは何らかの共有コードにリンクされているかもしれませんが、どんな実行状態においても、1つ以上のコンポーネントが使われる事はありません。 加えて、各々は他のコンポーネントとは独立しており、本質的に別々のアプリケーションとして機能します。

このような条件を持つアプリケーションは、バンドルによるコンポーネント化の良い候補です。 図1はアプリケーションのバンドル構成の例を示しています。

図1 読込み可能バンドルによる大規模なコンポーネント化

個々のコンポーネントを読込み可能バンドルとしてビルドすることにより、いくつかの利点を得られます:

  • それぞれのコンポーネントを独立で開発・テストが可能となり、他のコンポーネントをリビルドすることなくビルド出来ます。
  • (アプリケーションの)周辺でファイルパッケージを移動するだけで、異なるバージョンのコンポーネントを混在させることが出来ます。
  • 実行時、不必要なコードを読み込む代わりに、実際に使用されるバンドルだけを読み込むことが出来ます。非Cocoaアプリケーションでは同様に、用済みのバンドルを解放することが出来ます。

この種のコンポーネント化は大部分のアプリケーションにとって有益ですが、動的読み込みは必要ないかもしれません。 その代わりとして、多数のアプリケーションや、1つのアプリケーションの複数のコンポーネントから使用される共有コードには、フレームワークを使用すべきです。

また、Cocoaアプリケーションはバンドルを解放することが出来ません。 巨大で独立に構築されたアプリケーションコンポーネントの読み込みと解放を実現したいのであれば、アプリケーションを幾つかの小さな実行ファイルとして構築し、メインアプリケーションが子プロセスをフォーク1)する方法が使えます。 プロセス間の通信は、Cocoa分散オブジェクトアーキテクチャを用いることで実現可能です。 詳しい情報は Distributed Objects Programming Topics をご覧ください。

アプリケーションに利益をもたらすもう1つの一般的な方法が、プラグインモデルです。 多くのアプリケーションは、画像処理フィルターやスクリーンセーバーのモジュールのように、類似の仕事の実行という多数の特徴を持ちます。 後から比較的容易に新しいモジュールを追加することが可能となるので、それらをプラグインアーキテクチャの一部として開発するのが最適です。 加えて、プラグインアーキテクチャを公開することで、サードパーティによるアプリケーションの拡張を実現出来ます。 たとえプラグインアーキテクチャの公開を望まないとしても、プラグインモデルの採用は内部による開発を素晴らしく容易なものに出来ます。 プラグインに関する更なる情報は“プラグインアーキテクチャ”をご覧下さい。

アプリケーションを効率的に複数バンドル構成にするために、いくつかの事を気に留めるべきでしょう:

  • 読込み可能バンドル間の複雑な内部依存の管理は困難なので、アプリケーションを主に自己完結型の独立ユニットにまとめます。これを行う最も簡単な方法は、各バンドルが別のバンドルの中の1つのオブジェクト─通常、Cocoaでは主要クラス─への参照を持ち、これを使って全ての機能やデータにアクセスすることです。
  • 決して使用されないコードの読み込みを防ぐために、1実行セッション中に使用されないコンポーネントは分離する事。
  • アプリケーションが、グラフィックスフィルターやファイル書き出しといった、同様のタイプの操作を行う様々な種類の多数のコンポーネントを持つ場合や、拡張性あるいはコンポーネントの可換性を必要とするならば、プラグインアーキテクチャの採用を考えて下さい。

複数のバンドルを使うケース”で解説した、はがき・バナー・ニュースレターアプリケーションの例に戻ってみます。 上記ガイドラインによれば、このアプリケーションは4つの読込み可能バンドルで構成するのが良いように見えます。 1つが中心となるアプリケーションコントローラ、残りの3つがそれぞれの機能を持つサブアプリケーションです。 加えて、アプリケーションは恐らく、多くの異なるテキスト描画方法を持ちます。円状やシマウマの形で書くなどです。 テキスト描画手法についてプラグインアーキテクチャを提供することで、アプリケーション開発者の仕事が容易になり、第三者が3Dテキスト描画のような機能の追加を可能にします。


1)
訳注:恐らくFork-Execの意
  • translation/adc/cocoa/foundation/introduction_to_dynamically_loading_code/0500_multibundleapps.txt
  • 最終更新: 2020-12-04 13:39
  • by Decomo