2016-11-29 42 views
0

我用laravel完成了一些小應用程序,它可以工作,但我有一些意大利麪條代碼。我想問你的幫助。我對代碼模式有一些理論,但我不知道如何在我的情況下實現它們。我該如何重構我的代碼(laravel,OOP)

最奇怪的部分:我輸入的數據應該逐步分析,需要採取一些行動。例如我有一個輸入參數數組

$array = ['param1','param2','param3', ..., 'paramN'] 

我需要分析它從param1 paramN並採取一些行動。代碼結構如下:

if($array['param1'] == 'X') { 
    some action 
} else { return ....} 

if($array['param2'] == 'Y') { 
    some action 
} else { 
    if($array['param3'] == 'Z') { 
     return .... 
    } else { return ....} 
} 

此代碼包括使用了一些外牆,驗證在if塊,但if的個數爲可怕。但這是商業邏輯。

也許你可以給我一個想法,我可以通過哪種方式重組我的代碼,使其更清晰?

回答

1

你可以使用收集具有很好的可讀的代碼重構你的邏輯上面的代碼可以像下面

$array = ['param1','param2','param3', ..., 'paramN']; 
$collection = collect($array); 

現在定義你的處理回調

$param1Callback = function($value) { 
    // $value will be value of param1 which is X in your comparision so write your if logic here 
    if($value == 'x') { 
     // process here 
     return true; 
    } 
    return false; 
} 
$callbacks = ['param1' => $param1Callback, 'param2' => $param2Callback ...]; 

$collection->each(function($value, $key) use($callbacks){ 
    if($callbacks[$key]($value)) { 
     // here param1 value is processed with 'X' and that callback returned true 
    } 
... and so on 
}); 

希望你得到的這裏的想法是關於可用的收集方法的完整文檔。 https://laravel.com/docs/5.3/collections#available-methods

+0

謝謝你的快速回復! 如果我需要返回true或false,這個邏輯很好。但有時我需要將消息返回給用戶。一些參數的處理取決於之前處理其他一些參數的結果。恐怕這種做法不適合我。或者我錯了? –

+0

爲了更好地理解收藏,請看看adam的課程,它對收藏太好了,並且適合所有類型的需求。 https://adamwathan.me/refactoring-to-collections/ –

+0

好的,非常感謝你! –