【问题标题】:Design Pattern for varied input to create collection of objects用于创建对象集合的各种输入的设计模式
【发布时间】:2018-08-27 04:04:15
【问题描述】:

假设我有以下简单的类

<?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 输入的类型数量增加,上面的代码就会变成一大堆ifelseif 语句。

是否有一个好的设计模式可以用于不同的$raw 输入来创建Variable 对象的Collection

【问题讨论】:

    标签: php design-patterns factory-pattern


    【解决方案1】:

    为了避免 if 语句的混乱,您可以使用访问者模式。本质上,if 语句的每个分支都包含在一个函数中。每个函数都有两个参数:一个“指令”和一个对象。如果函数“识别”了指令,它就会对对象做一些事情。否则它会默默地返回。

    您可以创建一个包含这些“访问者”函数的数组,并为输入数据中的每个元素循环它们。

    这是一个简化的解释(我是在手机上打字),但希望它能为您指明正确的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多