В програмуванні шаблони, такі як Chain of Responsibility (CoR), допомагають керувати послідовною обробкою задач. Laravel, зі своєю елегантною архітектурою, надає механізм Pipeline, що є вбудованою реалізацією цього шаблону. Але коли варто використовувати Pipeline Laravel, а коли впроваджувати власний Chain of Responsibility? Давайте розглянемо це.
Chain of Responsibility
Chain of Responsibility — це поведінковий шаблон проектування, в якому запит передається по ланцюгу обробників. Кожен обробник може або обробити запит, або передати його наступному обробнику в ланцюгу.
Коли реалізувати Chain of Responsibility:
- Не залежить від фреймворка: Якщо ви працюєте в проекті поза межами Laravel або вам потрібна багаторазова реалізація для різних контекстів.
- Кастомна поведінка: Коли вам потрібен повний контроль над механізмом ланцюга або обробники мають складні взаємозалежності.
- Динамічне будування ланцюга: Якщо ланцюг потрібно будувати динамічно в процесі виконання програми, в ситуаціях, коли Pipeline не здатен легко це обробити.
Приклад структури:
interface Handler
{
public function setNext(Handler $handler): Handler;
public function handle(string $request): ?string;
}
abstract class AbstractHandler implements Handler
{
private $nextHandler;
public function setNext(Handler $handler): Handler
{
$this->nextHandler = $handler;
return $handler;
}
public function handle(string $request): ?string
{
return $this->nextHandler ? $this->nextHandler->handle($request) : null;
}
}
Ця структура ідеальна для створення кастомних ланцюгів, але може бути надмірною для простих завдань.
Pipeline в Laravel
Pipeline Laravel надає спрощений спосіб обробки серії задач або трансформацій. Це фактично попередньо побудована реалізація Chain of Responsibility, адаптована для екосистеми Laravel.
Коли використовувати Pipeline Laravel:
- Простіші потреби в ланцюгах: Коли логіка є простішою та підходить до екосистеми Laravel.
- Інтеграція з Middleware: Для сценаріїв, схожих на обробку запитів у HTTP циклі Laravel.
- Читабельність та підтримуваність: Коли ви хочете чистий, декларативний підхід без необхідності вигадувати велосипед.
Приклад використання Pipeline:
use Illuminate\Pipeline\Pipeline;
$data = [' first ', ' second ', ' third '];
$processedData = app(Pipeline::class)
->send($data)
->through([
TrimStrings::class,
ConvertToUpperCase::class,
AppendSuffix::class,
])
->thenReturn();
dd($processedData);
Основні відмінності
Висновок
- Використовуйте Pipeline для більшості додатків Laravel. Це ефективно, чисто і використовує екосистему Laravel.
- Обирайте Chain of Responsibility, коли працюєте поза межами Laravel або потребуєте кастомної, динамічної поведінки.
Вибір правильного підходу залежить від ваших потреб, що дозволяє створювати чистіші, підтримувані та ефективніші рішення для ваших додатків. Який підхід ви оберете для свого наступного проекту?
Перекладено з: When to Use Chain of Responsibility, When to Use Pipeline in Laravel?