Инструменты пользователя

Инструменты сайта


bb:nohost

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
bb:nohost [2016/04/03 12:23]
prospero78 [Понятие компонента]
bb:nohost [2016/04/06 20:15]
prospero78 [Устранение зависимостей от подсистемы Host]
Строка 10: Строка 10:
    
 ==== Понятие компонента ==== ==== Понятие компонента ====
-**Компонент** с точки зрения каркаса является совокупностью скомпилированных модулей. Модули могут использовать возможности других модулей, таким образом появляется **зависимость** (обозначена стрелкой по направлению от зависимого модуля к необходимому). FIXME ( А картинка где?  Ссылка ведёт на ДропБокс)+**Компонент** с точки зрения каркаса является совокупностью скомпилированных модулей. Модули могут использовать возможности других модулей, таким образом появляется //зависимость// (обозначена стрелкой по направлению от зависимого модуля к необходимому). FIXME ( А картинка где?  Ссылка ведёт на ДропБокс)
  
 Компоненты можно разделить на две группы: Компоненты можно разделить на две группы:
Строка 28: Строка 28:
 ==== Системный слой ==== ==== Системный слой ====
 Рассмотрим устройство системного слоя в [эталоне](http://oberoncore.ru/blackbox/oberoncore_official_position) **BlackBox**. Рассмотрим устройство системного слоя в [эталоне](http://oberoncore.ru/blackbox/oberoncore_official_position) **BlackBox**.
-Основой системы является модуль *Kernel*, который реализует поддержку //этапа выполнения// для приложений **BlackBox** (см. [документацию](http://oberoncore.ru/library/ermakov_vnutrennij_interfejs_kernel) *Kernel*). +Основой системы является модуль *Kernel*, который реализует поддержку //этапа выполнения// для приложений **BlackBox** (см. [документацию](http://oberoncore.ru/library/ermakov_vnutrennij_interfejs_kernel) ''Kernel''). 
-Модуль *Kernelиспользует возможности операционной системы (на рисунке эта зависимость обозначена красной стрелкой). +Модуль ''Kernel'' использует возможности операционной системы (на рисунке эта зависимость обозначена красной стрелкой). 
-Для работы клиентских (прикладных) модулей необходимы базовые //абстракции// файловой системы, оконной системы, отображений, контейнеров, диалогов и т. п. В эталоне эти //абстракции// собраны в подсистеме *System(см. рис.), часть реализаций которых платформо-независима, а часть платформо-зависима. Платформо-независимые реализации *Systemсодержатся в подсистеме *Std*. В то же время, в подсистеме *Stdесть такие абстракции, которым тоже необходима платформо-зависимая реализация (например, элементы управления и диалоговые окна). Платформо-зависимые реализации *Systemи *Stdсодержатся в подсистеме *Host*.+Для работы клиентских (прикладных) модулей необходимы базовые //абстракции// файловой системы, оконной системы, отображений, контейнеров, диалогов и т. п. В эталоне эти //абстракции// собраны в подсистеме ''System'' (см. рис.), часть реализаций которых платформо-независима, а часть платформо-зависима. Платформо-независимые реализации ''System'' содержатся в подсистеме ''Std''. В то же время, в подсистеме ''Std'' есть такие абстракции, которым тоже необходима платформо-зависимая реализация (например, элементы управления и диалоговые окна). Платформо-зависимые реализации ''System'' и ''Std'' содержатся в подсистеме ''Host''.
  
-Разделение *Systemна абстрактный интерфейс и платформо-зависимую реализацию позволяет добиться //герметичности// платформо-независимой части //системного слоя//. Герметичность позволяет заменять платформо-зависимые системные модули без модификации клиентских модулей.+Разделение ''System'' на абстрактный интерфейс и платформо-зависимую реализацию позволяет добиться //герметичности// платформо-независимой части //системного слоя//. Герметичность позволяет заменять платформо-зависимые системные модули без модификации клиентских модулей.
  
 //Герметичность// здесь понимается как отсутствие [[http://www.joelonsoftware.com/articles/LeakyAbstractions.html|протечек абстракций]] системного и прикладного слоя. //Герметичность// здесь понимается как отсутствие [[http://www.joelonsoftware.com/articles/LeakyAbstractions.html|протечек абстракций]] системного и прикладного слоя.
  
-В идеале, абстракции системного слоя должны удовлетворять всем потребностям прикладного слоя. Но, по историческим причинам, в эталонной сборке **BlackBox** системные абстракции не идеальны и поэтому имеются **нарушения герметичности** системного слоя (также обозначенные на рисунке красными стрелками), что приводит к прямой или косвенной (строковые константы и т.д.) зависимости прикладных модулей от операционной системы. +В идеале, абстракции системного слоя должны удовлетворять всем потребностям прикладного слоя. Но, по историческим причинам, в эталонной сборке **BlackBox** системные абстракции не идеальны и поэтому имеются **нарушения герметичности** системного слоя (также обозначенные на рисунке красными стрелками) FIXME , что приводит к прямой или косвенной (строковые константы и т. д.) зависимости прикладных модулей от операционной системы. 
  
 # Решение проблемы нарушения герметичности # # Решение проблемы нарушения герметичности #
Строка 42: Строка 42:
 ## Модификация модуля Kernel ## ## Модификация модуля Kernel ##
  
-На схеме показаны зависимости прикладного и системного слоя от модуля *Kernel*+На схеме показаны зависимости прикладного и системного слоя от модуля ''Kernel''.
  
-Эти зависимости не позволяют нам произвести безопасную замену модуля *Kernel*, например, при замене операционной системы. Безопасность, в данном случае, это //соблюдение контрактов интерфейса//. Текущий интерфейс модуля *Kernelявно зависит от модуля *WinApi*, что предполагает изменение этого интерфейса (а значит контрактов), при смене ОС. Это и есть нарушение герметичности системного слоя **БлэкБокса**.+Эти зависимости не позволяют нам произвести безопасную замену модуля ''Kernel'', например, при замене операционной системы. Безопасность, в данном случае, это //соблюдение контрактов интерфейса//. Текущий интерфейс модуля ''Kernel'' явно зависит от модуля ''WinApi'', что предполагает изменение этого интерфейса (а значит контрактов), при смене ОС. Это и есть нарушение герметичности системного слоя **БлэкБокса**.
  
-В целях устранения данного нарушения герметичности предлагается разделение интерфейса модуля *Kernelна платформо-независимую (условно: Pascal_kernel) и платформо-зависимую части(условно: Win32kernelWin64kernelLin32kernelLin64kernel и т. д.).+В целях устранения данного нарушения герметичности предлагается разделение интерфейса модуля ''Kernel'' на платформо-независимую (условно: ''(Kernel)Pascal'') и платформо-зависимую части(условно: ''(Kernel)Win32''''(Kernel)Win64''''(Kernel)Lin32''''(Kernel)Lin64'' и т. д.).
  
 Плюсом данного решения является **полное изолирование** клиентских модулей от платформы.  Плюсом данного решения является **полное изолирование** клиентских модулей от платформы. 
  
-Минусом является то, что модуль *Kernelэто //специфический// системный модуль: **невозможно** наверняка предугадать абстракции, которые могут понадобиться клиентам. А необходимые для работы каркаса низкоуровневые функции *Kernel(ассемблерный код, прямая работа с памятью) не могут быть реализованы (или хотя бы представлены в виде абстракций) платформо-независимо. +Минусом является то, что модуль ''Kernel'' это //специфический// системный модуль: **невозможно** наверняка предугадать абстракции, которые могут понадобиться клиентам. А необходимые для работы каркаса низкоуровневые функции ''Kernel'' (ассемблерный код, прямая работа с памятью) не могут быть реализованы (или хотя бы представлены в виде абстракций) платформо-независимо. 
  
-Решением данной проблемы может стать использование специальных соглашений и разделение платформо-зависимых компонентов на абстракции и платформо-зависимые реализации (Host-компоненты)(( --- //[[prospero.78.su@gmail.com|Валерий Шипков]] 2016/04/03 12:16//  Имхо, *Kernelдолжен _гарантированно_ использовать только те абстракции и реализации, которые будут доступны везде )). +Решением данной проблемы может стать использование специальных соглашений и разделение платформо-зависимых компонентов на абстракции и платформо-зависимые реализации (Host-компоненты)(( --- //[[prospero.78.su@gmail.com|Валерий Шипков]] 2016/04/03 12:16//  Имхо, ''Kernel'' должен _гарантированно_ использовать только те абстракции и реализации, которые будут доступны везде )). 
  
 ## Устранение зависимостей от подсистемы Host ## ## Устранение зависимостей от подсистемы Host ##
  
-Модули подсистем *Stdи *System*, входящие в эталон BlackBox, по большей части являются платформо-независимыми. Однако, в некоторых местах обнаруживаются прямые (импорт) или косвенные (через строковые константы/ресурсы, отображения на формах и т.д.) зависимости от подсистемы *Host*.+Модули подсистем ''Std'' и ''System'', входящие в эталон **BlackBox**, по большей части являются платформо-независимыми. Однако, в некоторых местах обнаруживаются прямые (импорт) или косвенные (через строковые константы/ресурсы, отображения на формах и т. д.) зависимости от подсистемы ''Host''.
  
-Эти зависимости в той или иной степени обеспечивают функционирование эталона, при этом ухудшая его платформо-независимость. Так как функциональность *Hostнужна системному слою, то необходимо сохранить её, но уже с использованием герметичных решений. +Эти зависимости в той или иной степени обеспечивают функционирование эталона, при этом ухудшая его платформо-независимость. Так как функциональность ''Host'' нужна системному слою, то необходимо сохранить её, но уже с использованием герметичных решений. 
  
-Для устранения зависимости подсистемы *Stdот *Hostвведём ряд дополнительных абстракций в подсистему *System*, которые заместят необходимые ранее зависимости. А подсистему *Hostдополним подсистемой *PascalHost*, в которой находятся реализации этих абстракций(Win32HostWin64HostLin32HostLin64Host).+Для устранения зависимости подсистемы ''Std'' от ''Host'' введём ряд дополнительных абстракций в подсистему ''System'', которые заместят необходимые ранее зависимости. А подсистему ''Host'' дополним подсистемой ''(Host)Pascal'', в которой находятся реализации этих абстракций( ''(Host)Win32''''(Host)Win64''''(Host)Lin32''''(Host)Lin64'').
  
-Некоторые прямые и косвенные зависимости (формы, строковые ресурсы) подсистем *Stdи *Systemмогут быть перемещены в подсистему *Hostцеликом, или частично. Например, модуль *StdMenuToolили содержимое меню *(System)Menus*, которое состоит из текстовых команд зависящих от подсистемы *Host*. Такие команды могут быть размещены в меню *(Host)Menus*.+Некоторые прямые и косвенные зависимости (формы, строковые ресурсы) подсистем ''Std'' и ''System'' могут быть перемещены в подсистему ''Host'' целиком, или частично. Например, модуль ''StdMenuTool'' или содержимое меню ''(System)Menus'', которое состоит из текстовых команд зависящих от подсистемы ''Host''. Такие команды могут быть размещены в меню ''(Host)Menus''.
  
-Прикладные компоненты с зависимостями от *Host*, должны быть аналогичным образом преобразованы в набор абстракций и Host-реализаций.+Прикладные компоненты с зависимостями от ''Host'', должны быть аналогичным образом преобразованы в набор абстракций и Host-реализаций.
  
 ---- ----
bb/nohost.txt · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)