2016-05-25 12 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

ええ、ありがとう。私は若干銀色の弾丸を望んでいるが、私はそこに1つではないと思う。 – Oli

答えて

0

私はMartin Fowlerの本Refactoring:Amazonから助けを借りました。

だから私は、彼は非常に慎重に書いて、それをやってみることにしましたものを読むオブジェクト

でアレイを交換してください。私はメソッドの単体テストを作成し始めました。単純なもので、私はたくさんのデータを渡し、その結果をエクスポートし、その結果をアサーションで使用します。私はリファクタリングの前にこれを行いました。それで、各繰り返しの後にユニットテストを実行して、何かを壊したかどうかを知ることができました。

Fowler氏によると、ビジネスの最初の順序は、問題の配列を置き換えます公共の配列を持つクラスを作成することです。その後、私はすべて置き換え

$statistics = new Statistics(); 

class Statistics 
{ 
    public $data = []; 
} 

私は、変数を作成しました変数のインスタンス$ statistics-> dataになりました

したがって、たとえば:

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

はなるだろう:それはいくつかの新たな可能性を切り開いているため

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

これは面白かったです。

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

が、私はいくつかのチャンクにそのようにした。その後、私は統計クラス自体にそのメソッドを移動する

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

:私は次のやったことは、自分のメソッドにコードの一部をリファクタリングすることでしたコード。私は特にパラメータが好きではありませんでしたが、今のところ が改善していると思います。コードは少なくとも少し騒々しいものでした。

すべてのメソッドから返された$ this->データが不要になったため、これを削除しました。 配列は現在Statisticsクラスに含まれていました。

さらなるリファクタリングのためにこれが開き、配列をさらに分割し、いくつかの責任を新しいクラスに委任しました。

これはおそらく私が今からこれらのタイプの配列に対処し、それらをクラスに分離し、それらを分解する方法だと思います。

関連する問題