Использование подобия паттерна наблюдатель на си

от автора

Недавно вспоминал о том как читал книгу по паттернам проектирования для java и из-за того что я всё также не пойму как это делается по памяти в ооп, решил написать свою реализацию на си.

Я решил посмотреть ещё раз в этой книге по java как реализуется этот паттерн. Полистал всю главу, посмотрел код, но в голове ничего не отложилось. Почему так? ) Правильно ли мыслить в стиле ооп? Например я знаю немного java и c++, но насколько удобно можно сделать реализацию так, чтобы ей было приятно пользоваться и не забывалось? Также для эксперимента я посмотрел как это делается на c++. Ну честное слово, на такой код мне сложно смотреть, надо вчитываться в каждую строку и думать.

Так что же я сделал, что мне может пригодиться в будущем в программировании? Встречайте, реализация на github. Хочу объяснить простоту использования того что я написал. В этой реализации не нужно создавать структуру, которая будет хранить данные. Сама же основная структура находится за кулисами. Например я хочу подписаться в одном файле на издателя TRADE. Этот издатель например будет мне предоставлять скидки по товару. Я рассматриваю наблюдателя как обычную функцию и объявляю её согласно правилу.

void sub_trade ( void *event, void *data ) {   /* здесь выводиться к примеру новые скидки на экран. */ } 

Теперь я хочу создать издателя и подписаться на события. В данном случае ничего лишнего вызывать не нужно. Надо только указать к какому издателю передать подписчика.

enum { TRADE }; init_publisher ( TRADE, sub_trade, NULL ); 

И всё. мы подписались на издателя. Теперь в другом файле я например хочу сделать рассылку в онлайн чате. Я не знаю как удобно было бы это сделать в ооп, да тем более на java, но с помощью моей реализации это делается просто. Да кстати, на java наверное пришлось бы использовать статические методы.
Я объявляю ещё функцию подписчика.

enum { TRADE }; void notify_chat_trade ( void *event, void *data ) {   /* здесь я рассылаю сообщения в чат */ } ... init_publisher ( TRADE, notify_chat_trade, NULL ); 

Теперь в файле где происходит получение и парсинг новых данных, приходят данные о скидках. Мне всего лишь нужно вызвать такую функцию и данные передадутся куда надо.

/* для простоты я передал число 10, но конечно нужно отправлять специальные данные. */ send_event ( TRADE, 10 ); 

Вот так вот удобно и просто без сложностей использования можно получить нужный результат. Я думаю у меня хорошо получилось.

Кстати, кто может мне объяснить, это структурное программирование или процедурное?


ссылка на оригинал статьи https://habr.com/ru/post/483520/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *