Как работает шаблон проектирования «Цепочка ответственности» в C#

Как работает шаблон проектирования «Цепочка ответственности» в C#

9 января 2024 г.

Давайте углубимся в шаблон цепочки ответственности в C#! Это шаблон проектирования. используется для обработки запросов путем их обработки через ряд потенциальных обработчиков, каждый из которых отвечает за определенное подмножество запросов. Основная цель этого шаблона — отделить отправителя запроса от его получателя, повышая гибкость объектно-ориентированного проектирования.

В этой статье рассматривается, как реализовать шаблон цепочки ответственности в C#, включая особенности. например, его ключевые компоненты и анализ лучших практик кодирования. К концу этой статьи вы должны понять, как использовать этот шаблон проектирования в следующем C#. проект!


Понимание схемы цепочки ответственности

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

Цепочка ответственности – гипотетический сценарий

Чтобы понять шаблон цепочки ответственности, рассмотрим гипотетический сценарий, в котором клиент разместил заказ на веб-сайте электронной коммерции. Заказ должен выполнить склад, но склад забит, и сразу выполнить заказ они не могут. Процесс выполнения заказа включает в себя несколько этапов, таких как получение информации о заказе, расчет стоимости доставки, сбор товаров и, наконец, отправка заказа.

В этом сценарии шаблон «Цепочка ответственности» можно использовать для управления процессом выполнения заказа. Каждый шаг процесса может быть инкапсулирован в свой объект, что позволяет разделить задачи и обеспечить возможность повторного использования кода. Когда клиент размещает заказ, объект Order передается через цепочку обработчиков, каждый из которых может управлять процессом выполнения заказа. Цепочка обработчиков состоит из RetriveOrderHandler, CalculateShippingHandler, GatherItemsHandler и ShipOrderHandler.

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

Ключевые компоненты шаблона «Цепочка ответственности»

Шаблон «Цепочка ответственности» состоит из нескольких ключевых компонентов. Во-первых, это набор обязанностей, которые необходимо выполнять. В гипотетическом сценарии, упомянутом ранее, набор обязанностей будет состоять из получения информации о заказе, расчета стоимости доставки, сбора товаров и доставки заказа. Это скорее абстрактное «то, что нужно сделать».

Второй компонент — это набор классов Handler, которые инкапсулируют эти обязанности. Цепочка обработчиков в примере сценария состояла из RetrieveOrderHandler, CalculateShippingHandler, GatherItemsHandler и ShipOrderHandler. У каждого обработчика есть метод HandleRequest, который позволяет ему выполнять конкретную задачу, за которую он отвечает, и передавать объект Order по цепочке следующему обработчику.

Третий компонент — это набор клиентских объектов, которые инициируют запрос и передают его первому обработчику в цепочке. В примере сценария объект клиента будет объектом заказа клиента.

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


Реализация шаблона цепочки ответственности на C

Чтобы реализовать шаблон «Цепочка ответственности» в C#, сначала необходимо определить обязанности, которые должно выполнять приложение. Как только эти обязанности определены, вы можете создать цепочку обработчиков для обработки запроса. Цепочка обработчиков должна включать базовый абстрактный класс, определяющий базовую функциональность каждого обработчика, а также методы, необходимые для передачи запроса по цепочке.

Пример шаблона цепочки ответственности на C

Ниже приведен пример реализации шаблона «Цепочка ответственности» на C#:

public abstract class Handler
{
    protected Handler _successor;

    public void SetSuccessor(Handler successor)
    {
        _successor = successor;
    }

    public abstract void HandleRequest(Order order);
}

public class RetrieveOrderHandler : Handler
{
    public override void HandleRequest(Order order)
    {
        if (order.NeedsRetrieval())
        {
            // Perform the retrieval logic
        }
        else if (_successor != null)
        {
            _successor.HandleRequest(order);
        }
    }
}

public class CalculateShippingHandler : Handler
{
    public override void HandleRequest(Order order)
    {
        if (order.NeedsShippingCosts())
        {
            // Perform the shipping cost calculation logic
        }
        else if (_successor != null)
        {
            _successor.HandleRequest(order);
        }
    }
}

public class GatherItemsHandler : Handler
{
    public override void HandleRequest(Order order)
    {
        if (order.NeedsItemGathering())
        {
            // Perform the item gathering logic
        }
        else if (_successor != null)
        {
            _successor.HandleRequest(order);
        }
    }
}

public class ShipOrderHandler : Handler
{
    public override void HandleRequest(Order order)
    {
        if (order.NeedsShipping())
        {
            // Perform the shipping logic
        }
        else if (_successor != null)
        {
            _successor.HandleRequest(order);
        }
    }
}

В этом примере каждый обработчик в цепочке наследуется от абстрактного класса Handler, который определяет метод SetSuccessor, используемый для установки следующего обработчика в цепочке, и метод HandleRequest, используемый для обработки заказа. Обычно мне нравится передавать любые типы зависимостей через конструкторы (избегая подобных мутаций методов), но это просто для иллюстрации.

Затем каждый конкретный обработчик переопределяет метод HandleRequest для выполнения своих конкретных обязанностей, таких как получение заказа, расчет стоимости доставки, сбор элементов или доставка заказа. Если обработчик в цепочке не может обработать запрос, он передает запрос следующему обработчику с помощью метода SetSuccessor.

Советы и рекомендации

Чтобы оптимизировать шаблон цепочки ответственности, важно придерживаться некоторых рекомендаций, таких как:

  • Обязанности каждого обработчика должны быть небольшими и конкретными.
  • Избегайте циклических цепочек обработчиков, так как это может создать бесконечные циклы.
  • Используйте один метод для каждого обработчика, обрабатывающего запрос, вместо использования нескольких методов обработки.
  • Избегайте жестко запрограммированных циклов в обработчиках и отдавайте предпочтение динамическому подходу (например, вместо этого используйте метод SetSuccessor).
  • Используйте шаблон «Цепочка ответственности» для процессов, в которых существует несколько способов обработки запроса.

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


Тестирование и отладка шаблона

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

Единичная тестируемость цепочки ответственности

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

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

Поскольку цепочка может быть динамической, мы можем использовать макеты (или заглушки/фейки, если хотите), чтобы проверить, передается ли преемникам ответственность, когда это необходимо. В противном случае ответственность должен нести конкретный тестируемый обработчик, как и ожидалось.

Советы по экономии времени и усилий

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

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

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


Завершение шаблона цепочки ответственности на C

Шаблон «Цепочка ответственности» — это полезный шаблон «Банда четырех», который позволяет разработчикам создавать надежные и гибкие архитектуры приложений. Используя шаблон, разработчики могут реорганизовать код приложения без внесения существенных структурных изменений, что повышает удобство сопровождения и расширяемость кода.

Мы рассмотрели шаблон «Цепочка ответственности», его компоненты, реализацию на C# и лучшие практики. Я также обсудил важность тестирования и отладки специально для этого шаблона. Помните, что очень важно определить набор обязанностей, создать соответствующие классы и определить методы для управления делегированием ответственности. Разработчикам следует следовать рекомендациям и тщательно тестировать и отлаживать код, чтобы убедиться, что он работает должным образом.

Если вас интересуют дополнительные возможности обучения, подпишитесь на мою бесплатную еженедельную рассылку и загляните на мой канал на YouTube!

:::информация Также опубликовано здесь. .

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE