Имеется реализация на си для встраивания в проект. Не подходит как библиотека. Надо именно добавлять эти файлы в проект. Я читал книгу по java по паттернам и мне понравился паттерн наблюдатель. Я захотел создать нечто подобное на си. Ну как нечто подобное, чтобы можно было подписаться и получать события. Сама структура создается только в этой реализации, она общая для всей программы. То есть можно из любой точки программы подписаться на издателя. И в любой точке программы можно отправить событие от издателя. Мне пишут что мол можно ошибиться, в указании типа ( type ). Я говорю что можно завести отдельный хедер файл и указать в enum названия издателей. Но мне пишут что это плохо, что программисты будут ошибаться всё равно. Но как только я предлагаю написать нечто подобное на си, то сразу никто не может. Язык плохо знают. Сами пишут на другом языке и показывают как это должно работать. Но я хотел создать универсальные функции, чтобы один раз написал и много раз использовать без переделки кода. Вот раз никто не может показать как правильно сделать на си, то решил задать вопрос здесь. Мне нужно только увидеть объявления функций, без их реализации. Я хочу посмотреть, можно ли сделать лучше, чем есть у меня. Вот проект на
github
Вот какие есть функции в заголовке.
/*
* init_publisher - инициализировать издателя.
* @type = это тип издателя. Например в enum указывает enum { TRADE, NEWS }, к каждому издателю можно подписаться нескольким функциям.
* @subscribe = это функция указатель. в эту фукнцию издатель будет отправлять события и данные.
*/
void init_publisher ( int type, void (*subscribe) (void *event, void *data), void *data );
/*
* отправить событие.
* @type = если например в init_publisher вы задали TRADE, то в send_event в TRADE отправяться событие, которое вы укажите.
* @event = событие. можно передать любые данные.
*/
void send_event ( int type, void *event );
/*
* отписаться от издателя.
* @type = тип издателя.
* @subscribe = функция указатель. её надо указать, чтобы в этом типе удалить эту функцию от подписки.
* @data = указатель на данные. удалиться подписчик именно с этими данными.
*/
void delete_publisher ( int type, void (*subscribe) ( void *event, void *data ), void *data );
/*
* удалить всех подписчиков связанных с данной функцией. */
void delete_all_subscribe ( int type, void (*subscribe) ( void *event, void *data ) );
/* удалить абсолютно всех подписчиков привязанных к определенному издателю. */
void delete_all_publisher ( int type );