WikiDer > Библиотека обертки
Библиотеки оболочки (или оболочки библиотеки) состоят из тонкого слоя кода ("прокладка"), что переводит библиотекасуществующий интерфейс в совместимый интерфейс. Это делается по нескольким причинам:
- Чтобы улучшить плохо спроектированный или сложный интерфейс
- Разрешить совместную работу кода, который иначе не может (например, несовместимые форматы данных)
- Включить кросс-язык и / или время выполнения совместимость
Библиотеки оболочки могут быть реализованы с использованием адаптер, фасад, и в меньшей степени доверенное лицо шаблоны проектирования.
Структура и реализация
Конкретный способ реализации библиотеки-оболочки сильно зависит от среды, в которой она написана, и сценариев, которые она намеревается адресовать. Особенно это актуально в том случае, когда межъязыковая совместимость / взаимодействие во время выполнения это соображение.
пример
Ниже приводится общая иллюстрация реализации общей библиотеки-оболочки. В этом примере интерфейс C ++ действует как «оболочка» интерфейса языка C.
C интерфейс
int pthread_mutex_init(pthread_mutex_t * мьютекс , pthread_mutexattr_t * attr);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 мьютекс;общественный: Мьютекс() { pthread_mutex_init(&мьютекс, 0); } ~Мьютекс() { pthread_mutex_destroy(&мьютекс); }частный: друг класс Замок; пустота замок() { pthread_mutex_lock(&мьютекс); } пустота разблокировать() { pthread_mutex_unlock(&мьютекс); }};класс Замок{частный: Мьютекс &мьютекс;общественный: Замок(Мьютекс &мьютекс): мьютекс{мьютекс} { мьютекс.замок(); } ~Замок() { мьютекс.разблокировать(); }};
Исходный интерфейс C можно рассматривать как подверженный ошибкам, особенно в случае, когда пользователи библиотеки забывают разблокировать уже заблокированный мьютекс. Новый интерфейс эффективно использует RAII (получение ресурсов - это инициализация) в новом Мьютекс и Замок классы для обеспечения Мьютексв конечном итоге разблокируются и pthread_mutex_t объекты автоматически освобождаются.
Приведенный выше код близко имитирует реализацию boost :: scoped_lock и boost :: mutex которые являются частью boost :: thread библиотека.
Обертки драйверов
Межъязыковая совместимость / взаимодействие во время выполнения
Некоторые библиотеки-оболочки существуют, чтобы действовать как мост между клиентским приложением и библиотекой, написанной с использованием несовместимой технологии. Например, Ява приложению может потребоваться выполнить системный вызов. Однако системные вызовы обычно представлены как функции библиотеки C. Чтобы решить эту проблему, в Java реализованы библиотеки-оболочки, которые позволяют вызывать эти системные вызовы из приложения Java.
Для этого в языках вроде Java предусмотрен механизм, называемый интерфейс внешней функции что делает это возможным. Некоторые примеры этих механизмов включают:
- Собственный интерфейс Java (JNI)
- Собственный доступ Java (JNA)
- Библиотека сторонних функций для Python
- Управляемые расширения
- SWIG (упрощенная оболочка и генератор интерфейсов)
Существующие библиотеки-оболочки
Некоторые примеры существующих библиотек-оболочек: