Работа с фабрикой, которая использует и стратегию, и репозиторий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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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