Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
Следующая версия
Следующая версия справа и слева
|
bbextendnohost [2013/12/21 01:04] kpmy |
bbextendnohost [2013/12/21 01:09] kpmy разметка |
А при дальнейшем расширении абстракций необходимо учитывать, что платформо-зависимые интерфейсы могут привести к "протеканию" абстракции. | А при дальнейшем расширении абстракций необходимо учитывать, что платформо-зависимые интерфейсы могут привести к "протеканию" абстракции. |
| |
На примере простой абстракции местоположение файла Files.Locator (далее **локатор**) рассмотрим возможные варианты решения. | На примере простой абстракции местоположение файла ''Files.Locator'' (далее **локатор**) рассмотрим возможные варианты решения. |
| |
[[http://oberoncore.ru/projects/bb-docu-ru|Русская документация по BlackBox]] | [[http://oberoncore.ru/projects/bb-docu-ru|Русская документация по BlackBox]] |
| |
===== Что требуется? ===== | ===== Что требуется? ===== |
Расширить возможности базового типа Files.Locator в ряде задач при сохранении неизменности интерфейса Files.Locator, сохранении возможности работы с альтернативными реализациями абстракции локатора, а так же минимизация платформо-зависимости прикладного компонента. | Расширить возможности объекта базового типа ''Files.Locator'' в ряде задач при сохранении неизменности интерфейса ''Files.Locator'', сохранение возможности работы с альтернативными реализациями локатора, а так же минимизация платформо-зависимости прикладного компонента. |
| |
===== Варианты решения ===== | ===== Варианты решения ===== |
==== Использование возможностей расширения абстракции ==== | ==== Использование возможностей расширения абстракции ==== |
Учитывая проблему возможного раздувания интерфейса, а так же тот факт, что единственным способом расширения интерфейса локатора является наследование, предлагается выполнить отвязку доступных функций локатора от интерфейса базового класса. Используем возможности шаблона "Объект-сообщение" для обеспечения параметрического полиморфизма методов локатора (в рамках языка Компонентный Паскаль полиморфизм реализуется данным образом). | Учитывая проблему возможного раздувания интерфейса, а так же тот факт, что единственным способом расширения интерфейса локатора является наследование, предлагается выполнить отвязку доступных функций локатора от интерфейса базового класса. Используем возможности шаблона "Объект-сообщение" для обеспечения параметрического полиморфизма методов локатора (в рамках языка Компонентный Паскаль полиморфизм реализуется данным образом). |
Для этого опишем класс-наследник локатора: OberFiles.Locator, в интерфейс которого добавим метод .HandleMsg(VAR msg: ANYREC). Реализацию этого локатора разместим в модуле OberHostFiles.Locator. В данной реализации мы используем возможности модуля HostFiles, для простоты. При этом, понятно, что реализация локатора с хэндлером может быть размещена сразу в реализации файловой подсистемы BlackBox, так как OberFiles.Locator по-прежнему является абстрактным типом. | Для этого опишем класс-наследник локатора: ''OberFiles.Locator'', в интерфейс которого добавим метод ''.HandleMsg(VAR msg: ANYREC)''. Реализацию этого локатора разместим в модуле ''OberHostFiles.Locator''. В данной реализации мы используем возможности модуля HostFiles, для простоты. При этом, понятно, что реализация локатора с хэндлером может быть размещена сразу в реализации файловой подсистемы BlackBox, так как ''OberFiles.Locator'' по-прежнему является абстрактным типом. |
Важной частью системы является механизм автоматического приведения типа Files.Locator к типу HostFiles.Locator, при этом фактический результат операции приведения может содержать объект-обертку, так как с различными реализациями локатора могут быть связаны различные модули-реализации OberFiles.Locator (например, HostFiles <- OberHostFiles). | Важной частью системы является механизм автоматического приведения типа ''Files.Locator'' к типу ''HostFiles.Locator'', при этом фактический результат операции приведения может содержать объект-обертку, так как с различными реализациями локатора могут быть связаны различные модули-реализации ''OberFiles.Locator'' (например, HostFiles <- OberHostFiles). |
<code> | <code> |
PROCEDURE GuardLoc*(loc: Files.Locator): Locator; | PROCEDURE GuardLoc*(loc: Files.Locator): Locator; |
</code> | </code> |
Опираясь на базовый тип ANYREC мы описываем протокол (набор типов сообщений) взаимодействия с локатором, при этом, сам локатор не зависит от этих протоколов, они обрабатываются только в реализации OberHostFiles. | Опираясь на базовый тип ANYREC мы описываем протокол (набор типов сообщений) взаимодействия с локатором, при этом, сам локатор не зависит от этих протоколов, они обрабатываются только в реализации OberHostFiles. |
Таким образом, описав сообщение GetPathStringMsg мы получаем возможность запросить у локатора текстовый путь. | Таким образом, описав сообщение ''GetPathStringMsg'' мы получаем возможность запросить у локатора текстовый путь. |
Также подобные протоколы могут быть описаны в сторонних компонентах. Такие протоколы могут иметь разную детализацию аспектов платформы, тем самым позволяя разработчику гибко регулировать платформо-зависимость своего прикладного компонента. | Также подобные протоколы могут быть описаны в сторонних компонентах. Такие протоколы могут иметь разную детализацию аспектов платформы, тем самым позволяя разработчику гибко регулировать платформо-зависимость своего прикладного компонента. |
<code>VAR loc: Files.Locator; ober: OberFiles.Locator; gpm: OberProtocol.GetPathStringMsg; | <code>VAR loc: Files.Locator; ober: OberFiles.Locator; gpm: OberProtocol.GetPathStringMsg; |