大規模なソフトウェア実装では、API設計とその実装を分離することが推奨されることがよくあります。しかし、どこかで、それらを再接続する必要があります(つまり、実装をAPIに再接続する必要があります)。
次の例は、APIデザインと、INSTANCEオブジェクトを介したその実装の呼び出しを示しています。
import java.util.List;
public abstract class Separation {
public static final Separation INSTANCE = new SeparationImpl();
// Defining a special list
public static interface MySpecialList<T> extends List<T> {
void specialAdd(T item);
}
// Creation of a special list
public abstract <T> MySpecialList<T> newSpecialList(Class<T> c);
// Merging of a special list
public abstract <T> MySpecialList<? extends T> specialMerge(
MySpecialList<? super T> a, MySpecialList<? super T> b);
// Implementation of separation
public static class SeparationImpl extends Separation {
@Override
public <T> MySpecialList<T> newSpecialList(Class<T> c) {
return ...;
}
@Override
public <T> MySpecialList<? extends T> specialMerge(
MySpecialList<? super T> a, MySpecialList<? super T> b) {
return ...;
}
}
}
APIは実装コードを参照すべきではないと主張する人もいます。APIコードを個別のファイルを介して実装から分離する場合でも、多くの場合、APIに実装コード(少なくともクラス名)をインポートする必要があります。
完全修飾名の文字列表現を使用して、このような参照を回避する手法があります。クラスにはその文字列がロードされてからインスタンス化されます。コードがより複雑になります。
私の質問:APIコードを実装コードから完全に分離または分離する利点はありますか?それとも、これは実用的なメリットがほとんどない完璧に到達するための純粋主義者の試みですか?