Мне поручено помочь в разработке динамической библиотеки (предоставляемой с интерфейсом C), предназначенной для использования в программном обеспечении для встраивания на различных платформах встраивания (Android, Windows, Linux).
Основными требованиями являются скорость и развязка. Для развязывающей части: одно из наших требований заключается в том, чтобы иметь возможность облегчить интеграцию и обеспечить обратную совместимость и устойчивость.
В моей библиотеке есть несколько точек входа, которые должны вызываться интегрирующим программным обеспечением (например, конструктор инициализации для предоставления опций, где вести журнал, как себя вести и т. Д.), А также может вызывать некоторый обратный вызов в приложении. (событие, информирующее о завершении задачи).
Итак, я пришел с несколькими предложениями, но, поскольку каждое из них не кажется хорошим, я ищу совет о лучших или стандартных способах достижения развязки и обратной совместимости, чемэто 3 способа, которые я нашел:
Первый вариант, о котором я мог бы подумать, - это создать общий интерфейсный вызов для моих открытых точек входа, например, с хэш-картой ключей / значенийдля параметров моих функций, поэтому в псевдокоде это дает что-то вроде:
myLib.Initialize (Key_Value_Option_Array_Here);
Другой вариант - предоставить универсальную функцию для предоставлениявсе параметры библиотеки:
myLib.SetOption (Key_Of_Option, Value_OfOption);myLib.SetCallBack (Key_Of_Callbak, FunctionPointer);
Когда я представлял свой вариант, мой коллега спросил меня, почему бы не использовать аргумент google protobuf в качестве интерфейса между библиотекой и программным обеспечением для встраивания: но это кажется страннымдля меня, так как это будет ударом производительности при каждом вызове для сериализации и десериализации.
Есть ли более эффективный или стандартный способ, о котором вы могли бы подумать?