stringtranslate.com

Библиотека-обертка

Библиотеки-обертки (или библиотеки-обертки ) состоят из тонкого слоя кода (« прокладки »), который переводит существующий интерфейс библиотеки в совместимый интерфейс. Это делается по нескольким причинам:

Библиотеки-обертки могут быть реализованы с использованием шаблонов проектирования адаптера , фасада и, в меньшей степени, прокси- шаблонов .

Структура и реализация

Конкретный способ реализации библиотеки-обертки очень специфичен для среды, в которой она пишется, и сценариев, которые она должна решать. Это особенно верно в случае, когда рассматривается кросс-языковая/средовая совместимость.

Пример

Ниже представлена ​​общая иллюстрация реализации библиотеки-обертки. В этом примере интерфейс C++ действует как «обертка» вокруг интерфейса C.

Интерфейс С

int pthread_mutex_init ( pthread_mutex_t * мьютекс , pthread_mutexattr_t * атрибут ); int pthread_mutex_destroy ( pthread_mutex_t * мьютекс ) ; int pthread_mutex_lock ( pthread_mutex_t * мьютекс ); int pthread_mutex_unlock ( pthread_mutex_t * мьютекс );                     

C++-оболочка

класс Мьютекс { pthread_mutex_t мьютекс ;   public : Mutex () { pthread_mutex_init ( & mutex , 0 ); }       ~ Мьютекс () { pthread_mutex_destroy ( & мьютекс ); }   частный : класс друга Lock ;    void lock () { pthread_mutex_lock ( & ​​мьютекс ); }     void unlock () { pthread_mutex_unlock ( & mutex ); } };    класс Lock { частный : Мьютекс & мьютекс ;   public : Lock ( Mutex & mutex ) : mutex { mutex } { mutex . lock (); }       ~ Блокировка () { мьютекс . разблокировка (); } };   

Исходный интерфейс C можно считать подверженным ошибкам, особенно в случае, когда пользователи библиотеки забывают разблокировать уже заблокированный мьютекс. Новый интерфейс эффективно использует получение ресурсов и инициализацию (RAII) в новых классах Mutex и Lock , чтобы гарантировать, что Mutex в конечном итоге будут разблокированы, а объекты pthread_mutex_t будут автоматически освобождены.

Приведенный выше код точно имитирует реализацию boost::scoped_lock и boost::mutex , которые являются частью библиотеки boost::thread.

Драйверные оболочки

Межъязыковая/межоперационная совместимость

Некоторые библиотеки-обертки существуют для того, чтобы выступать в качестве моста между клиентским приложением и библиотекой, написанной с использованием несовместимой технологии. Например, приложению Java может потребоваться выполнить системный вызов . Однако системные вызовы обычно представляются как функции библиотеки C. Для решения этой проблемы Java реализует библиотеки-обертки, которые делают эти системные вызовы доступными для вызова из приложения Java.

Чтобы достичь этого, такие языки, как Java, предоставляют механизм, называемый интерфейсом внешней функции , который делает это возможным. Вот некоторые примеры таких механизмов:

Существующие библиотеки-оболочки

Некоторые примеры существующих библиотек-оболочек:

Смотрите также