OberonCore https://forum.oberoncore.ru/ |
|
Standard Container Library https://forum.oberoncore.ru/viewtopic.php?f=47&t=6234 |
Страница 6 из 6 |
Автор: | Дмитрий Дагаев [ Суббота, 26 Январь, 2019 13:13 ] |
Заголовок сообщения: | Re: Standard Container Library |
Тут критика прозвучала. PSV100 писал(а): По ходу дела вспоминаются предлагаемые здесь на форуме решения для "STL". Любопытно это решение: https://forum.oberoncore.ru/viewtopic.php?f=47&t=6234 , которое, по сути то, есть обман системы типизации благодаря использованию средств runtime-рефлексии из-за необходимости доступа из базового типа к полям, которые определяются в потомках (расширениях) -- в системе типов нет никакого понятия что-то вроде абстрактных полей, контракт типов молчит о таких приёмах и, фактически, в итоге вводит в заблуждение (особенно таких как я, плотно незнакомых с рефлексией. И, к слову, обычно "report-ы о языке" не содержат сведений о средствах метаинформации как важного языкового аспекта). В целом, средства рефлексии подталкивают (или, как минимум, не предотвращают) к стилю "ruby on rails" -- это когда активно используются "устные" соглашения вида "Container.FindBySomeID(value)", где у некоторого контейнера данных вызывается метод с определенным именем задаваемого формата, в частности: найти элемент, у которого поле SomeID равно такому-то значению. Т.е. в runtime форматируемые имена методов и прочих элементов языковых структур приобретают определенные роли (возможна и динамическая компиляция/создание элементов, если языковая среда позволяет, или каким-то способом динамически устанавливаются/реализуются роли в элементах), о ролях и форматах "договариваются" вне системы типизации. С одной стороны якобы простота и удобство, с другой "проверка контрактов" полностью в runtime (самостоятельная, т.е. задаваемая разработчиками) с соответствующими последствиями (при критической массе таких договорённостей (которых ещё нужно знать) разбираться уже трудно, тем более когда структура "договоров" возникает в runtime). Поясню, "средства runtime-рефлексии из-за необходимости доступа из базового типа к полям, которые определяются в потомках (расширениях)" - это доступ из Vectors.Vector к полю data. Код: MyRec = RECORD
i1: INTEGER; END; MyVec = RECORD (Vectors.Vector) data*: POINTER TO ARRAY OF MyRec; END; |
Страница 6 из 6 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |