
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (14) « Первая ... 3 4 [5] 6 7 ... 13 14 все ( Перейти к последнему сообщению ) |
Сообщ.
#61
,
|
|
|
Сообщ.
#62
,
|
|
|
Вы сейчас применяете дамский аргумент. Прошу вас заниматься софистикой в другом месте. Цитата MyNameIsIgor @ Проектирование по контракту - не наука, а набор медитативных практик. Полученных из опыта. Потому "строгих" критериев не будет. Прочитайте пожалуйста хотя бы определение. Формализованность и верифицируемость - это необходимые условия для DbC. Поэтому, я настойчиво рекомендую вам в дальнейшем не пользоваться понятиями, смысл которых вы не знаете. Даже если в ваш лексикон что-то перепало с барского стола DbC. Все эти слова сотрясают воздух, но не собеседника. |
Сообщ.
#63
,
|
|
|
Ну кто же знает. Некоторые люди себе на жизнь Erlang-ом и Haskell-ем зарабатывали когда об этих языках широкая общественность еще и не знала. Может и вы на какой-нибудь Adga2 или еще чем-нибудь уже во всю коммерческие проекты делаете. Просто забавно получается. Ни libcppa, ни boost.fibers, ни зависимые типы вы реально не используете, но говорите, что на них можно. Это несколько настораживает ![]() Добавлено Цитата MyNameIsIgor @ И привносит оверхед счётчика. Конечно. Поскольку в C++ GC нет, то приходится работать со счетчиками ссылок. В том же libcppa это так же используется. Просто там пользователь об этом счетчике не сном, ни духом. SO про счетчик пользователь так же не сильно думает, но у нас он выставлен наружу через message_t. |
Сообщ.
#64
,
|
|
|
Цитата eao197 @ Мы уже работали с сообщениями, где не нужно было наследоваться. По итогам решили ввести общий базовый тип А можно узнать, какие были аргументы за, какие против и какие из аргументов, в итоге, перевесили и почему? Ну так, чтоб каких-то производственных тайн не раскрывать ![]() |
Сообщ.
#65
,
|
|
|
У-тю-тю-тю, ещё один якобы умный
![]() Цитата bsivko @ Прочитайте пожалуйста хотя бы определение. Формализованность и верифицируемость - это необходимые условия для DbC. Покажите цитату, где сказано, что они являются необходимыми условиями. А потом расскажите, как вы формально верифицируете программу на Eiffel. Цитата bsivko @ Поэтому, я настойчиво рекомендую Если когда-нибудь ваше мнение станет мне интересно, я дам вам знать. До тех пор попусту не возбуждайтесь. Цитата eao197 @ Просто забавно получается. Ни libcppa, ни boost.fibers, ни зависимые типы вы реально не используете, но говорите, что на них можно. Это несколько настораживает Штирлиц насторожился © ![]() Цитата eao197 @ Конечно Конечно это минус в том случае, если копирование/перемещение сообщения дешевле счётчика. |
Сообщ.
#66
,
|
|
|
Цитата D_KEY @ А можно узнать, какие были аргументы за, какие против и какие из аргументов, в итоге, перевесили и почему? Дело довольно давнее, с моим склерозом всего уже и не вспомнить. Точно помню, что в 2002, когда создавался SO-4, я специально закладывал возможность, чтобы любую структуру можно было отослать в виде сообщения. Но, т.к. рядом с ней нужно было иметь еще и некоторую метаинформацию, в частности, счетчик ссылок, то рядом с созданным пользователем объектом-сообщением еще и создавался мелкий объект-дескриптор. Это серьезные накладные расходы, т.к. любой дополнительный new/delete в многопоточном приложении -- это ощутимо, даже если связать с объектом-дескриптором отдельный эффективных аллокатор. Кроме того, выяснилось, что за все время использования SO-4 (а это уже 12 лет) ни разу не была использована возможность отослать в виде сообщения какую-то чужую структуру. Всегда это были специально подготовленные в качестве сообщения структуры данных. Поэтому, занимаясь SO-5, хотелось объединить и объект-сообщение, и нужную для него метаинформацию в одном блоке памяти. Общий базовый тип здесь выглядел наиболее простым и логичным вариантом. Кроме того, общий базовый класс позволил задействовать dynamic_cast для обеспечения большей безопасности операций. Ну и были идеи по добавлению в общего предка виртуальных методов для разных целей -- от валидации объекта сообщения (в SO-4 была такая фича, перед обработкой сообщения запускался его валидатор), до реакции на какие-то события (вроде переполнения очереди или игнорирования сообщения из-за того, что агент не смог его обработать). Но пока это все осталось в фантазиях. Хотя сама возможность сделать что-то подобное греет ![]() Не могу сказать, как на это дело повлияло то, что SO-5 разрабатывался в 2010, официально C++11 не был принят, и далеко не все компиляторы имели поддержку таких вещей, как rvalue references и move-semantic. Наверное так же повлияло, т.к. мы делали инструмент, который нужно было запускать в дело максимально быстро, а не ждать, когда появятся компиляторы с достаточным уровнем поддержки C++11. |
Сообщ.
#67
,
|
|
|
Я еще не смотрел вашу библиотеку, но разве при наличии даже требования к наследованию, сложно расширить интерфейс для обработки произвольных типов, которые бы уже внутри заворачивались в объект с нужными требованиями?
|
Сообщ.
#68
,
|
|
|
Цитата D_KEY @ Я еще не смотрел вашу библиотеку, но разве при наличии даже требования к наследованию, сложно расширить интерфейс для обработки произвольных типов, которые бы уже внутри заворачивались в объект с нужными требованиями? Не уверен, что понимаю, о чем именно идет речь. Полагаю, об одном из следующих вариантов: Есть внутренний тип message_t с нужным набором методов. Для конкретного пользовательского типа неявно строится наследник-обертка: ![]() ![]() template< class USER_MESSAGE > struct concrete_msg_t : public message_t { USER_MESSAGE m_data; ... // Куча виртульных методов. }; Далее, для получения concrete_msg_t<T> с дополнительными свойствами, например, с реакцией на переполнение очереди, поступаем одним из следующих способов. Способ 1: ![]() ![]() // Пользователь в своем типе определяет метод queue_overload_reaction(): class my_message { ... reaction queue_overload_reaction() const { ... } }; // Наличие этого метода автоматически определяется при обращении к deliver_message: mbox->deliver_message( my_message(...) ); Способ 2: ![]() ![]() // При обращении к deliver_message передаются дополнительные свойства: mbox->deliver_message( my_message(...) ).with_queue_overload_reaction(...); Правильно я вас понял? Если правильно, то можно и так. Только вот мне ближе, когда все это делается в общем базовом классе, от которого пользователь наследуется. Может это и субъективное мнение, но вот не понимаю, что в таком подходе плохого. |
Сообщ.
#69
,
|
|
|
Цитата MyNameIsIgor @ Покажите цитату, где сказано, что они являются необходимыми условиями. А потом расскажите, как вы формально верифицируете программу на Eiffel. Т.е. цитаты из вики вам недостаточно? Нужно ли вам объяснять, являются ли assert'ы формальными и/или верифицируемыми? На Eiffel никогда не верифицировал программ. И, вообще-то, DbC != Eiffel. И даже, утверждение (точнее, предикат) Eiffel => DbC не является истинным (стрелка тут импликация). И это все выходит за рамки текущей темы. Контрактов нет ни в Qt, ни в SO, и они редко где используются простыми программистами С++. Цитата MyNameIsIgor @ Если когда-нибудь ваше мнение станет мне интересно, я дам вам знать. До тех пор попусту не возбуждайтесь. Когда вы ещё раз ляпнете что-нибудь про контракт, я вам дам знать. |
Сообщ.
#70
,
|
|
|
Цитата MyNameIsIgor @ Штирлиц насторожился © ![]() Да как же я уйду, где ж еще получится пообсуждать практические проблемы с теоретиком ![]() Не обижайтесь, пожалуйста, это шутка. |
Сообщ.
#71
,
|
|
|
Цитата bsivko @ Т.е. цитаты из вики вам недостаточно? Во-первых, вика - это не абсолютная истина, а информация для ознакомления. Во-вторых, там нет ничего про необходимость формальной спецификации. Цитата bsivko @ Нужно ли вам объяснять, являются ли assert'ы формальными и/или верифицируемыми? Да, нужно. Потому что ни assert'ы, ни котракты (в смысле языковых возможностей) не являются формальной верификацией. Они ничего не доказывают, а лишь говорят нам, что в данном случае они не сработали. Или попробую объяснить по-другому: контракты и утверждения выполняют ту же работу, которую можно выполнить с помощью модульного тестирования. Но как справедливо говорит ваша любимая вика Цитата Тестирование программного обеспечения не может доказать, что система, алгоритм или программа не содержит никаких ошибок и дефектов и удовлетворяет определённому свойству. Это может сделать формальная верификация. Цитата eao197 @ Да как же я уйду Вы правда хотите, чтобы я сказал? |
![]() |
Сообщ.
#72
,
|
|
Цитата MyNameIsIgor @ Ну так кому-то вон не в лом и на Билдере писать в объектной модели Дельфей. Всё относительно, а уж такая право мелочь, как мета-переходник от значения к типу, не достойна в качестве минуса привлекать пристальное внимание, коли большая часть остального в либе устраивает. Мне много что не в лом. Да и вообще, предлагается библиотека или список того, что не в лом? Добавлено Цитата eao197 @ Кстати вот. А не смотрели в сторону стратегий поведения? Они могут относительно дёшево избавить от общего предка, заменив полиморфизм на статический. Т.е. все это решаемо, но с наследованием от общего предка все получается проще и понятнее. |
Сообщ.
#73
,
|
|
|
Цитата Qraizer @ Всё относительно, а уж такая право мелочь, как мета-переходник от значения к типу, не достойна в качестве минуса привлекать пристальное внимание, коли большая часть остального в либе устраивает Да я же не против, что у всего есть плюсы и минусы. Просто зацепились за эту тему, другие роль ведомого подкинуть не позволяет ![]() |
Сообщ.
#74
,
|
|
|
Цитата Qraizer @ Цитата eao197 @ Сегодня, 16:08 Т.е. все это решаемо, но с наследованием от общего предка все получается проще и понятнее. Кстати вот. А не смотрели в сторону стратегий поведения? Они могут относительно дёшево избавить от общего предка, заменив полиморфизм на статический. Не уверен, что понимаю о чем идет речь. При диспетчеризации сообщений именно что нужен обычный полиморфизм -- есть очередь объектов типа message_t, все это находится где-то глубоко внутри отдельной dll/so-шки, пользовательский код компилируется отдельно и потом уже линкуется с библиотекой SO-5. Как бы мы в пользовательском коде не игрались с шаблонами, стратегиями и статическим полиморфизмом, все равно это нужно будет как-то свести к поведению типа message_t. |
![]() |
Сообщ.
#75
,
|
|
Не, понятно, что гетерогенные контейнеры на статике собирать категорически неудобно. Хоть и можно. Но я и не знаю внутренней кухни SO, я просто отталкиваюсь от вашего же заявления, что единый базовый класс был необязателен.
Конкретно в том, что я имел в виду, подразумевалось, что различные те или иные кастомные характеристики можно было бы возложить на компайл-тайм стратегии вместо ран-тайм полиморфизма. В конце концов я представляю агентов как сущности с характеристиками, заданными при их проектировании, и им совершенно незачем менять их у себя в ран-тайм. |