2016-05-25 47 views
0

我有一些遺留的代碼,只是清晰,乾淨和簡潔。這些遺留邏輯大部分在於使用數組。像這樣的代碼在這裏:重構PHP傳統陣列

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

核心應該是:1)*瞭解*代碼應該完成什麼。 2)以最熱門的方式重新執行該任務,取代舊的垃圾代碼。 - 當然,可能有辦法通過慢慢地用新代碼替換舊代碼的一部分來逐步地從那裏到那裏,但是如何在實踐中特別針對您的情況發揮出來對任何人都是不可能的。 – deceze

+0

是的,謝謝。我有點希望得到一顆銀彈,但我想那裏沒有一個。 – Oli

回答

0

我從Martin Fowler的着作「重構:Amazon」中得到了一些幫助。

更換磁盤陣列和對象

所以我看他很認真地寫下,並決定必須在它一展身手。我開始爲這個方法創建一個單元測試。只是一個簡單的例子,我會傳遞一堆數據,導出結果並在斷言中使用該結果。在重構之前我做了這個,所以我可以在每次迭代之後運行單元測試來知道我是否有任何問題。根據福勒

的第一道命令是創建一個公共數組類,它將取代違規陣列:

class Statistics 
{ 
    public $data = []; 
} 

我創建的變量:

$statistics = new 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; 

然後我會說的方法進入統計類本身:

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

我與幾個大塊這樣做代碼。我現在並不特別喜歡參數,但是 ,我認爲這是一個進步,代碼至少有點嘈雜。

我刪除了所有方法返回的$ this->數據,因爲它不再需要, 該數組現在包含在Statistics類中。

這爲進一步的重構打開了基礎,進一步分解了數組並將一些職責委託給了新類。

我認爲這可能是我將從現在開始處理這些類型的數組,將它們隔離到類然後再打開它們。