.
O> Да сейчас многое, что было сказано у Александреску видится иначе, но ..кто же сказал "Гаффф.." ?
Не совсем понятно, почему Вы задаете этот вопрос после
O> Какая разница, кто первый, важнее куда все это двинется.
Но давайте восстановим исторический контекст.
O> А именно о тайплистах, и именно они и являются по сути стартапом для метапрограмминга в С++ (отличное идея использования рекурсивной инстанциации шаблонов)
Template Metaprogramms. По ссылке Todd Veldhuizen (автор библиотеки Blitz++). Описал отличную идею использования рекурсивной инстанциации шаблонов. "Гаффф" прозвучало в 1995 году. Я не утверждаю, что он был первым, однако это было значительно раньше выхода в свет "Современного проектирования". А до него еще был Erwin Unruh, который написал первую метапрограмму, и т.п.
O> А затем туплы
Про кортежи в C++ впервые писал Jaakko Jarvi в 1999 году. Он же и развил свои идеи в Boost.Tuple.
O> которые затем заимствуются и другими языками
Это оффтопик, но какие языки Вы имеете в виду? Java с C#? Потому что в других "других языках" кортежи, если они вообще есть, в основном являются first class objects.
O> А почему не мы должны отдавать Александреску должное?
Мы должны -- за списки типов, популяризацию метапрограммирования и, возможно, идеи разложения на стратегии. Это и будет "должным". Все, что сверх этого, я и называю "переоцениванием".
Надеюсь, теперь объяснил понятно.
Здравствуйте, Alexander Poluektov, Вы писали:
AP>Здравствуйте, ollv, Вы писали:
AP>>>Приведите, пожалуйста, определение ООП, которое Вы сейчас использовали.
O>>
O>>Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию.
.
Мне тяжело отследить этимологию появления dynamic dispatch в разговоре о статическом и динамическом полиморфизмах, как по мне, так за описанием можно сходить сюда.
О статическом полиморфизме:
Templates in C++ provide a sophisticated mechanism for writing generic, polymorphic code. In particular, through the Curiously Recurring Template Pattern, it's possible to implement a form of static polymorphism that closely mimics the syntax for overriding virtual functions. Since C++ templates are type-aware and Turing-complete, they can also be used to let the compiler resolve recursive conditionals and generate substantial programs through template metaprogramming. Contrary to some opinion, template code will not generate a bulk code after compilation with the proper compiler settings.
я же получается больше упоминал generic, polymorphic code. Собственно более общего определения которое покрывает всевозможные кейсы я пока не нашел,
O>> Да сейчас многое, что было сказано у Александреску видится иначе, но ..кто же сказал "Гаффф.." ?
AP>Не совсем понятно, почему Вы задаете этот вопрос после
Потому, что идея тайплистов расширяет и туплы. Т.к кортежи бустов имеют вынужденное (зависимое от компилятора) ограничение в глубину, реализовав же кортежи в идиоме
template <typename type, typename tail> struct dual { typedef type type; typedef tail tail; type m_val; };
ограничения в длину можно избежать, хотя и скорость получения значение через статик каст тоже уйдет, если решить проблему влоб.
O>> Какая разница, кто первый, важнее куда все это двинется.
AP>Но давайте восстановим исторический контекст.
O>> А именно о тайплистах, и именно они и являются по сути стартапом для метапрограмминга в С++ (отличное идея использования рекурсивной инстанциации шаблонов)
AP>Template Metaprogramms. По ссылке Todd Veldhuizen (автор библиотеки Blitz++). Описал отличную идею использования рекурсивной инстанциации шаблонов. "Гаффф" прозвучало в 1995 году. Я не утверждаю, что он был первым, однако это было значительно раньше выхода в свет "Современного проектирования". А до него еще был Erwin Unruh, который написал первую метапрограмму, и т.п.
Под "Гафф ..." я подразумевал именно списки типов, т.К. рекурсивная инстанциация — это еще не метапрограмма, как собственно и тайп листы еще не метакломпилятор. Близко, очень близко, но еще не совсем. метакомпилятор должен позволять
O>> А затем туплы
AP>Про кортежи в C++ впервые писал Jaakko Jarvi в 1999 году. Он же и развил свои идеи в Boost.Tuple.
Да, и вследствии чего часть МПЛ , вектор в частности, реализован как multi-parametric template после инсерта же он может преспокойно выродиться в dual based, с моей точки зрения такая смешанная стратегия может оказаться неудобной (и оказывается в алгоритмике, если базироваться на бустовых тайплистах).
O>> которые затем заимствуются и другими языками
AP>Это оффтопик, но какие языки Вы имеете в виду? Java с C#? Потому что в других "других языках" кортежи, если они вообще есть, в основном являются first class objects.
В данном случае я говорил на основе слухов по принципу "сишарпники с соседнего проекта сказали..."
O>> А почему не мы должны отдавать Александреску должное?
AP>Мы должны -- за списки типов, популяризацию метапрограммирования и, возможно, идеи разложения на стратегии. Это и будет "должным". Все, что сверх этого, я и называю "переоцениванием". AP>Надеюсь, теперь объяснил понятно.
В принципе да, я так изначальо и понимал. Для меня тайлисты — именно прорыв, и это уже именно метапрограмма, где под
typedef TT(struct Begin, typename for_ <int_<60>, predicat<int, not_equal_<0> >, >::do_, struct End) run_loop; можно подразумевать что угодно. Запустить по почте, отправить в космос тут переоценить сложно, это эпохальное, собственно Не умаляя заслуг остальных товарищей всетаки я бы согласился с этим сообщением
Здравствуйте, Alexander Poluektov, Вы писали:
AP>В Fundametal concepts and features указаны dynamic dispatch и suptype polymorphism.
AP>Конечно, можно расширить понятие "subtype polymorphism", чтобы оно работало с concepts, но я считаю это жонглированием определениями. Ну а dynamic dispatch к статике уже никак не прикрутишь
Да, я тоже заметил это "subtype".
Однако, я сразу же вспомнил ООП в Си и работу с COM в Си.
Для реализации динамического полиморфизма в Си достаточно собрать таблицу виртуальных функций. При этом никаких subtype в строгом значении этого слова в Си можно и не использовать — наследование интерфейсов будет только "в уме". Но все же это будет ООП и это будет динамический полиморфизм.
Мне кажется что ООП как парадигма не может ограничиваться рамками языка, и смотреть надо только на то, соответствует архитектура "духу ООП" или нет. И если с помощью статического полиморфизма я могу реализовать паттерны GoF, если при этом объекты выглядят как объекты, а методы ведут себя полиморфно — я говорю "это ООП".
AP>Отрывок из википедии я уже привел. Вот что говорит Бьярни Стровструп (*) насчет ООП в контексте C++: (...) AP>Далее по этой же ссылке Бьярни проводит различие между generic programming (в контексте которого им упоминается static polymorphism), и object-oriented programming.
Но это не отменяет того, что static polymorphism можно использовать в целях ООП.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, Alexander Poluektov, Вы писали:
AP>>В Fundametal concepts and features указаны dynamic dispatch и suptype polymorphism.
AP>>Конечно, можно расширить понятие "subtype polymorphism", чтобы оно работало с concepts, но я считаю это жонглированием определениями. Ну а dynamic dispatch к статике уже никак не прикрутишь
A>Да, я тоже заметил это "subtype". A>Однако, я сразу же вспомнил ООП в Си и работу с COM в Си. A>Для реализации динамического полиморфизма в Си достаточно собрать таблицу виртуальных функций. При этом никаких subtype в строгом значении этого слова в Си можно и не использовать — наследование интерфейсов будет только "в уме". Но все же это будет ООП и это будет динамический полиморфизм.
A>Мне кажется что ООП как парадигма не может ограничиваться рамками языка, и смотреть надо только на то, соответствует архитектура "духу ООП" или нет. И если с помощью статического полиморфизма я могу реализовать паттерны GoF, если при этом объекты выглядят как объекты, а методы ведут себя полиморфно — я говорю "это ООП".
AP>>Отрывок из википедии я уже привел. Вот что говорит Бьярни Стровструп (*) насчет ООП в контексте C++: (...) AP>>Далее по этой же ссылке Бьярни проводит различие между generic programming (в контексте которого им упоминается static polymorphism), и object-oriented programming.
A>Но это не отменяет того, что static polymorphism можно использовать в целях ООП.
Общеизвестно, что ООП стоит на 3-х китах:
1. Инкапсуляция;
2. Полиморфизм;
3. Наследование;
Дальше я аппелирую к C++ (хотя Вы можете апеллировать и к другим ОО языкам).
Инкапсуляция это private, public.
Полиморфизм – это «позднее» связывание и виртуальные функции
Наследование — … Ну это понятно, когда просто повторно не описываешь то, что уже описано в базовом классе.
А к чему тогда относится наличие конструкторов и их автоматический вызов? Разве это ООП?
А статические члены класса? Тоже ООП?
А константные методы? Неужели тоже ООП?
Я таких «фич» могу насчитать в C++ до сотни. И их в книгах по C++ почему то упоминают в разделах, описывающих ООП, хотя к ООП они никакого отношения не имеют. Это не более, чем «костыли», создающие определенные удобства.
Так вот. Эти фичи (которые вроде как юзают в контексте ООП, а на самом деле они 3-м «китам» ООП не имеют никакого отношения) я хотел бы обсудить в этой теме.
Кто в каком языке знает какие есть такие фичи?
И ещё хотелось бы обсудить РЕАЛИЗАЦИЮ ООП (и идущих в комплекте с ним «костылей») в разных языках и компиляторах разных фирм.
Здравствуйте, Слесарь с завода, Вы писали:
ССЗ>Общеизвестно, что ООП стоит на 3-х китах: ССЗ>1. Инкапсуляция; ССЗ>2. Полиморфизм; ССЗ>3. Наследование;
А почему не на пяти слонах и большой черепахе? И кому это общеизвестно? Вы это в учебнике Герберта Шилдта прочитали?
ССЗ>Дальше я аппелирую к C++ (хотя Вы можете апеллировать и к другим ОО языкам). ССЗ>Инкапсуляция это private, public. ССЗ>Полиморфизм – это «позднее» связывание и виртуальные функции ССЗ>Наследование — … Ну это понятно, когда просто повторно не описываешь то, что уже описано в базовом классе.
Т.е. если мы используем private тут и там, наследуем где не попадя, и все функции у нас виртуальные -- мы магически получаем объектно-ориентированную программу?
Садитесь, два.
.
O> Мне тяжело отследить этимологию появления dynamic dispatch в разговоре о статическом и динамическом полиморфизмах,
Просто Вы поменяли тему (было про объектно-ориентированное программирование, стало про статический и динамический полиморфизмы), а я нет.
Надеюсь понятно, как в разговоре об ООП вдруг всплыл dynamic dispatch?
O> Под "Гафф ..." я подразумевал именно списки типов
Я согласен с тем, что Александреску (вместе с Джоном Влиссидессом) является пионером в области метапрограммирования на списках типов.
Мои возражения Abyx'у касались только весьма сильных слов "понимание того что всё что написал Александреску — потом реализовали в бусте" (выделено мной).
Контрпримеры со ссылками я привел. Прорывы и запуски в космос мной не поднимались, и (вне зависимости от моего к ним отношения) обуждать их далее я не буду.
Приветствую, Михаил!
M>... AP>>Садитесь, два.
M>Александр, мне показалось что ВЫ адски троллите ?
Да нет, и в мыслях не было. Меня просто, хм, удивляют эти детсадовские заявления типа "ООП = инкапсуляция+наследование+полиморфизм" и "инкапсуляция = private".
Учитывая, что ты уже второй, кто делает предположение о троллинге, постараюсь сделать выводы о стиле ведения диалога
P.S. Если ты насчет "Вы", то я начал "выкать" в первом посте, а переключаться на "ты" посреди треда мне показалось странным.