D.2. ライブラリヘッダファイル

defobjライブラリが確立したオブジェクト定義規則を採用するライブラリにとって、ライブラリはmakeファイルを使ってライブラリアーカイブに集めるための単なるソースファイルの集合体ではありません。このライブラリのObjective Cソースファイルは特別な方法で処理されており、それらの定義をヘッダファイルとして発行するだけでなく、そのライブラリが実行時に十二分に利用できるようなオブジェクトを生成します。この方法で処理したライブラリは"パッケージ"と呼ばれます(注意:objectbaseやrandomなど比較的新しいSwarmライブラリには、この特別な処理を経ていないものもあります。これらのライブラリは、このドキュメントに説明されているライブラリインターフェイス規則にすべて従っています)。

defobjライブラリには、パッケージになされた特別な処理について詳細が解説されています。単にライブラリを使うだけのとき、ライブラリに対するパブリックインターフェイス全体は1つのヘッダファイルで宣言するのだということを、かならず覚えておいてください。ヘッダファイルの名前はパッケージ自身の名前に.hサフィックスを加えたものとし、そのファイルには、パブリックインターフェイスだけをそれが指定するオブジェクトの実装と明らかに区別できる方法で記述します。

実装を区別することで、ライブラリはそのオブジェクトを実装するObjective Cのクラスを参照せずに、インターフェイスをそっくり発行することになります。クラスは、あるオブジェクトのインターフェイスをその実装から切り離したものだとみなされることがよくありますが、その分割はとても完全とは言えません。通常これらのクラスは、外部的な使用が予定されていない内部メソッドを多く含んでいるだけでなく、インスタンス変数として定義されたオブジェクトへの特別なストレージフォーマットも定義します。

一方ライブラリは、そのインターフェイスを一連のパブリックなオブジェクト型として発行します。また、これらのオブジェクト型には、シンボルと呼ばれるグローバルオブジェクト定数を追加することもできます。これらの定義は、ライブラリのヘッダファイルの中にだけ記述するのが普通です。ライブラリの残りのソースファイルには、通常そのオブジェクト型を実装するクラスが含まれます。

ライブラリでは、クラス(クラスヘッダファイルを含む)を実装するファイルを、単にそのライブラリのオブジェクト型の機能を利用することを目的として参照する必要はありません。ライブラリには、ライブラリヘッダファイルで発行される型やシンボルに関する情報をすべて記述するのが普通です。ある機能がライブラリヘッダファイルに見当たらないとき、その機能をサポートされているパブリックインターフェイスの一部と考えてはいけません。

個々のクラスヘッダファイルは既存の実装からサブクラス化される必要がありますが、サブクラス化のインターフェイスは、オブジェクトライブラリのパブリックな使用とはまったく別です。クラスの継承は、有力な実装テクニックです。しかし、既存のクラスフレームワークの拡張は、通常、明示的に許可した方法で行わない限り安全とは言えません。サブクラス化をサポートするライブラリは、どのクラスがどんな方法でサブクラス化され得るかを正確に明示する必要があります。ライブラリパッケージでは、この情報はライブラリヘッダファイルの外で提供します。ライブラリのヘッダファイルが指定するのは、どのオブジェクトがその使用を予定しているか、それはローカルクラスによって実装されるのか、あるいは外部サブクラスによるのかというインターフェイスだけです。

このドキュメントの残りのセクションでは、ライブラリヘッダファイルに記述される宣言について、また、ライブラリに提供されるドキュメンテーションの構造について説明をします。Swarmのライブラリは、ほとんどがこの構造に従っています。