我有一些遗留代码,但它们清晰,简洁。大部分遗留逻辑在于使用数组。喜欢这里的代码:
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多维数组地狱的更通用的方法吗?
答案 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类中。
这为进一步的重构打开了局面,进一步分解了阵列,并将一些责任委托给了新的类。
我认为这可能是我从现在开始处理这些类型的数组,将它们隔离到类然后分解它们。