Шаблон проектирования для разнообразного ввода для создания коллекции объектов

Скажем, у меня есть следующий простой класс

<?php
class Variable
{
    private $variableName;
    private $variableValue;

    public function __construct($name, $value)
    {
        $this->variableName  = $name;
        $this->variableValue = $value;
    }
}

Я храню объекты Variable в коллекции следующего класса Collection.

class Collection
{ 
    private $items = array();

    public function addItem($obj) {
        // Code for adding an item
    }

    // Other methods delete, sort, filter, etc

}

Кроме того, допустим, я использую очень несовместимый API для импорта множества имен и значений переменных. API возвращает JSON, но это действительно может быть что угодно.

Я говорю, что API несовместим, потому что в зависимости от вашего URI объект Variable может возвращать данные $raw в следующем формате:

{  
    "variables" : [  
        {  
            "name" : "variable_one",
            "value" : "foo"
        },
        {
            "name" : "variable_two",
            "value" : "bar"
        }
    ]
}

Или данные $raw могут быть в следующем формате:

{  
   "dataObject" : {  
      "variable_one" : "foo",
      "variable_two" : "bar"
   }
}

Кроме того, этот API все еще развивается, и я могу предвидеть, что они внесут непредсказуемые изменения в формат переменных данных $raw в будущем.

Вот мое текущее решение для использования данных $raw для получения коллекции объектов Variable:

<?php
    // Turn JSON into stdObject
    $variableData = json_decode($raw);

    // Collection object to hold the variables
    $variables = new Collection()


    if ( property_exists($variableData, 'variables') ) {
        foreach ( $variableData as $variable ) {

            // Use for the first type of JSON
            $variables->addItem(
                new Variable($variable->name, $variable->value)
            );

        }
    } else {
        foreach ($variableData as $key => $value) {

            // Use for the second type of JSON
            $variables->addItem(new Variable($key, $value);

        }
    }

Проблема с этим решением заключается в том, что если конструктор переменных становится более сложным или количество различных форматов $raw может расти, это решение превращается в большой беспорядок.

Если Variable становится все сложнее и требует VariableFactory, мне нужно будет создать отдельную фабрику для каждого типа входа $raw. Если количество типов входных данных $raw растет, приведенный выше код превращается в большой беспорядок из операторов if и elseif.

Есть ли хороший шаблон проектирования, который я могу использовать для различных входных данных $raw для создания Collection объектов Variable?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
115
1

Ответы 1

Чтобы избежать путаницы с операторами if, вы можете использовать шаблон Visitor. По сути, каждая ветвь оператора if оборачивается функцией. Каждая функция принимает два аргумента: «инструкцию» и объект. Если функция «распознает» инструкцию, она что-то делает с объектом. В противном случае он молча возвращается.

Вы можете создать массив этих функций «посетителей» и перебирать их в цикле для каждого элемента ваших входных данных.

Это упрощенное объяснение (я печатаю на телефоне), но, надеюсь, оно укажет вам правильное направление.

Другие вопросы по теме