1. Введение
1.1. Назначение
FASA определяет набор архитектурных правил и ограничений для построения программных систем, основанных на прямом взаимодействии компонентов через контракты. Спецификация гарантирует детерминированный граф зависимостей, отсутствие скрытых слоёв абстракции в коде и предсказуемую эволюцию интерфейсов.
1.2. Философия архитектуры
-
Плоскостность: Отказ от иерархических слоёв (presentation/domain/data, gateway, adapter и т.п.). Все компоненты находятся на одном уровне видимости в графе зависимостей.
-
Прямая передача: Данные и управление передаются между реализациями напрямую согласно сигнатуре интерфейса. Любая трансформация, маршрутизация или сериализация является частью бизнес-логики реализации, а не отдельным архитектурным компонентом.
-
Контекстная адаптивность: Программный интерфейс не привязан к механизму вызова. Он может быть реализован как статический контракт, сетевой протокол, IPC-канал или соглашение обмена сообщениями в зависимости от среды исполнения.
-
Строгая ацикличность: Все зависимости образуют направленный ациклический граф (DAG). Циклы запрещены на любом уровне.
2. Архитектурные сущности
Система FASA состоит исключительно из трёх типов сущностей:
|
Сущность |
Обозначение |
Описание |
|---|---|---|
|
Программный интерфейс |
|
Контракт взаимодействия. Определяет сигнатуры, сообщения, потоки данных или протоколы. Не содержит исполняемого кода и состояния. |
|
Реализация |
|
Конкретная логика, состояние или процесс, удовлетворяющий одному или нескольким |
|
Пользовательский интерфейс |
|
Точка входа для взаимодействия с человеком или внешней средой (CLI, GUI, TUI, API-шлюз для клиентов). Потребляет |
3. Семантика и инфраструктура
3.1. Граница ответственности
FASA регулирует семантический уровень системы — то, как компоненты взаимодействуют на уровне контрактов и зависимостей в исходном коде. Инфраструктурный уровень (сети, балансировка, брокеры, оркестрация) находится за пределами архитектурного графа FASA и подчиняется иным правилам.
3.2. Что относится к семантике (под контролем FASA)
-
Объявление и использование
SI,I,UIв исходном коде -
Направление зависимостей между модулями/пакетами/компонентами
-
Сигнатуры методов, форматы сообщений, гарантии контрактов
-
Версионирование интерфейсов и политика совместимости
-
Логика обработки данных и управления потоком исполнения
3.3. Что относится к инфраструктуре (вне контроля FASA)
|
Компонент |
Роль |
Почему не нарушает FASA |
|---|---|---|
|
Балансировщик нагрузки |
Распределение запросов между экземплярами |
Работает на уровне сети, не вносит изменений в контракты или зависимости кода |
|
Брокер сообщений (Kafka, RabbitMQ) |
Асинхронная доставка событий |
Является каналом передачи, а не архитектурной сущностью; |
|
Service Mesh / Sidecar |
Observability, retry, circuit breaker |
Прозрачен для бизнес-логики; не вводит новых |
|
API Gateway / Reverse Proxy |
Маршрутизация внешних запросов |
Точка входа для |
|
Оркестратор (Kubernetes, systemd) |
Запуск, масштабирование, health-checks |
Управляет жизненным циклом процессов, но не влияет на структуру зависимостей в коде |
3.4. Критерий разделения
Компонент считается инфраструктурным (и допустимым), если выполняются оба условия:
-
Он не объявляет и не потребляет
SI, определённые в рамках предметной области системы. -
Его удаление или замена не требует изменения исходного кода
IилиSI(только конфигурации развёртывания).
4. Правила зависимостей и плоскостность
4.1. Допустимые зависимости
-
I -> SI: Обязательная. Каждая реализация должна удовлетворять минимум одному программному интерфейсу. -
I -> I: Разрешена. Реализация может использовать другие реализации для делегирования или композиции. -
SI -> SI: Разрешена. Интерфейсы могут расширять или ссылаться на другие интерфейсы. -
UI -> SI/UI -> I: Разрешена. Пользовательский интерфейс подключается к системе через контракты или напрямую к реализациям.
4.2. Запрещённые зависимости
-
SI -> I: Строго запрещено. Контракт не может знать о существовании конкретных реализаций. -
* -> UI: Запрещено. Ни один внутренний компонент не должен зависеть от пользовательского интерфейса. -
Циклы: Запрещены любые циклические зависимости (
SI<->SI,I<->I,I<->SIи т.д.). -
Промежуточные компоненты: Запрещено создавать выделенные адаптеры, транспортеры, фасадные модули или шлюзы, единственная задача которых — преобразовывать или перенаправлять вызовы между
IиSI.
4.3. Принцип плоскостности
Все вызовы происходят напрямую. Если в процессе взаимодействия требуется преобразование данных, изменение протокола или маршрутизация, эта логика должна быть инкапсулирована внутри самой реализации I, а не вынесена в отдельный компонент графа зависимостей.
5. Версионирование и политика совместимости
5.1. Схема версионирования
-
Версионирование применяется только к
SI. -
Используется стандарт SemVer (
MAJOR.MINOR.PATCH). -
Версии
IиUIуправляются независимо и не обязаны синхронизироваться сSI.
5.2. Обратная совместимость (MINOR / PATCH)
Пока мажорная версия не изменена, любые обновления SI обязаны сохранять полную обратную совместимость:
-
+ Добавление новых операций, полей, сообщений или опциональных параметров
-
+ Исправление ошибок, не меняющее семантику контракта
-
— Удаление, переименование или изменение порядка существующих элементов
-
— Ужесточение требований к валидации, типам или состоянию
5.3. Мажорные обновления и правило двойной поддержки
При публикации ломающих изменений (MAJOR версия увеличивается, напр. v2.x -> v3.0.0):
-
Предыдущая мажорная версия переводится в статус
Legacy. -
Все новые и обновляемые реализации
Iобязаны удовлетворять контрактам двух версий одновременно: текущей (vM.x) и предыдущей (v(M-1).x). -
Это требование действует на протяжении всего жизненного цикла
vM.xдо выходаv(M+1).0.
5.4. Политика устаревания (N-1 Rule)
-
Обязательная поддержка: Только две последние мажорные версии (
MиM-1). -
Опциональная поддержка: Версии
M-2и старше рекомендуются для работы с legacy-системами, но не требуются спецификацией. -
Пример: При наличии в экосистеме
SI v1.x,v2.xиv3.x, реализация дляv3.xобязана поддерживатьv2.x, но не обязана поддерживатьv1.x.
5.5. Техническая реализация двойной поддержки
Двойная поддержка реализуется внутри одной I и не является выделенным слоем:
-
В статических средах: параллельная реализация двух контрактов с общим приватным ядром логики.
-
В IPC/сетевых средах: проверка маркера версии в заголовке сообщения и ветвление парсера/маршрутизатора внутри процесса.
-
В динамических средах: условная регистрация методов/обработчиков в зависимости от запрошенной версии контракта.
6. Контекстная адаптация интерфейсов
SI определяет что требуется, но не как это будет передано. Механизм привязки определяется контекстом развёртывания:
|
Контекст |
Пример проявления |
Примечание |
|---|---|---|
|
In-process (статический) |
Типаж, протокол, интерфейс языка |
Разрешается на этапе компиляции |
|
IPC / Локальная сеть |
UNIX-сокет, gRPC, JSON-RPC, ZeroMQ |
Привязка через адрес/порт/имя канала |
|
Pipe / Stdio |
LSP, CLI-протоколы, кастомные форматы |
Соглашение чтения/записи в потоки |
|
Событийная модель |
Топик брокера сообщений, EventBus |
Контракт сообщения + гарантии доставки |
Правило: Выбор механизма привязки не вводит новых сущностей в граф зависимостей. Он конфигурируется на этапе сборки, развёртывания или инициализации окружения времени исполнения.
7. Идентификация соответствия спецификации
7.1. Формат маркера соответствия
Для явного указания уровня соответствия системы правилам FASA используется строковый идентификатор следующего формата:
FASA.<spec-version>-<punct1>.<punct2>...<punctN>
|
Часть |
Описание |
Пример |
|---|---|---|
|
|
Фиксированный префикс |
|
|
|
Версия спецификации, с которой достигается соответствие (формат SemVer) |
|
|
|
Код подтверждённого правила (punct = point of compliance) |
|
7.2. Реестр кодов соответствия (puncts)
|
Код |
Название |
Описание правила |
|---|---|---|
|
|
No Adapters |
В графе зависимостей отсутствуют выделенные адаптеры, транспортеры или фасадные компоненты |
|
|
Versioning Compliance |
Реализована политика версионирования |
|
|
Acyclic Dependencies |
Граф зависимостей валидирован как DAG; циклы отсутствуют |
|
|
UI Isolation |
Ни один компонент |
|
|
Context Binding |
|
|
|
Direct Transfer |
Все данные передаются напрямую между |
7.3. Примеры маркеров
-
FASA.1.0-na.vc.ac— система соответствует спецификации 1.0, соблюдает правила: отсутствие адаптеров, версионирование с поддержкой двух мажорных версий, ацикличность графа. -
FASA.0.9.3-na— частичное соответствие черновой версии 0.9.3, подтверждено только правилоna. -
FASA.1.0-na.vc.ac.ui.cb.dt— полное соответствие всем базовым правилам спецификации 1.0.
7.4. Правила использования маркеров
-
Маркер размещается в метаданных проекта:
README,package.json,Cargo.toml, заголовке репозитория или документации. -
Указание маркера подразумевает наличие автоматизированных проверок (тестов, линтеров, CI-шагов), подтверждающих заявленные правила.
-
При обновлении спецификации проект должен явно обновить маркер (например, с
FASA.0.9.3наFASA.1.0), если подтверждает новые требования. -
Частичное соответствие допустимо: можно указать только те
punct, которые реализованы. Отсутствие кода означает, что правило не проверяется или не соблюдается.
8. Валидация и контроль соответствия
8.1. Чек-лист соответствия FASA
-
Все
SIне содержат ссылок наI -
Граф зависимостей является DAG (нет циклов)
-
Каждая
Iзависит минимум от одногоSI -
Отсутствуют выделенные адаптеры/транспортеры между
IиSI -
UIне импортируется и не вызывается другими компонентами -
При
MAJOR-обновленииSIвсе новыеIудовлетворяютvMиv(M-1) -
Поддержка версий старше
v(M-1)не требуется по умолчанию -
Инфраструктурные компоненты не вносят изменений в семантику
SI/I
8.2. Инструментальная поддержка
-
Статический анализ: Графовые анализаторы зависимостей, линтеры импортов, кастомные AST-проверки.
-
Контрактные тесты: Автоматическая проверка, что
Iпроходит наборы тестов дляSI vMиSI v(M-1). -
CI-валидация: Автоматическая проверка ацикличности, направлений импортов и покрытия версионными тестами при каждом merge/push.
-
Маркировка: Автоматическая генерация маркера соответствия на основе результатов проверок.
9. Иллюстративные примеры
Примеры носят демонстрационный характер и не привязаны к конкретному языку.
9.1. Управление памятью (in-process)
[SI: PageFrameManager v2] <- требует <- [SI: SyncPrimitive v1] ^ ^ [I: HeapAllocator v2.1] <- использует <- [I: MutexSpin v1.4] ^ [UI: MemCLI v1.0]
-
HeapAllocatorреализуетPageFrameManager v2и одновременноv1(правило N-1). -
Внутренне использует
MutexSpinчерезSyncPrimitive v1. -
Никаких «memory abstraction layers» или «allocator adapters» не вводится.
-
Маркер соответствия:
FASA.1.0-na.vc.ac
9.2. Распределённый анализатор кода (IPC/Pipe)
[SI: LanguageProtocol v3] (JSON-RPC over stdio) ^ [I: RustAnalyzer v3.2] ^ [UI: EditorPlugin v2.5]
-
SIопределяет набор командtextDocument/didOpen,completion, и так далее. -
Iчитаетstdin, разбирает JSON, проверяет полеjsonrpcилиmethod-префикс версии, маршрутизирует к соответствующим обработчикам внутри одного процесса. -
При выходе
v4анализатор обязан продолжать корректно обрабатыватьv3-запросы. -
Инфраструктура: балансировщик может распределять запросы между несколькими экземплярами
I, но это не влияет на контракт. -
Маркер соответствия:
FASA.1.0-na.vc.cb
9.3. Нарушение принципов FASA (анти-паттерн)
[SI: AuthService] -> [Adapter: AuthHttpBridge] -> [I: RealAuthService]
Запрещено: AuthHttpBridge является выделенным промежуточным слоем, который только транслирует вызовы. Его логика должна быть изолирована внутри RealAuthService или SI должен быть определён сразу как сетевой контракт.
10. Глоссарий
|
Термин |
Определение |
|---|---|
|
FASA |
Flat Adaptive Software Architecture |
|
SI |
Программный интерфейс. Контракт взаимодействия без исполняемого кода. |
|
I |
Реализация. Конкретная логика/состояние, удовлетворяющая |
|
UI |
Пользовательский интерфейс. Точка входа для человека или внешней системы. |
|
DAG |
Directed Acyclic Graph. Направленный ациклический граф зависимостей. |
|
N-1 Rule |
Правило обязательной поддержки текущей и предыдущей мажорной версии |
|
Legacy SI |
Предыдущая мажорная версия интерфейса, остающаяся в поддержке на период перехода. |
|
Context Binding |
Механизм привязки |
|
Прямая передача |
Отсутствие выделенных компонентов-посредников между |
|
Семантический уровень |
Уровень исходного кода, зависимостей и контрактов, регулируемый правилами FASA. |
|
Инфраструктурный уровень |
Уровень развёртывания, сети и оркестрации, находящийся вне графа зависимостей FASA. |
|
Punct (point of compliance) |
Краткий код, обозначающий подтверждённое соблюдение конкретного правила спецификации. |
ссылка на оригинал статьи https://habr.com/ru/articles/1043322/