In large-scale projects different teams use API functions developed by another team or a third-party vendor. For example:
int retrievePerson (int key, Person& recordToBefilled); // original version; used by all teams
A problem can arise when the interface of an API is modified by the implementer; all of its users have to track down every reference to it, and modify the code accordingly.
int retrievePerson (const char * key, Person& recordToBefilled); // string key instead of int
To avoid such dependencies, you should wrap the API by a wrapper, rather than call it directly. A wrapper is a simple function that calls the third party’s API and returns its result. (Don’t worry about the overhead of an additional function call?most compilers will inline it anyway):
int WrapRetrievePerson(int key, Person& recordToBefilled) {retrurn retrievePerson (int key, Person& recordToBefilled); // call the API }
This is very similar to “getters” and “setters” in a C++ class. A wrapper provides a stable interface to an API that is vulnerable to modifications. When an API’s interface is changed, only the implementation of its corresponding wrapper has to be modified accordingly, without affecting the programs that call the wrapper:
int WrapRetrievePerson(int key, Person& recordToBefilled) //wrapper interface remains intact{ //wrapper's implementation modified according to API's modificationchar strkey[100];itoa (key, strkey); //convert ant int to its corresponding decimal stringreturn retrievePerson (strkey, Person& recordToBefilled); }