大規模なソフトウェア実装では、APIの設計と実装の分離が推奨されることがよくあります。しかし、どこかに再接続する必要があります(つまり、実装をAPIに再接続する必要があります)。APIとインプリメンテーションの分離は合計する必要がありますか?
次の例では、インスタンスオブジェクトを介してAPIの設計とその実装の呼び出しを示しています
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コードを完全に分離または分離する利点はありますか?それとも、純粋主義者がほとんど実用的な利益を得ずに完璧に到達しようとしているのだろうか?
これはOSGiの絶対的な必要なのか、それともよい方法でしょうか? – JVerstry
iPOJOのようなフレームワークを必要に応じて使用するには、すべてのケースでそれを行う必要はありません(そして私はそうしません) –