OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 11 Декабрь, 2018 20:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Понедельник, 09 Март, 2015 20:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9060
Откуда: Россия, Орёл
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) размещаются в памяти не ядром и не загрузчиком, они уже заготовлены компилятором в модуле "как есть". Модуль целиком подгружается в память - и настраиваются все адреса внутри (+ смещение в памяти, по которому загружен модуль).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Понедельник, 09 Март, 2015 20:18 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9060
Откуда: Россия, Орёл
mixalu писал(а):

Меня смущает, что модуль (назовем его Math) и его методы (DoMath) работают с указателями на абстрактный Rec, "не зная" о конкретных типах.


Не смущайтесь!
В этом вся соль ООП - возможность написания кода, который работает с заранее неизвестными типами объектов.

Более того, типов этих вообще может не существовать в природе. Их через год напишет программист Вася, модуль динамически загрузится в ББ - и Ваш модуль будет работать с типом Васи.

Так обеспечивается расширяемость, эволюция объектных систем.

Почитайте тут статейки:
http://oberoncore.ru/library/start
Губанов С. Ю. Секреты модульных систем
Pfister C. Component Software / Пфистер К. Компонентное программное обеспечение
(Пфистер - ген. дир. Oberon Microsystems, разработавшей ББ)
Оно, конечно, сейчас в некоторых моментах читается наивно (в плане предвкушений "рынка компонент" и др., это были завышенные ожидания на фоне MS COM и подобного - всё же рынок бинарных компонент настолько не состоялся и не состоится, как open-source-"рынок").


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Понедельник, 09 Март, 2015 21:13 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1537
Откуда: Беларусь, Минск
Илья Ермаков писал(а):
В этом вся соль ООП - возможность написания кода, который работает с заранее неизвестными типами объектов.
У меня складывается впечатление, что вопрос немного про другое. И ответ на него - ООП позволяет писать код, который работает с заранее неизвестными типами. А на момент, когда он их использует, он о них уже знает. Как это делается? Способ далеко не один. Разработчики ББ особо полюбили директории.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Вторник, 10 Март, 2015 09:44 

Зарегистрирован: Пятница, 15 Апрель, 2011 22:41
Сообщения: 13
Илья, Иван, спасибо! Статьи эти я читал, общий принцип понятен. Практически - не совсем.
Цитата:
У меня складывается впечатление, что вопрос немного про другое. И ответ на него - ООП позволяет писать код, который работает с заранее неизвестными типами. А на момент, когда он их использует, он о них уже знает. Как это делается? Способ далеко не один. Разработчики ББ особо полюбили директории.

Именно так. Я так и понял, что нужно изучать паттерны, как ни крути.
А код в таком виде, как у меня, все же не работает. И это логично: в момент исполнения модуль не знает о новых типах. Вылетает трап. А вот на VBA аналогичная схема работает. Но там интерпретируемый язык и позднее связывание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Вторник, 10 Март, 2015 09:55 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
mixalu писал(а):
А код в таком виде, как у меня, все же не работает. И это логично: в момент исполнения модуль не знает о новых типах. Вылетает трап.
Модулю и не нужно знать о новых типах, ведь вы описали абстрактную сущность и абстрактный метод, который есть (реализован?) у всех наследников вашей абстракции.

Просто надо сначала заполнить массив наследниками, а только потом обращаться к методу Do.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Вторник, 10 Март, 2015 16:18 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2231
Гипотетически, если вы хотите, чтобы программа работала с частично заполненным массивом, нужно добавить проверку на наличие объекта.
Код:
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Вторник, 10 Март, 2015 17:52 

Зарегистрирован: Пятница, 15 Апрель, 2011 22:41
Сообщения: 13
Разумеется, массив заполняется наследниками, и абстрактный метод реализован (тестовая печать в Log идет при заполнении).
Проверять на NIL не нужно, они там либо есть, либо нет, т.е. массив увеличивается только при добавлении объекта.
Я еще поковыряюсь, попробую другие варианты. Думаю, проблема в том, что я пока не научился настолько абстрактно мыслить, категориями ООП. И дело именно в архитектурных решениях. Которые надо изучать и практиковаться.
Директории ББ = "фабричный метод" в терминологии "Design patterns", как я понимаю? Книга эта есть, но вот с пониманием С++ проблемы, не знаю я его. Что-то из паттернов я применял, не зная, что это паттерн ))) ("обертку" и "прототип", например).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Вторник, 10 Март, 2015 18:33 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
А вы можете полностью привести исходный текст модуля, вызывающий трап?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Среда, 11 Март, 2015 16:39 

Зарегистрирован: Пятница, 15 Апрель, 2011 22:41
Сообщения: 13
Иван, могу, но пока это лишнее. Попробую найти причину сам, если ничего не получится, попрошу "помощь зала" )))
Спасибо за готовность помочь!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Про разработку компонентов..
СообщениеДобавлено: Суббота, 14 Март, 2015 13:02 

Зарегистрирован: Пятница, 15 Апрель, 2011 22:41
Сообщения: 13
Нашел причину. Как часто бывает, "дело было не в бобине". А просто массив формировался неправильно. Если бы я послушал совета Ивана Денисова и ввел проверку на NIL, все бы выяснилось быстрее. После переделки модулей все работает так, как положено.
Продолжаю изучать компонентный подход к проектированию. Спасибо всем за помощь.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB