Четверг, 28 Марта 2024, 22:10

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » C/C++ » реализация издателя и подписчика на си.
реализация издателя и подписчика на си.
afqДата: Суббота, 11 Января 2020, 02:41 | Сообщение # 1
Разработчик
Сейчас нет на сайте
Написал я в общем это. На си мне как то больше нравиться как выглядит код, чем в ооп. Вдруг кому нужно, пожалуйста, скачивайте publisher

этот код работает глобально. то есть если есть один издатель TRADE, то он будет во всей программе. Можно из любой части получить данные от издателя. Имеется несколько функций упрощающее управление издателем. Можно например отписаться подписчику с определенными данными, а можно отписаться подписчику со всеми данными. То есть подписчик это функция. с помощью функции init_publisher можно указать к какому подписчику отправлять события. Можно подписаться одному и тому же подписчику с разными данными. Есть функция, которая убирает сразу подписчика со всеми данными. А есть функция, которая убирает всех подписчиков.
afqДата: Суббота, 11 Января 2020, 08:33 | Сообщение # 2
Разработчик
Сейчас нет на сайте
Захотелось даже статью на хабре написать. ))) habr

там я вроде объяснил чем удобно программирование на си с помощью такого паттерна наблюдателя.
afqДата: Воскресенье, 12 Января 2020, 08:08 | Сообщение # 3
Разработчик
Сейчас нет на сайте
Блин, на хабре минусуют статью как всегда. )

Я ещё видео записал, только наверное плохо обдумал архитектуру примера. Но всё же пример рабочий. Я сделал так, что после каждого отправления события, очищаются данные. Но в реальном приложении такие данные врядли надо чистить. они наверное должны храниться в памяти или в базе данных. Посмотрите пожалуйста и напишите ваше мнение о таком способе, правильно ли я делаю или не правильно. Может советы какие нибудь. Может я что-то для себя интересное открою читая ваши комментарии.
drcrackДата: Воскресенье, 12 Января 2020, 09:24 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата
Блин, на хабре минусуют статью как всегда. )

так тебе в комментах пытаются обьяснить почему статья говно и что возможно стоит набраться опыта прежде чем учить других, так нет, ты еще и споришь с ними:

Такое впечатление что вы просто хейтите мою статью. Заказной хейт какой-то. Еще вы так пишете, будто от вас ничего не зависит и на компьютер вся надежда. Вы что, не знаете что вы делаете?

заказной хейт, серьезно?..


Сообщение отредактировал drcrack - Воскресенье, 12 Января 2020, 09:24
afqДата: Воскресенье, 12 Января 2020, 09:51 | Сообщение # 5
Разработчик
Сейчас нет на сайте
drcrack, да не. там единицы написали, не все такие. не знаю даже почему ты встал на их сторону, на сторону меньшинства. что там профи такие чтоли сидят? которые бояться без компилятора ошибок наделать. они возможно и не поняли в чем плюс такого подхода. и пишут свои js программы. это же веб разработчики. они не шарят в си программировании и указывают на недостатки си языка, типа их язык лучше, что типа на их языке это можно реализовать без всяких проблем, с которыми можно столкнуться в поем языке. ты же сам знаешь что на си и c++ можно отстрелить себе ногу ( как говориться ). как можно набираться опыта у js программиста, который учит не как на си это делать, а как это выглядит на js. ты хоть смотри с кем я спорю.
afqДата: Воскресенье, 12 Января 2020, 10:23 | Сообщение # 6
Разработчик
Сейчас нет на сайте
drcrack, видишь что я ему написал, посмотрим какой он ответ даст.
Цитата
А почему вы мне показываете как это делается на js? Почему вы сишника учите программировать, если сами показываете код на js. Если хотите показать как надо правильно делать, то пишите на си. То же мне, показывает как это удобно делается на js. Как будто статья про js.
drcrackДата: Воскресенье, 12 Января 2020, 10:47 | Сообщение # 7
старожил
Сейчас нет на сайте
Ну ты за это просто еще отхватишь минусов, и так и будешь плавать в этих минусах, пока не поумнеешь и не осознаешь что ты, вероятно, не самый опытный в мире программист на Си, а чтобы учить других как использовать паттерны, надо самому поработать в большой команде, где это актуально.

Цитата
которые бояться без компилятора ошибок наделать.

Все что может быть проверено компилятором, должно быть проверено компилятором
Риск человеческих ошибок должен быть сведен к минимуму, это основной вектор развития всех актуальных языков программирования

Цитата
как можно набираться опыта у js программиста, который учит не как на си это делать, а как это выглядит на js.

С другой стороны, как можно набираться опыта у Си программиста, который не может на OpenGL нарисовать квадрат?


Сообщение отредактировал drcrack - Воскресенье, 12 Января 2020, 10:50
XakepДата: Воскресенье, 12 Января 2020, 14:32 | Сообщение # 8
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата afq ()
drcrack, да не. там единицы написали, не все такие. не знаю даже почему ты встал на их сторону, на сторону меньшинства. что там профи такие чтоли сидят? которые бояться без компилятора ошибок наделать. они возможно и не поняли в чем плюс такого подхода. и пишут свои js программы. это же веб разработчики. они не шарят в си программировании и указывают на недостатки си языка, типа их язык лучше, что типа на их языке это можно реализовать без всяких проблем, с которыми можно столкнуться в поем языке. ты же сам знаешь что на си и c++ можно отстрелить себе ногу ( как говориться ). как можно набираться опыта у js программиста, который учит не как на си это делать, а как это выглядит на js. ты хоть смотри с кем я спорю.

Одно дело, когда ты пишешь хелловорлды, другое дело, когда ты участвуешь в разработке крупного проекта, где цена ошибки может стоить компании миллионов $ (а тебе может это стоить работы). Над подобными проектами работает не один разработчик, а десятки, сотни и тысячи разработчиков, в числе которых новоиспеченные джуниоры. Кодовая база может исчисляться миллионами строк кода. То что в комментариях написано - вполне уместные замечания, а вот твоя реакция уже не адекватная, потому тебя и минусуют.

Цитата afq ()
и пишут свои js программы. это же веб разработчики. они не шарят в си программировании и указывают на недостатки си языка

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

Цитата afq ()
ты же сам знаешь что на си и c++ можно отстрелить себе ногу ( как говориться ).

потому-то эти языки многие и не любят, в том числе и люди, которые на них пишут.


Сообщение отредактировал Xakep - Воскресенье, 12 Января 2020, 14:34
SharpSolarisДата: Воскресенье, 12 Января 2020, 19:01 | Сообщение # 9
был не раз
Сейчас нет на сайте
Предположу, что почти любой свой велосипед на хабре вызывает негативную реакцию. Если я правильно понял, ты предлагаешь альтернативную реализацию известного паттерна. Но зачем? Это же идет в разрез с принципами промышленного кодирования, где чем шаблонее будет код, тем лучше. А любой велосипед заведомо вызывает негатив. У нас на работе такое называют "код с загонами". Возможно, если бы ты разжевал, как реализовать этот паттерн "по науке", подчерпнув информацию из какой-нить авторитетной книжки, статью на хабре приняли бы положительно. Короче, моя теория в том, что творческий подход не приветствуется среди жителей хабра :D
afqДата: Воскресенье, 12 Января 2020, 20:37 | Сообщение # 10
Разработчик
Сейчас нет на сайте
Цитата
С другой стороны, как можно набираться опыта у Си программиста, который не может на OpenGL нарисовать квадрат?

drcrack, я могу, только с количеством вершин ошибся. а ты что-ли можешь то сам? я так понимаю что ты на unity решил программировать, потому что не хочешь знать как это всё изнутри работает. ты как бы программируешь логику игры, а не саму игру. не знаю, возможно тебе стоит самому попробывал делать свой движок, чтобы отучиться писать такие комментарии.
Цитата
Язык программирования - это инструмент в первую очередь, принципы, подходы и алгоритмы в программирования все равно остаются одними и теми же

не совсем верно. подход другой у языков. ты например не можешь с помощью шаблонов на си программировать, а в c++ можешь и т.д. на каждом языке задачи решаются по разному. от тех кого я слышу что язык всего лишь инструмент обычно знают несколько языков, да и то не очень хорошо. и задачи решают обычно на том, в котором легче всего решить. то есть у тебя такой уровень знаний языка, что ты например не можешь сделать программу по картографии на си, но зато ты можешь это сделать на python с уже готовой библиотекой. я бы лучше делал это на си, чтобы скилл рос, а не пользоваться языком как инструментом.
Цитата
И что с того, что это веб разработчики, они не программисты чтоле?

Да как ты не поймешь, они указывают на недостаток языка си и показывают как это делается на их языке. это похоже на то, что вообще абсурдно писать на си, что компилятор не может проверить такие вещи, которые в си дают универсальность.
Цитата
Поэтому нужно учиться программировать, а не учить языки программирования.

Вот, вот это правильно. учишь один язык и реализуешь на нем всё и не сворачиваешь с пути.
Цитата
другое дело, когда ты участвуешь в разработке крупного проекта, где цена ошибки может стоить компании миллионов $ (а тебе может это стоить работы).

Да какой там. хочешь сказать что в моей программе могут ошибиться программисты на си, которые живут программированием? как вообще можно ошибиться и подписаться на издателя, который определен в определенном файле. знаешь, я изучаю как новый код, так и старый код разных программ. есть специальная лицензия, которая объясняет что автор не несет ответственности за программу. и кстати, я изучаю еще код, где были найдены уязвимости, хотя не могу все равно понять где эта уязвимость, может ее пофиксили. и знаешь, с моей программой не справился бы только какой нибудь тупой не программист. чтобы сделать такую реализацию, нужно было написать не мало строчек кода, но зато теперь можно пользоваться. ну и конечно же ты можешь показать как это сделать на java. вот например в java каждый класс в отдельном файле да. тебе надо сделать так. чтобы в одном файле ты подписался на издателя. в другом файле подписался на издателя. в другом файле отправил событие и два файла получили это событие. чтобы этот способ был универсальным. чтобы не нужно было переделывать издателя, ну подстраивать под новый проект. вот я такое сделал. в моем случае написал один раз, используешь везде. потому что издателю можно передать любой тип. эти с хабра пишут что тип нельзя проверить. ну и что. ты что не знаешь какие данные будешь передавать? это тупо троллинг. вон например в glib. есть такая функция g_signal_connect, сюда ты можешь подключить либо g_object, либо gtk виджет. также отправить данные свои, вот здесь тип не проверяется, оно и правильно, потому что функция сделана так, чтобы ей можно было пользоваться сколько угодно и в любых проектах.
Цитата
Это же идет в разрез с принципами промышленного кодирования, где чем шаблонее будет код, тем лучше. А любой велосипед заведомо вызывает негатив.

ну в моем случае готовых библиотек для си нет. проще уже самому это сделать чтобы пользоваться. я лишь хотел показать удобство использования подобия паттерна, заметь я написал подобия, а не паттерна. но все всё равно пишут что я паттерн имел ввиду. тупость.
afqДата: Воскресенье, 12 Января 2020, 21:14 | Сообщение # 11
Разработчик
Сейчас нет на сайте
drcrack, а, или ты имел ввиду не квадрат, а куб? ну да, куб я не могу нарисовать. не знаю почему. но я хотя бы стараюсь.
drcrackДата: Воскресенье, 12 Января 2020, 21:39 | Сообщение # 12
старожил
Сейчас нет на сайте
Цитата
я так понимаю что ты на unity решил программировать, потому что не хочешь знать как это всё изнутри работает.

Я прекрасно знаю как это все работает, в свое время писал на c++ под dx11, так что не надо тут

Цитата
как вообще можно ошибиться

Ты же как-то ошибся когда вершины считал, хотя есть документация и примеры
Вот так же могут ошибиться и те, кто придет программировать в твой проект
Но ты вряд ли это поймешь пока не столкнешься лично
А когда поймешь, тогда и пересмотришь свои взгляды на подобные "паттерны"


Сообщение отредактировал drcrack - Воскресенье, 12 Января 2020, 21:41
afqДата: Воскресенье, 12 Января 2020, 21:51 | Сообщение # 13
Разработчик
Сейчас нет на сайте
drcrack, ну раз ты программировал на c++, то как бы знаешь и си. И я как понял что ты тоже считаешь что у меня плохая реализация. Тогда видимо у тебя тоже есть опыт. Вот я и написал в начале сообщение о том, что рад услышать советы и т.д. Тогда напиши мне на си, как сделать не реализацию, а функции, которые можно использовать типа готовых. Ну напиши как должна выглядеть функция, ну какие параметры должна получить и всё. То есть например у меня функция выглядит так.
Код

init_publisher ( int type, void (*callback) (void *event, void *data), void *data );

здесь я указываю номер издателя, функцию указатель, и пользовательские данные.
а вот так я отправляю события.
Код

send_event ( int type, void *event );

А как ты считаешь надо сделать, чтобы можно было объявить нескольких издателей и нескольких подписчиков? У меня например мышление такое, что я сделал так. Но разные люди по разному мыслят. И поэтому я рад вашим вариантам. И так я посмотрю какой вариант лучше. Но пока я считаю что мой вариант правильный.
XakepДата: Воскресенье, 12 Января 2020, 21:57 | Сообщение # 14
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата afq ()
не совсем верно. подход другой у языков. ты например не можешь с помощью шаблонов на си программировать, а в c++ можешь и т.д.

Шаблоны решают определенную проблему, которую между прочем можно также реализовать и на си через макросы, если ты не знал. Да сделать проверку на типы будет сложнее и больше будет бойлерплейта, но тем не менее - это возможно. И кто мне к примеру запретит писать на Си в функциональном стиле? Я все также могу насоздавать себе монад и писать только чистые функции. Да даже тот же GLSL может предоставить новые подходы к решению задач, которые потом можно использовать и в Си.

Цитата afq ()
от тех кого я слышу что язык всего лишь инструмент обычно знают несколько языков, да и то не очень хорошо

Хорошие разработчике обычно и знают больше одного языка программирования, потому-что под определенные задачи, те или иные языки лучше подходят.

Цитата afq ()
то есть у тебя такой уровень знаний языка, что ты например не можешь сделать программу по картографии на си, но зато ты можешь это сделать на python с уже готовой библиотекой. я бы лучше делал это на си, чтобы скилл рос, а не пользоваться языком как инструментом.

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

Цитата afq ()
учишь один язык и реализуешь на нем всё и не сворачиваешь с пути

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

Цитата afq ()
Да какой там. хочешь сказать что в моей программе могут ошибиться программисты на си, которые живут программированием? как вообще можно ошибиться и подписаться на издателя, который определен в определенном файле

Видимо вы никогда не работали в крупном проекте, раз говорите подобное, во первых - в проекте могут работать не только программисты на си, которые живут программированием, но также и джуны, которые только из универов вышли, во вторых, в проекте с миллонами сторк кода, можно не удержать всех моментов в голове, пусть ты даже гений. Даже разработчик, написавший этот код, спокойно может допустить очень глупую ошиюку. Типы помогают не только гарантировать определенного рода безопасность, но и являются своего рода документацией к коду. И интересно, что бы вы сказали об этом, если бы на кону были бы не просто пара багов у пользователей (ну или не пара, как повезет), а человеческие жизни, либо миллионы долларов пользователей, я писал код для финансовых организаций и это тот еще стресс, даже 100% покрытие тестов не позволяет быть уверенным на сто процентов, что баланс не будет нарушен.

Цитата afq ()
есть специальная лицензия, которая объясняет что автор не несет ответственности за программу

Это здесь вообще при чем? У нас рассуждение не о лицензиях, а о программировании в целом, в данном случае твое решение даже использовать не захотели и написали почему, тебе может подобное решение нравится, и в принципе все ок, но не нужно говорить, что оно лучше других остальных, особенно, если сам совсем не разбираешься ни в ООП, ни в типах, да и банально какие есть подходы к реализации данного паттерна и какие у них плюсы и минусы.

Цитата afq ()
чтобы сделать такую реализацию, нужно было написать не мало строчек кода, но зато теперь можно пользоваться

У тебя там 200 строк, это очень не много, я видел функции, которые состояли из большего количества кода.

Цитата afq ()
ну и конечно же ты можешь показать как это сделать на java

На Java я предпочту не велосипедить подобное, потому-что уже есть отличные реализации в виде RxJava, либо Reactor, которые решают в полной мере все мои хотелки и которые проверены временем. При этом я получаю - безопасность типов, большое количество реализованных операторов, потоко-безопасность, возможность легко распараллеливать свои стримы итд итп. Я конечно же могу и сам навелосипедить подобное, но зачем? Я мог бы это сделать, разве что для самообразования, но в продакшн подобное решения я бы вряд ли пустил.

Цитата afq ()
java каждый класс в отдельном файле да

нет

Цитата afq ()
тебе надо сделать так. чтобы в одном файле ты подписался на издателя. в другом файле подписался на издателя. в другом файле отправил событие и два файла получили это событие. чтобы этот способ был универсальным. чтобы не нужно было переделывать издателя, ну подстраивать под новый проект. вот я такое сделал

Не стоит говорить - как надо сделать в java, если сам не умеешь и не понимаешь java'у.

Цитата afq ()
это тупо троллинг

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

Цитата afq ()
вон например в glib. есть такая функция g_signal_connect, сюда ты можешь подключить либо g_object, либо gtk виджет. также отправить данные свои, вот здесь тип не проверяется, оно и правильно, потому что функция сделана так, чтобы ей можно было пользоваться сколько угодно и в любых проектах.

не всегда универсально - значит лучше, иногда конкретное решение, для конкретной задачи намного лучше, чем универсальное решение для любой задачи. Если так хочется универсальности, то не тот язык вы вырали, вам бы лучше js подошел бы.

В принципе это нормально использовать void*, особенно в Си, я и сам так иногда делаю, все опять же сильно зависит от задачи и от контекста, если у тебя один publish и пара subscriber'ов, то и нечего боятся, но ситуация может сильно измениться, если у тебя сотни publisher'ов и миллионы подписчиков (какойнить веб сервис).
afqДата: Воскресенье, 12 Января 2020, 22:25 | Сообщение # 15
Разработчик
Сейчас нет на сайте
Xakep, ну а как бы ты сделал, какие бы функции были бы доступны для использования издателя и подписчика? Какие бы ты функции определил? Я так понимаю вы все можете писать о том, что плохая реализация, а сами то как бы сделали? Разумеется нужна универсальность, чтобы не писать реализацию каждого издателя заново. Надо ведь написать такой способ, чтобы разработчик уже только использовал эти функции.
XakepДата: Воскресенье, 12 Января 2020, 22:26 | Сообщение # 16
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата afq ()
Вот я и написал в начале сообщение о том, что рад услышать советы

Для начала определись - что у тебя за задача, обычно на Си не прибегают к реализации паттерна как библиотеки / набора функций, чтобы потом это везде использовать, это скорее больше к ООП относится - инкапсулировать всю логику работы publish/subscribe и предоставить только интерфейс.

Цитата afq ()
Тогда напиши мне на си

Почему мы должны писать за тебя на Си? Мы можем предложить свои какие-то идеи, ты можешь попытаться их реализоват, либо проигнгорировать, пообсуждать что-то, поизучать вопрос (с той же типо-безопасностью).

Добавлено (12 Января 2020, 22:28)
---------------------------------------------

Цитата afq ()
а сами то как бы сделали?

Я не знаю, как бы я делал, начнем с того, что я бы не стал данный паттерн на Си реализовывать в общем виде для универсального использования.

Добавлено (12 Января 2020, 22:30)
---------------------------------------------
если тебе именно интересно - как добавить типобезопасность в твою библиотеку, то это уже немного другое, могу придумать какунить магию на макросах.

afqДата: Воскресенье, 12 Января 2020, 22:31 | Сообщение # 17
Разработчик
Сейчас нет на сайте
Xakep,
Цитата
Почему мы должны писать за тебя на Си?

За меня на си не надо писать. Я сделал нормальную реализацию. Но если вы считаете что она не правильная, то где правильная, где пруфы, что на си можно сделать правильней?
Цитата
Мы можем предложить свои какие-то идеи, ты можешь попытаться их реализоват,

Ну так я об этом и написал. Пиши как выглядеть должна функция, чтобы использовать нескольких издателей. Да и для библиотеки это не подходит. Если память будет выделяться на стороне библиотеки, то другой кто будет использовать эту библиотеку, то получит доступ к этим данным.
XakepДата: Воскресенье, 12 Января 2020, 22:44 | Сообщение # 18
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата afq ()
За меня на си не надо писать. Я сделал нормальную реализацию. Но если вы считаете что она не правильная, то где правильная, где пруфы, что на си можно сделать правильней?

одна и та же реализация в разных условиях и в разных системах может быть правильно и не правильной, все зависит от требований и свойств данной системы. Поэтому рассуждения о правильности/неправильности считаю не уместными.

Выше я уже писал:

Цитата Xakep ()
Я не знаю, как бы я делал, начнем с того, что я бы не стал данный паттерн на Си реализовывать в общем виде для универсального использования.

если тебе именно интересно - как добавить типобезопасность в твою библиотеку, то это уже немного другое, могу придумать какунить магию на макросах.


А большую тираду я написал, только потому, что меня возмутила ваша реакция на критику и интересное предложение по добавлению типобезопасностей, вместо того, чтобы подумать над этим, вы решили начать называть всех хейтерами, троллями и возмущаться что не си программист что-то там пишет си программисту, да что он вообще может знать ))
drcrackДата: Понедельник, 13 Января 2020, 10:26 | Сообщение # 19
старожил
Сейчас нет на сайте
Цитата
Вот я и написал в начале сообщение о том, что рад услышать советы и т.д.

Самый главный совет — если тебе на си вообще понадобился такой паттерн, ты, скорее всего, выбрал не тот язык для своей задачи.
Писать бизнес логику на Си так же смешно, как делать сайты на турбо паскале
Но тебе конечно пофиг, ты ж фанатик, уперся рогом в свой си и будешь грызть кактус пока не выйдешь на пенсию, так что делай что хочешь
Только не стоит учить других паттернам, если весь твой опыт — 10 заброшенных пет проектов


Сообщение отредактировал drcrack - Понедельник, 13 Января 2020, 10:28
afqДата: Понедельник, 13 Января 2020, 11:44 | Сообщение # 20
Разработчик
Сейчас нет на сайте
drcrack,
Цитата
Только не стоит учить других паттернам

Захочу ещё статью напишу. ) И заброшенные проекты тут не причем.
Форум игроделов » Программирование » C/C++ » реализация издателя и подписчика на си.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг