В эпоху, когда программное обеспечение является не просто утилитой, а необходимостью, архитектура и дизайн программных систем становятся все более важными. Целью «Стандарта» Хасана Хабиба является предоставление всеобъемлющего набора рекомендаций по разработке программных систем, которые легко обслуживаются, масштабируются и надежны. Цель этой статьи — раскрыть суть «Стандарта» и объяснить, почему он может изменить правила игры в разработке программного обеспечения.
Концепция брокеров
«Стандарт» Хасана Хабиба начинается с понятия «брокеров», которые действуют как посредники между различными компонентами системы. Этими брокерами могут быть хранилища данных, сторонние сервисы или другие внешние зависимости. Основная цель — изолировать основную бизнес-логику от этих внешних факторов, сделав систему более надежной и простой в тестировании. Брокеры спроектированы как заменяемые компоненты, что обеспечивает большую гибкость и меньше трений при необходимости изменений.
Важность услуг
Сервисы — это рабочие лошадки «Стандарта». Они инкапсулируют основную бизнес-логику и не зависят от технологий. Услуги делятся на четыре основных типа:
Услуги Фонда
Foundation Services — это низкоуровневые сервисы многократного использования, которые предлагают основные функциональные возможности более сложным сервисам более высокого уровня в вашей архитектуре. Обычно эти службы располагаются на нижнем уровне многоуровневой архитектуры и напрямую взаимодействуют с вашим хранилищем данных, системами обмена сообщениями и другими компонентами инфраструктуры. Они инкапсулируют такие операции, как доступ к данным (операции CRUD), ведение журнала, кэширование и другие служебные функции, которые обычно необходимы в различных частях вашей системы.
Пример:
public ValueTask<Student> AddStudentAsync(Student student) => TryCatch(async () => { ValidateStudent(student); return await this.storageBroker.InsertStudentAsync(student); });
=> Подробности здесь.
Процессинговые услуги
Службы обработки лучше всего можно охарактеризовать как необязательные, но мощные средства улучшения бизнес-логики. Обычно они вступают в игру, когда системе требуется нечто большее, чем просто базовые операции CRUD. Эти услуги могут:
- Объедините две или более функции примитивного уровня из Foundation Services для создания новых функций.
- Измените выходные данные одной примитивной функции, добавив конкретную бизнес-логику.
- Служить сквозным слоем для придания баланса и симметрии в общей архитектуре.
Рассмотрим функцию в гипотетическом StudentProcessingService
для добавления записей учащихся:
public ValueTask<Student> UpsertStudentAsync(Student student) => TryCatch(async () => { ValidateStudent(student); IQueryable<Student> allStudents = this.studentService.RetrieveAllStudents(); bool studentExists = allStudents.Any(retrievedStudent => retrievedStudent.Id == student.Id); return studentExists switch { false => await this.studentService.RegisterStudentAsync(student), _ => await this.studentService.ModifyStudentAsync(student.Id) }; });
=> Подробности здесь.
Услуги оркестрации
Службы оркестрации предназначены для инкапсуляции операций, требующих взаимодействия двух или трех различных бизнес-объектов. Они являются лицами, принимающими решения на высоком уровне в вашей системной архитектуре, гарантируя, что нужные службы вызываются в правильной последовательности для успеха данной операции.
Например, рассмотрим особенность образовательной системы, при которой каждый зачисленный учащийся также должен получить читательский билет. Это не так просто, как создать новую запись в таблице базы данных для читательских карточек; он включает в себя несколько шагов:
- Проверка существования студента в системе,
- Проверка статуса зачисления студента,
- Создание новой читательской карточки, связанной с профилем студента.
Вот пример C#, демонстрирующий, как служба оркестрации может решить эту проблему:
public async ValueTask<LibraryCard> CreateStudentLibraryCardAsync(LibraryCard libraryCard) => TryCatch(async () => { ValidateLibraryCard(libraryCard); await this.studentProcessingService .VerifyEnrolledStudentExistsAsync(libraryCard.StudentId); return await this.libraryCardProcessingService.CreateLibraryCardAsync(libraryCard); });
=> Подробности здесь.
Службы агрегирования
Службы агрегации предназначены для объединения нескольких служб под одной крышей, предоставляя единый контракт внешним компонентам. Они действуют как хранители основного уровня бизнес-логики, обеспечивая упрощенный и централизованный способ взаимодействия других уровней с функциями вашей системы.
Вот пример C#, иллюстрирующий, как может выглядеть служба агрегации:
public async ValueTask ProcessStudentAsync(Student student) { await this.studentRegistrationCoordinationService.RegisterStudentAsync(student); await this.studentRecordsCoordinationService.AddStudentRecordAsync(student); ... ... await this.anyOtherStudentRelatedCoordinationService.DoSomethingWithStudentAsync(student); }
=> Подробности здесь.
Сервисные операции и шаблоны
Службы в «Стандарте» следуют набору правил, таких как принцип «Делай или делегируй», который гласит, что служба должна либо выполнить задачу, либо делегировать ее, но не то и другое. Еще одним важным шаблоном является «Шаблон Florance», который обеспечивает сбалансированную и симметричную архитектуру, ограничивая зависимости служб Orchestrator двумя или тремя другими службами. Эти правила направлены на повышение читаемости, удобства обслуживания и настройки системы.
Разоблачители: последний рубеж
«Экспоненты» служат интерфейсом между основной бизнес-логикой и внешним миром. Будь то RESTful API, пользовательский интерфейс или какой-либо другой протокол связи, экспоненты несут ответственность за сопоставление ответов системы с внешним миром. Важно отметить, что они не содержат бизнес-логики и ориентированы исключительно на точное отображение и обмен информацией.
Почему «стандарт» имеет значение
- Удобство обслуживания. Благодаря изоляции различных проблем и возможности замены компонентов систему становится проще обслуживать и обновлять.
- Масштабируемость. Модульная природа архитектуры означает, что различные компоненты можно масштабировать независимо, что упрощает адаптацию к меняющимся требованиям.
- Надежность. Благодаря встроенной проверке и усилению изоляции внешних зависимостей система становится более устойчивой к сбоям.
Сообщество и ресурсы
Одним из наиболее привлекательных аспектов The Standard является сильное сообщество, выросшее вокруг него. Разработчики со всего мира активно участвуют в живых сессиях, где реализуют стандартизированные системы и библиотеки. Канал YouTube Хасана Хабиба служит ценным ресурсом, на котором проводятся эти прямые трансляции, предлагая множество информации и практических примеров.
Краткое содержание
«Стандарт» Хасана Хабиба предлагает структурированный подход к архитектуре программного обеспечения, который может значительно улучшить качество и долговечность программных систем. Приняв принципы брокеров, сервисов и экспонентов, разработчики могут создавать системы, которые не только надежны и масштабируемы, но также более просты в обслуживании и обновлении.
В мире, где программное обеспечение постоянно развивается, «Стандарт» служит образцом для создания программного обеспечения, способного выдержать испытание временем.