重构PHP遗留阵列

时间:2016-05-25 06:16:25

标签: php arrays multidimensional-array refactoring

我有一些遗留代码,但它们清晰,简洁。大部分遗留逻辑在于使用数组。喜欢这里的代码:

if (isset($statistics[$lowerInstance])) {
        $statistics[$lowerInstance][$size]['count'] +=     $items[$lowestType]['count'];
        $statistics[$lowerInstance][$size]['amount'] += $items[$lowestType]['amount'] + (($items[$highestType]['amount'] / $items[$highestType]['count']) * $items[$lowestType]['count']);
    } else {
        $statistics[$lowerInstance][$size]['count'] = $items[$lowestType]['count'];
        $statistics[$lowerInstance][$size]['amount'] = $items[$lowestType]['amount'] + (($items[$highestType]['amount'] / $items[$highestType]['count']) * $items[$lowestType]['count']);
    }
if (isset($statistics[$higherInstance])) {
        $statistics[$higherInstance][$size]['count'] += $items[$highestType]['count'] - $items[$lowestType]['count'];
        $statistics[$higherInstance][$size]['amount'] += $items[$highestType]['amount'] - (($items[$highestType]['amount'] / $items[$highestType]['count']) * $items[$lowestType]['count']);
    } else {
        $statistics[$higherInstance][$size]['count'] = $items[$highestType]['count'] - $items[$lowestType]['count'];
        $statistics[$higherInstance][$size]['amount'] = $items[$highestType]['amount'] - (($items[$highestType]['amount'] / $items[$highestType]['count']) * $items[$lowestType]['count']);
    }

这只是这种特殊方法的一小部分,它一直在继续。

我遇到一些困难,如何让它更清晰,更容易使用。将多维数组移动到ArrayAccess类型对象并不是那么容易(我认为),尽管这可能略有改进。

是否有一些重构多维数组的通用方法,或者如何完成它的一些示例?不只是在这个特定的问题上,而是一种处理PHP多维数组地狱的更通用的方法吗?

1 个答案:

答案 0 :(得分:0)

我从Martin Fowler的书“Refactoring:Amazon中获得了一些帮助。

将数组替换为对象

所以我仔细阅读了他所写的内容,并决定自己去做。我开始为该方法创建一个单元测试。只是一个简单的,我将传递一堆数据,导出结果并在断言中使用该结果。我在重构之前做了这个,所以我可以在每次迭代后运行单元测试,以了解我是否已经破坏了任何东西。

根据Fowler的第一项业务是创建一个具有公共数组的类,它将替换有问题的数组:

class Statistics
{
    public $data = [];
}

我创建了变量:

$statistics = new Statistics();

然后我替换了变量的所有实例,$ statistics变为$ statistics-> data

例如:

$statistics[$higherInstance][$size]['count'] += $items[$highestType]['count'] - $items[$lowestType]['count'];

会变成:

$statistics->data[$higherInstance][$size]['count'] += $items[$highestType]['count'] - $items[$lowestType]['count'];

这很有趣,因为它开辟了一些新的可能性。我接下来要做的是将一些代码重构为他们自己的方法:

protected function getInstanceData(Statistics $statistics, $higherInstance, $size, $highestType, $items) {
    $statistics->data[$higherInstance][$size]['count'] += $items[$highestType]['count'] - $items[$lowestType]['count'];
    ...
    return $statistics->data;

然后我将该方法移入Statistics类本身:

public function getInstanceData($higherInstance, $size, $highestType, $items) {
    $this->data[$higherInstance][$size]['count'] += $items[$highestType]['count'] - $items[$lowestType]['count'];
    ...
    return $this->data;

我使用了几个代码块。我并不特别喜欢这些参数 现在,我认为这是一个改进,代码至少有点吵。

我从所有方法中删除了返回$ this->数据,因为它不再需要, 该数组现在包含在Statistics类中。

这为进一步的重构打开了局面,进一步分解了阵列,并将一些责任委托给了新的类。

我认为这可能是我从现在开始处理这些类型的数组,将它们隔离到类然后分解它们。