OberonCore https://forum.oberoncore.ru/ |
|
Про разработку компонентов.. https://forum.oberoncore.ru/viewtopic.php?f=23&t=177 |
Страница 2 из 2 |
Автор: | Илья Ермаков [ Понедельник, 09 Март, 2015 20:12 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
2Иван: http://oberoncore.ru/library/ermakov_vn ... ejs_kernel Перед объектом (по -4 от того места в памяти, куда указует указатель на объект) находится тег типа. Тег типа - это указатель на структуру Kernel.Type (достать явно тег типа можно с помощью процедур Kernel.Type или эффективнее операцией компилятора SYSTEM.TYP: S.VAL(Kernel.Type, S.TYP(object)) - хотя, конечно, это не нужно применять в обычных программах. А виртуальная таблица находится в Kernel.Type, но, опять же, по отрицательному смещению от базового адреса: Цитата: TYPE Type [untagged] Описатель типа данных. Хранит информацию о размере и структуре данных. Указатели на связанные процедуры типа находятся по отрицательным смещениям от описателя. Указатель на n-й метод находится по смещению -4 * (n + 1). Замечу ещё, что все эти мета-объекты (Kernel.Module, Kernel.Type) размещаются в памяти не ядром и не загрузчиком, они уже заготовлены компилятором в модуле "как есть". Модуль целиком подгружается в память - и настраиваются все адреса внутри (+ смещение в памяти, по которому загружен модуль). |
Автор: | Илья Ермаков [ Понедельник, 09 Март, 2015 20:18 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
mixalu писал(а): Меня смущает, что модуль (назовем его Math) и его методы (DoMath) работают с указателями на абстрактный Rec, "не зная" о конкретных типах. Не смущайтесь! В этом вся соль ООП - возможность написания кода, который работает с заранее неизвестными типами объектов. Более того, типов этих вообще может не существовать в природе. Их через год напишет программист Вася, модуль динамически загрузится в ББ - и Ваш модуль будет работать с типом Васи. Так обеспечивается расширяемость, эволюция объектных систем. Почитайте тут статейки: http://oberoncore.ru/library/start Губанов С. Ю. Секреты модульных систем Pfister C. Component Software / Пфистер К. Компонентное программное обеспечение (Пфистер - ген. дир. Oberon Microsystems, разработавшей ББ) Оно, конечно, сейчас в некоторых моментах читается наивно (в плане предвкушений "рынка компонент" и др., это были завышенные ожидания на фоне MS COM и подобного - всё же рынок бинарных компонент настолько не состоялся и не состоится, как open-source-"рынок"). |
Автор: | Valery Solovey [ Понедельник, 09 Март, 2015 21:13 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
Илья Ермаков писал(а): В этом вся соль ООП - возможность написания кода, который работает с заранее неизвестными типами объектов. У меня складывается впечатление, что вопрос немного про другое. И ответ на него - ООП позволяет писать код, который работает с заранее неизвестными типами. А на момент, когда он их использует, он о них уже знает. Как это делается? Способ далеко не один. Разработчики ББ особо полюбили директории.
|
Автор: | mixalu [ Вторник, 10 Март, 2015 09:44 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
Илья, Иван, спасибо! Статьи эти я читал, общий принцип понятен. Практически - не совсем. Цитата: У меня складывается впечатление, что вопрос немного про другое. И ответ на него - ООП позволяет писать код, который работает с заранее неизвестными типами. А на момент, когда он их использует, он о них уже знает. Как это делается? Способ далеко не один. Разработчики ББ особо полюбили директории. Именно так. Я так и понял, что нужно изучать паттерны, как ни крути. А код в таком виде, как у меня, все же не работает. И это логично: в момент исполнения модуль не знает о новых типах. Вылетает трап. А вот на VBA аналогичная схема работает. Но там интерпретируемый язык и позднее связывание. |
Автор: | Иван Кузьмицкий [ Вторник, 10 Март, 2015 09:55 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
mixalu писал(а): А код в таком виде, как у меня, все же не работает. И это логично: в момент исполнения модуль не знает о новых типах. Вылетает трап. Модулю и не нужно знать о новых типах, ведь вы описали абстрактную сущность и абстрактный метод, который есть (реализован?) у всех наследников вашей абстракции.Просто надо сначала заполнить массив наследниками, а только потом обращаться к методу Do. |
Автор: | Иван Денисов [ Вторник, 10 Март, 2015 16:18 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
Гипотетически, если вы хотите, чтобы программа работала с частично заполненным массивом, нужно добавить проверку на наличие объекта. Код: PROCEDURE DoMath* (rs:RecSet);
VAR i:INTEGER; BEGIN FOR i:=0 TO LEN(r)-1 DO IF rs.r[i] # NIL THEN rs.r[i].Do END END; END DoMath; |
Автор: | mixalu [ Вторник, 10 Март, 2015 17:52 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
Разумеется, массив заполняется наследниками, и абстрактный метод реализован (тестовая печать в Log идет при заполнении). Проверять на NIL не нужно, они там либо есть, либо нет, т.е. массив увеличивается только при добавлении объекта. Я еще поковыряюсь, попробую другие варианты. Думаю, проблема в том, что я пока не научился настолько абстрактно мыслить, категориями ООП. И дело именно в архитектурных решениях. Которые надо изучать и практиковаться. Директории ББ = "фабричный метод" в терминологии "Design patterns", как я понимаю? Книга эта есть, но вот с пониманием С++ проблемы, не знаю я его. Что-то из паттернов я применял, не зная, что это паттерн ))) ("обертку" и "прототип", например). |
Автор: | Иван Кузьмицкий [ Вторник, 10 Март, 2015 18:33 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
А вы можете полностью привести исходный текст модуля, вызывающий трап? |
Автор: | mixalu [ Среда, 11 Март, 2015 16:39 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
Иван, могу, но пока это лишнее. Попробую найти причину сам, если ничего не получится, попрошу "помощь зала" ))) Спасибо за готовность помочь! |
Автор: | mixalu [ Суббота, 14 Март, 2015 13:02 ] |
Заголовок сообщения: | Re: Про разработку компонентов.. |
Нашел причину. Как часто бывает, "дело было не в бобине". А просто массив формировался неправильно. Если бы я послушал совета Ивана Денисова и ввел проверку на NIL, все бы выяснилось быстрее. После переделки модулей все работает так, как положено. Продолжаю изучать компонентный подход к проектированию. Спасибо всем за помощь. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |