Knihovna obalů - Wrapper library
Obálky knihovny (nebo obálky knihovny) se skládají z tenké vrstvy kódu (apodložka "), který překládá a knihovna stávající rozhraní do kompatibilního rozhraní. To se děje z několika důvodů:
- Vylepšit špatně navržené nebo komplikované rozhraní
- Povolit spolupráci kódu, který jinak nemůže (např. Nekompatibilní datové formáty)
- Povolit křížový jazyk a / nebo runtime interoperabilita
Obálky knihovny lze implementovat pomocí adaptér, fasáda, a v menší míře, proxy designové vzory.
Struktura a implementace
Specifický způsob implementace souhrnné knihovny je vysoce specifický pro prostředí, ve kterém se píše, a scénáře, které má v úmyslu řešit. To platí zejména v případě, kdy mezioperační / runtime interoperabilita je úvaha.
Příklad
Následující text poskytuje obecnou ilustraci běžné implementace souhrnné knihovny. V tomto příkladu funguje rozhraní C ++ jako „wrapper“ kolem rozhraní v jazyce C.
Rozhraní 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 );
Obálka C ++
třída Mutex{ pthread_mutex_t mutex;veřejnost: Mutex() { pthread_mutex_init(&mutex, 0); } ~Mutex() { pthread_mutex_destroy(&mutex); }soukromé: příteli třída Zámek; prázdnota zámek() { pthread_mutex_lock(&mutex); } prázdnota odemknout() { pthread_mutex_unlock(&mutex); }};třída Zámek{soukromé: Mutex &mutex;veřejnost: Zámek(Mutex &mutex): mutex{mutex} { mutex.zámek(); } ~Zámek() { mutex.odemknout(); }};
Původní rozhraní C lze považovat za náchylné k chybám, zejména v případě, kdy uživatelé knihovny zapomenou odemknout již uzamčený mutex. Nové rozhraní efektivně využívá RAII (získávání zdrojů je inicializace) v novém Mutex a Zámek třídy zajistit Mutexs jsou nakonec odemčeny a pthread_mutex_t objekty se automaticky uvolní.
Výše uvedený kód úzce napodobuje implementaci boost :: scoped_lock a boost :: mutex které jsou součástí boost :: vlákno knihovna.
Obálky řidiče
Cross-language / runtime interoperability
Některé obálkové knihovny existují jako most mezi klientskou aplikací a knihovnou napsanou pomocí nekompatibilní technologie. Například a Jáva aplikace možná bude muset provést systémové volání. Systémová volání jsou však obvykle vystavena jako funkce knihovny C. K vyřešení tohoto problému Java implementuje obálkové knihovny, díky nimž lze tato systémová volání volat z aplikace Java.
Za tímto účelem poskytují jazyky jako Java mechanismus s názvem rozhraní cizí funkce to umožňuje. Mezi příklady těchto mechanismů patří:
- Nativní rozhraní Java (JNI)
- Java Native Access (JNA)
- Knihovna cizích funkcí pro Python
- Spravovaná rozšíření
- SWIG (zjednodušený obal a generátor rozhraní)
Existující souhrnné knihovny
Některé příklady existujících souhrnných knihoven: