2016-09-22 2 views
0

Я даже не уверен, как правильно сформулировать вопрос об этом.Скрытие деталей реализации при передаче данных вокруг

Я пишу библиотеку, где у меня есть несколько реализаций (несколько библиотек из одного). Я хочу скрыть как можно больше, если не все, детали реализации из клиентского приложения, чтобы написать приложение, не считаясь с деталями реализации.

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

Детали строения важны ТОЛЬКО для функций библиотеки. Из-за этого мне не нужно видеть или прикасаться к ним из клиентского приложения.

Итак, есть ли способ скрыть детали структуры из клиентского приложения и по-прежнему иметь возможность использовать его или если есть другой способ сделать это с помощью какой-либо формы инкапсуляции или, возможно, даже каких-то данных (globals?), Видимых только в библиотеку?

Вот мой хромой пример иллюстрации с кодом:

/* 
library_private.h 
*/ 
#if (A) 
{ 
    struct mystruct_t { 
     A *something; 
    } 
} 
#else 
    struct mystruct_t { 
     B *something; 
    } 
#endif 

/* 
library_public.h 
*/ 
struct mystruct_t; 

/* 
library.c 
*/ 
struct mystruct_t* create() { 

    struct mystruct_t *handle = malloc(sizeof(struct mystruct_t)); 

    return handle; 
} 

/* 
client.h 
*/ 

struct mystruct_t; 
/* but, I need a definition, so I have to repeat either from library_private.h */ 

/* 
client.c 
*/ 

int main(int argc, char const *argv[]) { 

    struct mystruct_t *handle = create(); 

    /*...*/ 

    something(handle); 

    return 0; 
} 

ответ

0

Cast к ничтожной *, когда возвращение и обратно структуры mystruct_t только после прохождения в функцию. Это не очень удобно, так как вы потеряете часть проверки типа компилятора.

+0

Хорошо, это похоже на вариант и работает. Я посмотрю, есть ли лучшие варианты перед закрытием. Благодаря! – Keyframe

+0

Я бы не рекомендовал это. Я подозреваю, что вероятность передачи неправильной 'void *' в неправильную функцию * намного * больше, чем« случайно »доступ к структуре, когда вы пытаетесь не делать этого. – EOF

+0

Что бы вы порекомендовали затем сохранить данные между вызовами библиотеки и в то же время скрыть специфику реализации от клиента и избежать глобальных библиотек? – Keyframe

0

client.c (или client.h) должен включать library_public.h. Нет необходимости в определении структуры. Только его объявление struct mystruct_t; достаточно, чтобы использовать указатели на структуру. Конечно, вы не можете получить доступ к своим членам, но это именно то, что вы хотите в этом случае.

Смежные вопросы