Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Процедурные типы https://zx.oberon.org/forum/viewtopic.php?f=79&t=152 |
Страница 1 из 1 |
Автор: | Len [ 23 ноя 2013, 08:26 ] |
Заголовок сообщения: | Процедурные типы |
Что такое процедурные типы, как их применять и зачем они нужны? |
Автор: | Zorko [ 23 ноя 2013, 08:55 ] |
Заголовок сообщения: | Re: Процедурные типы |
Это такие типы, с помощью которых можно описать прототипы процедур. И потом объявить процедурные переменные данных типов и вызывать непрямым способом процедуры, на которые они указывают, что позволяет, например, быстро переключать разные реализации процедуры, присваивая процедурной переменной, через которую происходит вызов, других значений. Ближайший аналог из ООП — виртуальные методы классов. Здесь в коде показано всё. И как описать прототип, и как работать с такой процедурной переменной. Это совершенно реальный и рабочий пример — процедура Is64BitWindows, проверяющая, на 32-битной или 64-битной винде запущена программа: Код: "OBERON"
Работа с процедурными переменными имеет смысл не только в системном программировании. В прикладной области этому подходу тоже можно найти применение. А вот что говорит документация ББ по данному вопросу: Docu/ru/CP-New писал(а): Процедурные типы Почему так? Потому что в компонентной среде с динамической загрузкой/выгрузкой модулей "на лету" есть проблемы с процедурными переменными, когда модуль, реализующий процедуру, на которую указывает переменная, уже выгружен, а программист процедуру вызвал (и потерпел крах). Поэтому парни из Oberon Microsystems советуют вместо процедурных переменных использовать методы объектов.
Процедурные типы обладают меньшей гибкостью, чем объекты с методами. Даже в обычных примерах использования процедурных типов в ПО для числовых расчетов можно получить выигрыш, моделируя их посредством объектов. Объекты расширяемы, а процедурные типы — нет. Процедурные типы могут создавать значительные трудности для безопасной выгрузки модулей. Пока что они сохранены для обратной совместимости, а также для реализации низкоуровневого интерфейсного кода (обратные вызовы, callbacks). В перспективе поддержка процедурных типов может быть уменьшена. |
Автор: | Saferoll [ 25 ноя 2013, 18:12 ] |
Заголовок сообщения: | Re: Процедурные типы |
Процедурные типы имеют (имели) большое значение в Оберон-1, т.к. именно через них были реализованы методы объектов. В первой версии Оберона у объектов вообще не было методов как отдельной сущности. У объектов (вернее у записей - RECORD) наряду с полями целого, вещественного, символьного и пр.типов могли быть поля процедурных типов. Вот через них и предлагалось реализовать методы - при инициализации объекта, нужно было связать эти процедурные поля с соответствующими процедурами просто выполнением присваивания. Однако такая гибкость провоцировала на трюки (ведь можно было переприсвоить эти поля в любой момент), усложняла инициализацию и наследование (надо вручную делать эти присваивания), усложняла синтаксис при вызове метода ("obj.proc(obj,...)"). Поэтому начиная с Оберона-2 введены "настоящие методы": привязка процедур к объектовому (записевому - RECORD) типу осуществляется статически - указанием типа объектового параметра при описании процедуры, а не динамически - присваиванием во время выполнения программы. Сравнение ООП в Оберон1 и КП см на форуме http://forum.oberoncore.ru/viewtopic.php?f=8&t=2121 Для совместимости эти возможности оставлены, технически можно и в Oberon-2 и в КП не использовать методы, а пользоваться в записях полями процедурного типа. Но делать этого не следует из-за указанных выше недостатков. А также потому, что "В перспективе поддержка процедурных типов может быть уменьшена". Это уже история, "настоящие методы" удобнее, надежнее и нагляднее. Слова из документации об устаревании и постепенном "сокращении" процедурных типов относятся, думаю, в большей мере именно к их использованию в ООП. |
Автор: | geniepro [ 25 ноя 2013, 19:38 ] |
Заголовок сообщения: | Re: Процедурные типы |
Не могу согласиться с тем, что процедурные типы так уж бесполезны. Конечно, первый пример их использования, приходящий в голову императивному программисту, -- это те самые колбеки (например, прорисовка прогресс-бара во время передачи файла по сети -- классика жанра). Но есть и другие примеры, когда проще передать процедуру, чем оборачивать её в объект-пустышку только для того, что бы соблюсти каноны ООП. Правда, все эти примеры, что приходят мне в голову -- из мира ФП, а с поддержкой ФП у оберонов довольно печально... |
Автор: | Saferoll [ 25 ноя 2013, 20:04 ] |
Заголовок сообщения: | Re: Процедурные типы |
geniepro писал(а): Не могу согласиться с тем, что процедурные типы так уж бесполезны... Ни в коей мере не утверждал, что бесполезны. Просто их роль уменьшилась в связи с появлением в Оберон2 "статически задаваемых" методов. И вместо таких методов процедурные типы использовать не следует. В случае же callback или "проще передать процедуру, чем оборачивать её в объект", действительно удобнее использовать процедурный тип. Но ведь если не обёрнут в объект, тогда это и не метод, правда? Вот поэтому и думаю, что замечания об устаревании и сокращении поддержки касаются только ООП, а для прочего процедурный тип останется. |
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |