OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 21:54

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 17 Май, 2010 22:40 

Зарегистрирован: Суббота, 15 Май, 2010 21:38
Сообщения: 3
Прошу пояснить уважаемых знатоков, почему работает указанный код,
хотя в модуле (System)Files имеются только абстрактные определения для объектов Writer/Reader/File:
Код:
MODULE Files;
   IMPORT Kernel;
.....
   PROCEDURE (f: File) Length* (): INTEGER, NEW, ABSTRACT;
   PROCEDURE (f: File) NewReader* (old: Reader): Reader, NEW, ABSTRACT;
   PROCEDURE (f: File) NewWriter* (old: Writer): Writer, NEW, ABSTRACT;
   PROCEDURE (f: File) Flush* (), NEW, ABSTRACT;
   PROCEDURE (f: File) Register* (name: Name; type: Type; ask: BOOLEAN; OUT res: INTEGER), NEW, ABSTRACT;
   PROCEDURE (f: File) Close* (), NEW, ABSTRACT;
   
   PROCEDURE (r: Reader) Base* (): File, NEW, ABSTRACT;
   PROCEDURE (r: Reader) Pos* (): INTEGER, NEW, ABSTRACT;
   PROCEDURE (r: Reader) SetPos* (pos: INTEGER), NEW, ABSTRACT;
   PROCEDURE (r: Reader) ReadByte* (OUT x: BYTE), NEW, ABSTRACT;
   PROCEDURE (r: Reader) ReadBytes* (VAR x: ARRAY OF BYTE; beg, len: INTEGER), NEW, ABSTRACT;
   
   PROCEDURE (w: Writer) Base* (): File, NEW, ABSTRACT;
   PROCEDURE (w: Writer) Pos* (): INTEGER, NEW, ABSTRACT;
   PROCEDURE (w: Writer) SetPos* (pos: INTEGER), NEW, ABSTRACT;
   PROCEDURE (w: Writer) WriteByte* (x: BYTE), NEW, ABSTRACT;
   PROCEDURE (w: Writer) WriteBytes* (IN x: ARRAY OF BYTE; beg, len: INTEGER), NEW, ABSTRACT;

Код:
MODULE ExamplesReadFile;
 IMPORT Log, Files;
 PROCEDURE ReadFileBytes*;
  VAR file: Files.File; reader: Files.Reader; b: BYTE;
 BEGIN
   file := Files.dir.Old(Files.dir.This("c:\"), "file.txt", FALSE);
   IF file # NIL THEN
     reader := file.NewReader(NIL);
     IF reader # NIL THEN
       (* ASSERT(~reader.eof); *)
       reader.ReadByte(b);
       WHILE ~reader.eof DO
         Log.Int(b); Log.Ln;
         reader.ReadByte(b)
       END;
       (* ASSERT(reader.eof) *)
     ELSE
       Log.String("Error on open file reader."); Log.Ln
     END;
     file.Close
   ELSE
     Log.String("File open error."); Log.Ln
   END
 END ReadFileBytes;
 
END ExamplesReadFile.


Почему модуль (System)Files неявно подменяется на (Host)Files ?
Есть специальное правило на этот счет ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Май, 2010 22:50 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Потому что HostFiles - это реализация абстрактного интерфейса Files


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 03:49 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
dumper6 писал(а):
Почему модуль (System)Files неявно подменяется на (Host)Files ?
Есть специальное правило на этот счет ?

Он не подменяется. Просто модуль HostFiles помещает в Files.dir свой, вполне себе конкретный, объект. Происходит это в момент загрузки HostFiles. А вы далее везде этот Files.dir пользуете


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 07:16 
Модератор
Аватара пользователя

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

http://oberoncore.ru/programming/oberon-technology

Если читаете по-английски, то рекомендуется:
viewtopic.php?f=60&t=1966 (EthOS - прообраз Блэкбокса, а Шиперски - его ведущий архитектор).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 09:37 

Зарегистрирован: Суббота, 15 Май, 2010 21:38
Сообщения: 3
Спасибо. Материалы поизучаем.

Не хочу показаться занудой, но все таки. :)
Вызов реализации объектов из модуля (Host)Files, когда в программе явно указано использование модуля (System)Files, как минимум напоминает недокументированную возможность ББ.

Вдобавок ломается прозрачная логика работы с модулями ООП (взятая из object-pascal).
Многим программистам это может не понравится.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 09:47 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
dumper6 писал(а):
Вызов реализации объектов из модуля (Host)Files, когда в программе явно указано использование модуля (System)Files, как минимум напоминает недокументированную возможность ББ.


Чего тут недокументированного?

Это обычная многократная виртуализация, через несколько абстрактных интерфейсов. Читайте про паттерны ООП (например, книгу Гаммы и Ко.).

Цитата:
Вдобавок ломается прозрачная логика работы с модулями ООП (взятая из object-pascal).


А причём тут Object Pascal?
Оберон / КП не имеют никакой связи с Борландовскими системами.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 10:29 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
В отличие от Борланда, абстракция и реализация программируются так, что программы связуются через интерфейс абстракции, а не реализации. И всё это посредством директорий.

Стоит прочесть главу 3.4 Создание объектов (F1 -> Design Practices), в документации это описано.

(добавлено позже)

Для работы с абстрактным интерфейсом его нужно реализовать. "Публично" доступна абстрактная часть, а сама реализация упрятана от внешних модулей и они не могут в ней что-то испортить или пользоваться ею напрямую.
Таким образом, для загрузки Блэкбокса в модуле Init указаны модули реализации, которые стыкуются к модулям абстракции через их директории. После стыковки интерфейсы абстракций становятся доступными для работы, так как те модули становятся тогда "умными" и знают что им делать при вызове абстрактных методов.
Если их вызвать до стыка, сработает капкан (trap).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 11:06 

Зарегистрирован: Суббота, 15 Май, 2010 21:38
Сообщения: 3
Роман М. писал(а):
В отличие от Борланда, абстракция и реализация программируются так, что программы связуются через интерфейс абстракции, а не реализации. И всё это посредством директорий.
Стоит прочесть главу 3.4 Создание объектов (F1 -> Design Practices), в документации это описано.
(добавлено позже)
Для работы с абстрактным интерфейсом его нужно реализовать. "Публично" доступна абстрактная часть, а сама реализация упрятана от внешних модулей и они не могут в ней что-то испортить или пользоваться ею напрямую.
Таким образом, для загрузки Блэкбокса в модуле Init указаны модули реализации, которые стыкуются к модулям абстракции через их директории. После стыковки интерфейсы абстракций становятся доступными для работы, так как те модули становятся тогда "умными" и знают что им делать при вызове абстрактных методов.
Если их вызвать до стыка, сработает капкан (trap).

Спасибо за исчерпывающий ответ.
Может стоит включить его в документацию в (System)Files.odc в качестве важного примечания ?
(думаю многим это было бы интересно)

Лично я бы в документации на (System)Files.odc привел пример работы с файлом,
тогда объем примечаний можно сократить приблизительно в 2 раза. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 11:13 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Роман М. писал(а):
В отличие от Борланда, абстракция и реализация программируются так, что программы связуются через интерфейс абстракции, а не реализации. И всё это посредством директорий.

На борланде всё это также прекрасно реализуется, если они конечно абстрактные методы не отменили.

Цитата:
Таким образом, для загрузки Блэкбокса в модуле Init указаны модули реализации, которые стыкуются к модулям абстракции через их директории.

Не совсем так. В Init указана только часть. Другая часть прилинковывается непосредственно в исполняемый файл, командами DevLinker.LinkXXX. И именно из-за этого не получается сделать линкер с простым интерфейсом


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 11:27 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Иван Горячев писал(а):
Не совсем так. В Init указана только часть. Другая часть прилинковывается непосредственно в исполняемый файл, командами DevLinker.LinkXXX. И именно из-за этого не получается сделать линкер с простым интерфейсом

В Init запускается HostMenus, который, в свою очередь, запускает остальные модули подсистемы Hosts.
Не понял связи сборщика DevLinker к Hosts. :?

Иван Горячев писал(а):
На борланде всё это также прекрасно реализуется, если они конечно абстрактные методы не отменили.
Да. У них подход другой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 11:37 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Наверно, речь шла об этом:
:!: DevLinker.Link BlackBox.exe := Kernel$+ Files HostFiles StdLoader

Сборщик связует ядро, абстрактный модуль Files, его реализацию HostFiles и динамический загрузчик модулей StdLoader, вызывающий модуль Init и остальные по мере необходимости.

Подробности об этапах загрузки можно прочесть в теме Загрузка каркаса BlackBox.

добавлено
Вообще, компиляцию и сборку не стоит смешивать. Сборка - отдельная тема.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 12:07 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
dumper6 писал(а):
Может стоит включить его в документацию в (System)Files.odc в качестве важного примечания ?
(думаю многим это было бы интересно)

Лично я бы в документации на (System)Files.odc привел пример работы с файлом,
тогда объем примечаний можно сократить приблизительно в 2 раза. :)


Более общие выкладки уже есть в документации, см. раздел "Приёмы проектирования":

Цитата:
Модули позволяют скрывать классы. Скрытый класс не может быть прямо подтвержден клиентским модулем, поскольку он там невидим. Это позволяет навязать множество непрямых механизмов размещения. Абстрактные типы записей позволяют отделить интерфейсы от исполнения, так что абстрактные типы записей могут быть экспортированы без риска прямого размещения клиентами.


Кроме этого, если посмотреть на интерфейс Files, то легко заметить, что и директория, и класс File, как и их методы, помечены как ABSTRACT.

В описании языка на эту тему есть исчёрпывающая информация:

Цитата:
Переменные типа записей, помеченного как ABSTRACT, не могут быть размещены [instantiated]: не может существовать ни переменных, ни полей такого типа. Абстрактные типы <т.е. описанные с атрибутом ABSTRACT> используются только как типы-предки для других типов записей

и
Цитата:
Абстрактные или пустые методы некоторого типа обычно переопределяются (реализуются) в его потомках.


Вот тут начинается интересное - как узнать, какие именно потомки реализуют абстракцию Files? Я в таких случаях, пользуюсь поиском строки "Files.SetDir" по содержимому файлов каркаса :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

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


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

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


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

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