В эпоху, когда программное обеспечение является не просто утилитой, а необходимостью, архитектура и дизайн программных систем становятся все более важными. Целью «Стандарта» Хасана Хабиба является предоставление всеобъемлющего набора рекомендаций по разработке программных систем, которые легко обслуживаются, масштабируются и надежны. Цель этой статьи — раскрыть суть «Стандарта» и объяснить, почему он может изменить правила игры в разработке программного обеспечения.

Концепция брокеров

«Стандарт» Хасана Хабиба начинается с понятия «брокеров», которые действуют как посредники между различными компонентами системы. Этими брокерами могут быть хранилища данных, сторонние сервисы или другие внешние зависимости. Основная цель — изолировать основную бизнес-логику от этих внешних факторов, сделав систему более надежной и простой в тестировании. Брокеры спроектированы как заменяемые компоненты, что обеспечивает большую гибкость и меньше трений при необходимости изменений.

Важность услуг

Сервисы — это рабочие лошадки «Стандарта». Они инкапсулируют основную бизнес-логику и не зависят от технологий. Услуги делятся на четыре основных типа:

Услуги Фонда

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)
        };
    });

=> Подробности здесь.

Услуги оркестрации

Службы оркестрации предназначены для инкапсуляции операций, требующих взаимодействия двух или трех различных бизнес-объектов. Они являются лицами, принимающими решения на высоком уровне в вашей системной архитектуре, гарантируя, что нужные службы вызываются в правильной последовательности для успеха данной операции.

Например, рассмотрим особенность образовательной системы, при которой каждый зачисленный учащийся также должен получить читательский билет. Это не так просто, как создать новую запись в таблице базы данных для читательских карточек; он включает в себя несколько шагов:

  1. Проверка существования студента в системе,
  2. Проверка статуса зачисления студента,
  3. Создание новой читательской карточки, связанной с профилем студента.

Вот пример 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 Хасана Хабиба служит ценным ресурсом, на котором проводятся эти прямые трансляции, предлагая множество информации и практических примеров.

Краткое содержание

«Стандарт» Хасана Хабиба предлагает структурированный подход к архитектуре программного обеспечения, который может значительно улучшить качество и долговечность программных систем. Приняв принципы брокеров, сервисов и экспонентов, разработчики могут создавать системы, которые не только надежны и масштабируемы, но также более просты в обслуживании и обновлении.

В мире, где программное обеспечение постоянно развивается, «Стандарт» служит образцом для создания программного обеспечения, способного выдержать испытание временем.