Работа с фабрикой, которая использует и стратегию, и репозиторийPhp

Кемеровские программисты php общаются здесь
Anonymous
Работа с фабрикой, которая использует и стратегию, и репозиторий

Сообщение Anonymous »

У меня есть вопрос о том, как лучше всего провести рефакторинг Factory следующим образом:
Я работаю над побочным проектом и в итоге оказался в положении, в результате которого у меня есть OrderProductFactory, которому требуется шаблон стратегии для оплаты, а также репозиторий, который определяет, где хранятся мои OrderProducts, например:

Код: Выделить всё

final readonly class OrderProductFactory
{
public static function create(string $orderProductPaymentStrategyType, string $repositoryType, array $repositoryParams): OrderProduct
{
return OrderProduct::for(
self::createOrderProductPaymentStrategy($orderProductPaymentStrategyType),
self::createOrderRepository($repositoryType, $repositoryParams)
);
}

private static function createOrderProductPaymentStrategy(string $type): OrderProductPaymentStrategy
{
return match ($type) {
CardPayment::name() => new OrderCardPayment(),
default => throw new InvalidArgumentException('Unsupported OrderProductPaymentStrategy type: ' . $type),
};
}

private static function createOrderRepository(string $type, array $params): OrderRepository
{
return match ($type) {
SqliteOrderRepository::name() => new SqliteOrderRepository($params['database_path'] ?? throw new InvalidArgumentException('Invalid File Path for SqliteOrderRepository')),
default => throw new InvalidArgumentException('Unsupported OrderRepository type: ' . $type),
};
}
}

Это работает таким образом, что я могу легко поменять то, что создает продукт моего заказа, чтобы я мог вызывать его, используя, например:

Код: Выделить всё

$orderProduct = OrderProductFactory::create('card-payment', 'sqlite');
Однако мне это кажется неправильным, поскольку это нарушает SRP, поскольку мой OrderProductFactory заботится о том, какова его стратегия оплаты, а также о том, как она сохраняется.
Кажется неверным, что он отвечает за:
  • Создание продукта-заказа
  • Создание правильной стратегии оплаты
  • Управление загрузкой репозитория
  • Мне также не нравится, что используется магический массив $params
Есть ли лучший способ подойти к этому с помощью шаблона «Строитель» или «Фабрика фабрик»? Открыт для улучшений. Спасибо

Подробнее здесь: https://stackoverflow.com/questions/787 ... repository

Вернуться в «Php»