Допустим, у меня есть следующий простой класс
<?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
объекты?
Чтобы избежать путаницы в операторах if, вы можете использовать шаблон Visitor. По сути, каждая ветвь оператора if заключена в функцию. Каждая функция принимает два аргумента: «инструкция» и объект. Если функция «распознает» инструкцию, она что-то делает с объектом. В противном случае он молча возвращается.
Вы можете создать массив этих функций «посетителя» и выполнить цикл по ним для каждого элемента в ваших входных данных.
Это упрощенное объяснение (я набираю на телефоне), но, надеюсь, оно укажет вам правильное направление.
Других решений пока нет …