Следует ли полное разделение между API и реализацией?

Разделение между дизайном 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 от кода реализации? Или это просто пурист? s попытка достичь совершенства с небольшими практическими преимуществами?

6
задан Jérôme Verstrynge 22 May 2011 в 18:27
поделиться