Библиотека-оболочка
Библиотеки-оболочки (или оболочки библиотек ) состоят из тонкого слоя кода (« прокладки »), который преобразует существующий интерфейс библиотеки в совместимый интерфейс. Это делается по нескольким причинам:
- Для улучшения плохо спроектированного или сложного интерфейса.
- Разрешить совместную работу кода, который в противном случае невозможен (например, несовместимые форматы данных).
- Включить межъязыковую совместимость и/или во время выполнения. совместимость
Библиотеки-оболочки могут быть реализованы с использованием адаптера , фасада и, в меньшей степени, прокси шаблонов проектирования .
Структура и реализация
[ редактировать ]Конкретный способ реализации библиотеки-оболочки сильно зависит от среды, в которой она написана, и сценариев, для которых она предназначена. Это особенно верно в том случае, когда межъязыковая совместимость/взаимодействие во время выполнения учитывается .
Пример
[ редактировать ]Ниже представлена общая иллюстрация общей реализации библиотеки-оболочки. В этом примере интерфейс C++ действует как «обертка» C. интерфейса
Интерфейс C
[ редактировать ]int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr);
int pthread_mutex_destroy (pthread_mutex_t * mutex);
int pthread_mutex_lock (pthread_mutex_t * mutex );
int pthread_mutex_unlock (pthread_mutex_t * mutex );
оболочка C++
[ редактировать ]class Mutex
{
pthread_mutex_t mutex;
public:
Mutex()
{
pthread_mutex_init(&mutex, 0);
}
~Mutex()
{
pthread_mutex_destroy(&mutex);
}
private:
friend class Lock;
void lock()
{
pthread_mutex_lock(&mutex);
}
void unlock()
{
pthread_mutex_unlock(&mutex);
}
};
class Lock
{
private:
Mutex &mutex;
public:
Lock(Mutex &mutex): mutex{mutex}
{
mutex.lock();
}
~Lock()
{
mutex.unlock();
}
};
Исходный интерфейс C можно считать подверженным ошибкам, особенно в случае, когда пользователи библиотеки забывают разблокировать уже заблокированный мьютекс. Новый интерфейс эффективно использует инициализацию получения ресурсов (RAII) в новом интерфейсе. Мьютекс и Блокируйте классы, чтобы гарантировать Mutex в конечном итоге разблокируется и Объекты pthread_mutex_t автоматически освобождаются.
Приведенный выше код точно имитирует реализацию boost::scoped_lock и boost::mutex , которые являются частью библиотеки boost::thread .
Обертки драйверов
[ редактировать ]Межъязыковая совместимость/взаимодействие во время выполнения
[ редактировать ]Некоторые библиотеки-оболочки существуют как мост между клиентским приложением и библиотекой, написанной с использованием несовместимой технологии. Например, приложению Java может потребоваться выполнить системный вызов . Однако системные вызовы обычно представляются как функции библиотеки C. Чтобы решить эту проблему, Java реализует библиотеки-оболочки, которые позволяют вызывать эти системные вызовы из приложения Java.
Чтобы добиться этого, такие языки, как Java, предоставляют механизм, называемый интерфейсом внешней функции , который делает это возможным. Некоторые примеры этих механизмов включают в себя:
- Собственный интерфейс Java (JNI)
- Собственный доступ к Java (JNA)
- Иностранная библиотека функций для Python.
- Управляемые расширения
- SWIG (упрощенная оболочка и генератор интерфейса)
Существующие библиотеки-оболочки
[ редактировать ]Некоторые примеры существующих библиотек-оболочек: