OberonCore
https://forum.oberoncore.ru/

Вопрос о реализации абстрактных методов модуля Files
https://forum.oberoncore.ru/viewtopic.php?f=23&t=2649
Страница 1 из 1

Автор:  dumper6 [ Понедельник, 17 Май, 2010 22:40 ]
Заголовок сообщения:  Вопрос о реализации абстрактных методов модуля Files

Прошу пояснить уважаемых знатоков, почему работает указанный код,
хотя в модуле (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 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

Потому что HostFiles - это реализация абстрактного интерфейса Files

Автор:  Иван Горячев [ Вторник, 18 Май, 2010 03:49 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

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

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

Автор:  Илья Ермаков [ Вторник, 18 Май, 2010 07:16 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

Посмотрите:

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

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

Автор:  dumper6 [ Вторник, 18 Май, 2010 09:37 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

Спасибо. Материалы поизучаем.

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

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

Автор:  Илья Ермаков [ Вторник, 18 Май, 2010 09:47 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

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


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

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

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


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

Автор:  Роман М. [ Вторник, 18 Май, 2010 10:29 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

В отличие от Борланда, абстракция и реализация программируются так, что программы связуются через интерфейс абстракции, а не реализации. И всё это посредством директорий.

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

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

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

Автор:  dumper6 [ Вторник, 18 Май, 2010 11:06 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

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

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

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

Автор:  Иван Горячев [ Вторник, 18 Май, 2010 11:13 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

Роман М. писал(а):
В отличие от Борланда, абстракция и реализация программируются так, что программы связуются через интерфейс абстракции, а не реализации. И всё это посредством директорий.

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

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

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

Автор:  Роман М. [ Вторник, 18 Май, 2010 11:27 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

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

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

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

Автор:  Роман М. [ Вторник, 18 Май, 2010 11:37 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

Наверно, речь шла об этом:
:!: DevLinker.Link BlackBox.exe := Kernel$+ Files HostFiles StdLoader

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

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

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

Автор:  Иван Кузьмицкий [ Вторник, 18 Май, 2010 12:07 ]
Заголовок сообщения:  Re: Вопрос о реализации абстрактных методов модуля Files

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

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


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

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


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

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

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

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


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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/