Нарисовал картинку примерного устройства архитектурной программы.
Под схемой (или над схемой) два слоя: платформа и библиотеки. Оба слоя нарисованы в виде облака, чтобы показать, что это не монолиты. При сборке образа программы (пока ничего не конкретизируем), в него включаются только используемые части платформы и только используемые библиотеки. Платформа обеспечивает переносимость. Если устройство/ОС поддерживает некоторую функциональность, то интерфейс должен быть такой же, как на всех остальных устройствах. Какая-то функциональность может быть не поддержана — это нормально.
Платформа должна быть минимальна, и как правило, должна быть накрыта библиотеками.
Библиотечный слой дает удобство разработчику. Как библиотеки, так и модули (части) платформы импортируются в арки — то есть это обычная статическая связь. Если две арки импортируют библиотеку, то в образе программы она находится в одном экземпляре. Естественно, тут есть проблема версионности. Решаться она может разрешением использовать несколько версий библиотеки (то есть проблема есть, но это проблема правильного дизайна библиотек). Уточняю: Если две арки импортируют одинаковую версию библиотеки, то а образе программы она находится в одном экземпляре.
Вопрос о выборе формы для некоторой функциональности: делать арку или библиотеку, должен решаться в каждом случае.
Посмотрим теперь над облаками — там два верстака, к которым подключены арки. Рисунок, наверно, не идеальный, но пока мне его достаточно.
И раз облака присутствуют всегда и строятся автоматически, то мы можем убрать их с картинки:
Стрелка между 1-м (В1) и 2-м (В2) верстаком структурная (родительская). Стрелок между арками не нарисовано, хотя они могут взаимодействовать между собой, но эти стрелки другого вида.
Вообще есть стрелки (связи) трех видом:
- стрелки импорта (см. полную схему). Арка (а верстак это тоже арка) может импортировать библиотеки, а библиотеки платформу.
- структурные стрелки в схеме — родитель-потомок
- и не нарисованные здесь стрелки взаимодействия, которые строятся в процессе запуска схемы или в процессе работы.
Ну и последнее, минимальная программа — типа hello, world — это один верстак и один инструмент. По сути, любая не-архитектурная программа тривиально преобразуется в вырожденную архитектурную из одной арки.
А дальше, эту арку можно структурировать. Например, если вспомнить мой опус про https, то для обеспечения заменяемости протокола достаточно сделать такую схему:
Где А1 — это вся программа, ну например, apache (кроме протокола), а А2 — это арка, реализующая безопасный протокол.
Постоянная ссылка
Добрый день. Интересно, что в схему программы вы не включаете runtime-взаимодействия, хотя мне кажется, что они на практике примерно настолько же устойчивы (и гораздо более информативны) чем отношения родитель-дочка (aka часть-целое). Ср. например, с компонентной диаграммой UML в моем примере: https://github.com/iamhere2/HLCD-Researches/blob/master/ChessApp/dgm/Images/SyncFlow/ChessApp-SyncFlow-L1-simple.png
Возможно, это потому, что все взаимодействия, адресации, и диспетчеризацию до методов вы принципиально хотите делать динамическими. Тогда это, действительно, не нарисуешь, не проконтролируешь на уровне синтаксиса, ничего нельзя заранее сказать — мало ли какая арка захочет какую другую позвать?
Но не является ли это как раз отходом от принципов и замысла явной архитектурной схемы программы? Мой тезис — на верхних уровнях схема а) устойчива, б) архитектурна в т.ч. и во взаимодействиях, а не только в уровнях вложенности, а значит — это должно быть в схеме и в коде арок.