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

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

<?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 объекты?

2

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector