データ結合

findBuyableProductメソッドは、ユーザーIDと国のタイプのデータを個別の引数として受け取り、購入可能な商品を検索しています。
引数の数が増えると、メソッドの可読性が低下し、オブジェクト参照のために必要でないデータを含める必要が出てくる場合があります。

<?php

class ProductRepository
{
    private ResourceQuery $resourceQuery;

    public function __construct(ResourceQuery $resourceQuery)
    {
        $this->resourceQuery = $resourceQuery;
    }

    public function findBuyableProduct(int $userId, CountryType $countryType): array
    {
        // ユーザーIDと国のタイプを使用して、購入可能な商品を検索
        $this->resourceQuery->addIntFilter($userId);
        $this->resourceQuery->addStringFilter($countryType->value());

        // 商品をクエリで検索
        return $this->findByQuery($this->resourceQuery);
    }

    private function findByQuery(ResourceQuery $query): array
    {
        // クエリを使用して商品をデータベースから検索
        // この部分は実際のデータベース検索ロジックを実装する必要があります。
        return []; // 仮のダミー値を返しています。
    }
}
                    
<?php

class ResourceQuery
{
    private array $filters = [];

    public function addIntFilter(int $value): void
    {
        $this->filters[] = $value;
    }

    public function addStringFilter(string $value): void
    {
        $this->filters[] = $value;
    }

    // フィルタを取得するためのメソッド
    public function getFilters(): array
    {
        return $this->filters;
    }
}
                    
<?php

class CountryType
{
    private string $value;

    public function __construct(string $value)
    {
        $this->value = $value;
    }

    public function value(): string
    {
        return $this->value;
    }
}
                    
<?php

// 利用時にResourceQueryのインスタンスを注入
$resourceQuery = new ResourceQuery();
$productRepository = new ProductRepository($resourceQuery);

// ユーザーIDと国のタイプを使用して購入可能な商品を検索
$userId = 123;
$countryType = new CountryType('JP');
$buyableProducts = $productRepository->findBuyableProduct($userId, $countryType);