Новости

Подпишитесь на наши новости, чтобы не
пропустить важные обновления и выпуск новых продуктов

Подписаться

«Чистая архитектура» Роберта Мартина на практике

25.11.2022

Одна из книг которая кардинально повлияла на разработку в проектах это - "Чистая архитектура" Роберта Мартина. Основной посыл книги, ваша система не должна зависеть от инфраструктуры (фраймворка), сначала код - база данных потом. Мы попробовали следовать данным правилам, и действительно код стал чище и качественнее, мы смогли менять персистентность не затрагивая большей части системы. В коде приложения появились Repositories, Entities, появились слои приложения Presentation, Application, Domain и  Infrastructure. На каждом уровне приложения действуют свои правила разработки, есть в слое Domain обязательно ООП, то в Presentation обычные функции Helpers и Views. Боевой проект в котором использовали данных подход это Smoking-Shop, нам без особых проблем удалось вынести внутренний пакет PartScanner по работе с прайс-листами на отдельный сервис не меняя поведения системы.

Рассмотрим подробнее реализацию на php

Domain Layer - Доменный слой, ядро нашей системы. Вообще диаграмма доменной модели сформированной на этапе проектирование является основной для создания Entities (Сущностей), Domain Services (Доменных сервисов), Domain Interfaces (Контракты для взаимодействия с внешним миром).

Пример модели:

<?php

namespace Demo\Domain\Task;

class Task
{
public function __construct(private int $id, private string $name)
{
}

/**
* @return string
*/
public function getName(): string
{
return $this->name;
}

/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
}

 

Application Layer - Слой приложения содержащий Use Cases (варианты использования) приложения, бизнес логика строится на основе бизнес-процессов выявленных также на этапе проектирования.

Пример команды:

<?php
namespace Application\CreateTask;

//CreateTaskCommand.php
class CreateTaskCommand
{
public function __construct(private string $name)
{
}

/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
}

// CreateTaskHandler.php
class CreateTaskHandler extends ApplicationHandler
{

public function handle(ApplicationCommandInterface $command): void
{
/**
* Логика создания, результат созданная сущность
*/
$this->recordsEvents->record(new TaskWasCreatedEvent($task));
}
}

Presentation Layer - Уровень предназначенный для взаимодействия с пользователями сайта, это реализация контроллеров, хелперов, шаблонов и представлений. Основной строительный элемент на данном уровне это - Module (Модуль). Любую страницу можно представить в виде набора модулей, - меню сайта, карточка товара или слайдер на главной. Основное преимущество это переиспользование в любой части сайта или даже в других проектах

Пример контроллера:

<?php
namespace Application\CreateTask;

//CreateTaskCommand.php
class TaskController extends PresentationController
{
public function createTask(name $name): void
{

//commandBus
$this->commandBus->handle(new CreateTaskCommand($name));

return $this->createResponse();
}
}

Infrastructure Layer - Инфраструктурный уровень, это уровень взаимодействия с внешним миром, с другим сервисами, с базой данных. 

Пример репозитория:

<?php

namespace Infrastructure\Repositories\Task;

class TaskRepository implements TaskRepositoryInterface
{

public function findByCriteria(TaskSearchCriteriaInterface $criteria): TaskCollection
{
/**
* логика получения данных
*/
return new TaskCollection($tasks);
}

}

Остались вопросы?

Заполните форму, мы свяжемся с вами в ближайшее время и ответим на все вопросы

Нажимая на кнопку вы принимаете условия передачи данных