[技術講座]ラッピングに関する一考察
このドキュメントでは仮想的なライブラリとフレームワークを例に話を進めていきたいと思います。ここで、ライブラリとは、Log4J のように、プロダクトが提供したサービスをアプリケーション側から呼び出す形式を、フレームワークとは、Struts のように、プロダクトで予め用意されたインタフェースを、アプリケーション側で実装し、その制御はプロダクト側で行う形式をいうことにします。
では、ライブラリのサンプル Service の API を説明します。
アプリケーションは Service のインスタンスを static メソッド getInstance() で取得します(インスタンスを毎回生成するか、キャッシュするかはここでは特定しません)。その他の API ですが、service() は独自に定義された引数 Param と戻り値 Result、例外 AppException の各クラスを使用します。service2() は引数は独自に定義されたクラスですが、戻り値は Java 標準ライブラリの Object 型、service3() は戻り値は独自に定義されたクラスですが、引数は Java 標準ライブラリの型、service4() は引数、戻り値とも Java 標準ライブラリの一般的な型となっています。
package original;
public class Service
{
protected Service() {}
public static Service getInstance() {
// 実装略。
}
// 独自の引数、戻り値、例外を使用。
public Result service(Param param) throws AppException {
// 実装略。
}
// 独自の引数を使用。戻り値は一般的な型。
public Object service2(Param param) {
// 実装略。
}
// 独自の戻り値を使用。引数は一般的な型。
public Result service3(Object param, String name) {
// 実装略。
}
// 引数、戻り値は一般的な型。
public Object service4(Object param, String name) {
// 実装略。
}
}
続いて、フレームワークのサンプル Processor のAPI を説明します。
アプリケーションは Processor インタフェースを implements したクラスを定義し、各メソッドを実装します(間に抽象クラス AbstractProcessor が入る場合もあります)。Processor を呼び出すのはフレームワーク側の責任です。用意された API は Service のときと同じように、独自に定義された引数 Param、戻り値 Result、例外 AppException の各クラスを使用する process()、引数のみ独自に定義されたクラスを使用する process2()、戻り値のみ独自に定義されたクラスを使用する process3()、引数、戻り値とも Java 標準ライブラリの型を使用する process4() の4つです。
package original;
public interface Processor
{
// 独自の引数、戻り値、例外を使用。
public Result process(Param param) throws AppException;
// 独自の引数を使用。戻り値は一般的な型。
public Object process2(Param param);
// 独自の戻り値を使用。引数は一般的な型。
public Result process3(Object param);
// 引数、戻り値は一般的な型。
public Object process4(Object param);
}
package original;
public abstract class AbstractProcessor implements Processor
{
protected AbstractProcessor() {}
// デフォルトの実装(あれば)。
public Result process(Param param) throws AppException {
// デフォルトの実装。
}
}
package original.impl;
import original.*;
public class ProcessorImpl extends AbstractProcessor
{
public ProcessorImpl() {}
// 独自の引数、戻り値、例外を使用。
public Result process(Param param) throws AppException {
// 実装略。
}
// 独自の引数を使用。戻り値は一般的な型。
public Object process2(Param param) {
// 実装略。
}
// 独自の戻り値を使用。引数は一般的な型。
public Result process3(Object param) {
// 実装略。
}
// 引数、戻り値は一般的な型。
public Object process4(Object param) {
// 実装略。
}
}
© 2003 OGIS-RI Co., Ltd. |
|