Kartonagnick
> А я вот просто уверен, что прежде чем назначить потребителю поставщика тебе
> придется понять, что именно хочет потребитель, и что именно предоставляет
> поставщик. Тююю...
Лол. Над чем смеетесь?
Зная сигнатуру, я уже сужаю круг методов.
Kartonagnick
> А теперь представь себе, что в проекте множество компонентов, с множеством
> методов.
И чем ваш тут коннектор поможет? Когда эти компоненты должны еще и во время исполнения подгружаться согласно конфигам? Да модули будут еще не одинаковыми компиляторами собраны?
Нее, тут рулит исключительно эмуляция динамики поверх чистейшей статики. А type_info и динамик касты идут лесом.
Kartonagnick
> У земли два метода, возвращающие int. Какой именно?
Тот который нам нужен, очевидно.
Kartonagnick
> Ты почему то думаешь, что потребитель по дефолту сожрет все что угодно, лишь бы
> оно отвечало протоколу делегата.
А почему должно быть по другому?
Kartonagnick
> Программисту 1й точки нужно совершенно четко осознавать какие услуги он
> определяет для потребителей.
Нет же, главный поинт делегатов как раз в том, что никто ни о ком ничего не знает. Мы передаем кому-то std::function, кто-то ее когда-нибудь дергает.
Kartonagnick
> Один из методов может вернуть погоду в мире. А другой - остаток жратвы. А
> третий ещё что то.
> Что получится, если роботу назначат погоду вместо жратвы?
Боретесь с проблемами которые сами же и сделали? Понятно....
Chaos_Optima
> а причём тут костыльная архитектура?
Ну давай поговорим за архитектуру.
Я знаю две схемы связей с делегами. Все они имеют свои плюсы и минусы:
Grey304
> Лол. Над чем смеетесь?
> Зная сигнатуру, я уже сужаю круг методов.
А я вот ничего не сужаю. Я сразу знаю. И наверняка. И что уже писал выше и неоднократно: программирование с делегатами, это программирование в терминах протокола передачи данных, а не сигнатуры. Плевать на сигнатуру. Ложить сверху и сприбором. Она никак делу не помогает.
++i++
> Тот который нам нужен, очевидно.
Как ты определишь какой именно метод тебе нужен, Кэп?
++i++
> Нет же, главный поинт делегатов как раз в том, что никто ни о ком ничего не
> знает. Мы передаем кому-то std::function, кто-то ее когда-нибудь дергает.
А кто решает, и в какой момент принимается это решение: чем заправить делегат, и кому его впихнуть?
Добро пожаловать на 1ю точку.
++i++
> Боретесь с проблемами которые сами же и сделали? Понятно....
Я там привел пример: два метода есть у земли. Оба они отвечают протоколу <int()>
Как ты узнаешь, какой именно метод нужно поставить роботу?
Реши эту проблему без моего коннектора. А я посмотрю, чем твоё решение, скажем с использованием std::function будет отличатся от решения с использованием любого другого делегата
Если ты немножко подумаешь своей головой, тогда до тебя дойдет, что любые возможные проблемы взаимосвязей - это проблемы архитектуры приложения.
А не проблемы отдельного механизма, способного связать два компонента
Kartonagnick
> А я вот ничего не сужаю. Я сразу знаю. И наверняка
Мда, вы мастер демагогии и передергиваний 90 уровня.
То на требование описать, какой функтор Роботу нужен требуете разбираться в куче методов, с не говорящими именами и которые возвращают ничего не говорящий int.
То сами начинаете давать методам Мира ( какая земля? Мир, World лучше описывает это) очень даже говорящие типы.
И кстати, вот это -
void GetData(For_Robot& );
- петля. "Мир" не должен интересоваться конкретным роботом.
Это Робот должен знать, что с Миром можно сделать.
Или наоборот - класс "Робот" уже готов и неизменяем. А вот класс "Мир" придется делать с учетом "Робота".
Grey304
> Мда, вы мастер демагогии и передергиваний 90 уровня.
Я утверждаю, что при работе с делегатами критичен протокол передачи данных (набор правил, по которым определяется, как правильно отправлять/получать данные).
И плевать на сигнатуру функций.
И в чем демагогия?
Grey304
> - петля. "Мир" не должен интересоваться конкретным роботом.
> Это Робот должен знать, что с Миром можно сделать.
На самом деле никто не никому ничего не должен. Робот не знает ни о каком мире. Он лишь помечает собственные сигналы своими метками, и читает извне нечто со своими метками.
С землей Аналогично.
Grey304
> Все. Больше я там ничего не трогал))
Что то я не уловил в этой выдержке кода, как он может нацелится на константный метод. И как он выбирает между константной или неконстатной версиями
Kartonagnick
> Я утверждаю, что при работе с делегатами критичен протокол передачи данных
> (набор правил, по которым определяется, как правильно отправлять/получать
> данные).
> И плевать на сигнатуру функций.
> И в чем демагогия?
В том, что сигнатура функций - это и есть "что при работе с делегатами критичен протокол передачи данных (набор правил, по которым определяется, как правильно отправлять/получать данные)."
Вы сами привели примеры, где все типы известны на момент связывания. И типы там не могут взять и поменяться. Программу придется перекомпилировать. Зачем там безтиповые функторы с проверкой в рантайме?????
Kartonagnick
> На самом деле никто не никому ничего не должен. Робот не знает ни о каком мире.
> Он лишь помечает собственные сигналы своими метками, и читает извне нечто со
> своими метками.
Отлично.
Откомпилируйте это:
Kartonagnick
> как он может нацелится на константный метод. И как он выбирает между
> константной или неконстатной версиями
Оно не ради этого писалось.
А если надо различать - перегрузка функций - ваш лучший друг.
Kartonagnick
> Странно. Потому что эту проблему я наблюдал в проекте, в котором не
> использовался мой коннектор. Там использовался std::function со всякими
> буст-биндами и ещё воз и малая тележка всякого маловразумительного добра.
там всё элементарно разруливается дебагером, у меня проблем никогда не было.
Kartonagnick
> У земли два метода, возвращающие int. Какой именно?
эм... это как бы пользователь должен решить, делегату то пофиг.
Kartonagnick
> Ты почему то думаешь, что потребитель по дефолту сожрет все что угодно, лишь бы
> оно отвечало протоколу делегата.
да, в этом и есть смысл делегатов. Ты походу реально не врубаешься для чего они нужны.
Kartonagnick
> И я просто уверен, что прежде чем назначить потребителю поставщика тебе
> придется понять, что именно хочет потребитель, и что именно предоставляет
> поставщик. Тююю...
пфф. как раз таки, я ничего и не должен знать.
Kartonagnick
> Ты никак его не освободишь от необходимости знать и о поставщике и о
> потребителе.
вот как раз таки делегаты и освобождают, в этом их смысл.
Kartonagnick
> Что получится, если роботу назначат погоду вместо жратвы?
эт как? у него делегат имеет такой вид Delegate<food()> в случае с шаблонами ты никак не назначишь ему wether().
Kartonagnick
> 1. Круговая схема. Робот захотел жрать. Он излучает в эфир "хочу жрать" . И
> дальше идет по своим делам. Он лишь уведомляет, но не ждет ответа. Связь
> одностороння
какую то фигню придумал, давай более близкое, про GUI например, там делегаты раскрывают практически весь свой потенциал.
Kartonagnick
> Я утверждаю, что при работе с делегатами критичен протокол передачи данных
> (набор правил, по которым определяется, как правильно отправлять/получать
> данные).
> И плевать на сигнатуру функций.
так сигнатура и есть протокол, или ты имеешь ввиду что-то другое под протоколом?
Chaos_Optima
> да, в этом и есть смысл делегатов. Ты походу реально не врубаешься для чего они
> нужны.
Ответь пожалуйста, какой именно метод подойдёт роботу:
class Robot { public: void setHandler(const Den::TConnector<int( )>& handler); }; class World { public: int GetData1( )const; int GetData2( )const; };
По твоим словам, получается, что делегат робота можно настроить на любую функцию, удовлетворяющую протоколу делегата.
То есть, ты считаешь, что без разницы что именно делают эти функции, и что они возвращают, главное - что бы удовлетворяли протоколу делегата.
Ты походу сам не врубаешься для чего нужны делегаты.
Chaos_Optima
> пфф. как раз таки, я ничего и не должен знать.
Сейчас ты - программист 1й точки. Тебе нужно связать робота и землю. Для этого тебе нужно скормить роботу заряженный делегат.
Как ты будешь выбирать какой именно метод земли подойдет для робота?
Как ты будешь это делать, если ты не знаешь, что именно возвращают методы земли?
Chaos_Optima
> вот как раз таки делегаты и освобождают, в этом их смысл.
Каким образом протокол делегата освобождает тебя от проблемы выбора одного из многих методов земли?
Сейчас, в представленном примере есть два метода, и оба они удовлетворяют протоколу делегата.
Как это поможет тебе сделать выбор?
Chaos_Optima
> какую то фигню придумал, давай более близкое, про GUI например, там делегаты
> раскрывают практически весь свой потенциал.
Хорошо. Но прежде, чем мы двинемся дальше, я хочу увидеть, что ты понял смысл: прокол шаблонного делегата -сам по себе - ничто. Он не поможет тебе правильно установить связи между компонентами.
Сделай выбор. И объясни мне, как именно ты сделал этот выбор.
На чем ты основывался выбирая из двух методов, если она они удовлетворяют протоколу делегата робота.
Kartonagnick
> А кто решает, и в какой момент принимается это решение: чем заправить делегат, и кому его впихнуть?
> Как ты определишь какой именно метод тебе нужен, Кэп?
Эту проблему можно решить собрав параметры в структурку. Дать ей и данным понятное название, т.е. вместо:
int GetData1()const; int GetData2( )const;
будет
struct Data1Params { int Data1; }; struct Data1Params { int Data2; }; Data1Params GetData1()const; Data2Params GetData2( )const;
Подсунуть не тот делегат не туда невозможно, все проверяется компилятором. И по сигнатуре видно что где и как используется.
Grey304
> В том, что сигнатура функций - это и есть "что при работе с делегатами критичен
> протокол передачи данных (набор правил, по которым определяется, как правильно
> отправлять/получать данные)."
> Вы сами привели примеры, где все типы известны на момент связывания. И типы там
> не могут взять и поменяться. Программу придется перекомпилировать. Зачем там
> безтиповые функторы с проверкой в рантайме?????
Grey304
> Мы не можем сделать так, чтобы World и Robot не зависели от какого-то третьего
> типа.
Grey304
> Как это стыковать?
паттерн "адаптер"
Grey304
> Оно не ради этого писалось.
> А если надо различать - перегрузка функций - ваш лучший друг.
Здрасти. Приехали. Тоесть, получается, что делегат куценький. Даже на костантный метод нацелиться не сумеет.
++i++
> Эту проблему можно решить собрав параметры в структурку. Дать ей и данным
> понятное название, т.е. вместо:
Ну вот ты и начал двигаться по славному пути протокола передачи данных.
Теперь, надеюсь, до тебя дошло, что не сигнатура играет роль, а имя-типа, который определяет смысловую нагрузку сообщения?
Тема в архиве.