Wrapper-biblioteket - Wrapper library
Inslagningsbibliotek (eller biblioteksomslag) består av ett tunt lagerskikt (ett " shim ") som översätter ett biblioteks befintliga gränssnitt till ett kompatibelt gränssnitt. Detta görs av flera skäl:
- Förfina ett dåligt utformat eller komplicerat gränssnitt
- Låt koden fungera tillsammans som annars inte kan (t.ex. inkompatibla dataformat)
- Aktivera interoperabilitet mellan olika språk och / eller runtime
Omslagsbibliotek kan implementeras med adapter , fasad och i mindre utsträckning proxy- designmönster .
Innehåll
Struktur och implementering
Det specifika sättet på vilket ett omslagsbibliotek implementeras är mycket specifikt för den miljö det skrivs i och de scenarier som det avser att ta itu med. Detta gäller särskilt när interoperabilitet mellan olika språk / runtime är en övervägande.
Exempel
Följande ger en allmän illustration av en gemensam omslagsbiblioteksimplementering. I detta exempel fungerar ett C ++ -gränssnitt som ett "omslag" runt ett C-språkgränssnitt.
C-gränssnitt
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 ++ omslag
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();
}
};
Det ursprungliga C-gränssnittet kan betraktas som felaktigt, särskilt i fall där användare av biblioteket glömmer att låsa upp en redan låst mutex. Det nya gränssnittet använder effektivt RAII (Resource Acquisition is Initialization) i de nya Mutex- och Lock- klasserna för att säkerställa att Mutex s så småningom låses upp och pthread_mutex_t- objekt släpps automatiskt.
Ovanstående kod efterliknar implementeringen av boost :: scoped_lock och boost :: mutex som är en del av boost :: thread- biblioteket.
Föraromslag
Interoperabilitet mellan olika språk / runtime
Vissa omslagsbibliotek finns för att fungera som en bro mellan en klientapplikation och ett bibliotek skrivet med en inkompatibel teknik. Till exempel kan en Java- applikation behöva köra ett systemsamtal . Emellertid exponeras systemsamtal som C-biblioteksfunktioner. För att lösa problemet implementerar Java omslagsbibliotek som gör att dessa systemsamtal kan kallas ut från en Java-applikation.
För att uppnå detta ger språk som Java en mekanism som kallas främmande funktionsgränssnitt som gör det möjligt. Några exempel på dessa mekanismer inkluderar:
- Java Native Interface (JNI)
- Java Native Access (JNA)
- Ett främmande funktionsbibliotek för Python
- Hanterade tillägg
- SWIG (förenklad inpackning och gränssnittsgenerator)
Befintliga omslagsbibliotek
Några exempel på befintliga omslagsbibliotek: