Pull to refresh

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

Reading time2 min
Views3K
Недавно вспоминал о том как читал книгу по паттернам проектирования для 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 );

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

Кстати, кто может мне объяснить, это структурное программирование или процедурное?
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 16: ↑1 and ↓15-14
Comments30

Articles