如果你想實(shí)作多型方法,最好建立儲(chǔ)存庫(kù)或僅用於管理該邏輯的東西。
這是範(fàn)例。
class SampleRepository { /** * repository instance value * * @var string[] | null */ private $sampleArray; // maybe here is SEASON or EXPIRY or null /** * constructor * * @param string[] | null $sampleArray */ public function __construct($sampleArray) { $this->sampleArray = $sampleArray; } /** * execute like class interface role * * @return array */ public function execute() { return (!$this->sampleArray) ? [] : $this->getResult(); } /** * get result * * @return array */ private function getResult() { // maybe pattern will be better to manage another class or trait. $pattern = [ "SEASON" => new Season(), "EXPIRY" => new Expiry() ]; return collect($this->sampleArray)->map(function($itemKey){ $requestClass = data_get($pattern,$itemKey); if (!$requestClass){ // here is space you don't expect class or canIt find correct class return ["something wrong"]; } return $requestClass->execute(); })->flatten(); } }
你可以這樣呼叫。
$sampleRepository = new SampleRepository($sampleValue); // expect string[] or null like ["SEASON"],["SEASON","EXPIRY"],null $result = $sampleRepository->execute(); // [string] or [string,string] or []
此方法僅適用於您的參數(shù)指定值。 如果Season類(lèi)別和Expiry類(lèi)別的回傳結(jié)果幾乎相同,那麼最好在trait上進(jìn)行管理。 (即範(fàn)例程式碼中的 $pattern)
嘗試一些。
我讀了評(píng)論,所以關(guān)注..
例如,它更願(yuàn)意只取得 getResult() 的結(jié)果。 因此,某些模式和如此多的邏輯不應(yīng)該寫(xiě)在 getResult() 上;
如果您使用特徵,這是一個(gè)範(fàn)例。 首先,您需要建立管理行為類(lèi)別。
行為.php
<?php namespace App\Repositories; class Behavior { use Behavior\BehaviorTrait; // if you need to add another pattern, you can add trait here. }
然後,您需要在同級(jí)位置建立Behavior目錄。 你移動(dòng)該目錄,你就創(chuàng)建了這樣的特徵檔。
<?php namespace App\Repositories\Behavior; trait BehaviorTrait { public static function findAccessibleClass(string $itemKey) { return data_get([ "SEASON" => new Season(), "EXPIRY" => new Expiry() ],$itemKey); } }
findAccessibleClass() 方法負(fù)責(zé)找出正確的類(lèi)別。
然後,你可以像這樣呼叫這個(gè)方法。
private function getResult() { return collect($this->sampleArray)->map(function($itemKey){ $requestClass = Behavior::findAccessibleClass($itemKey); // fix here. if (!$requestClass){ // here is space you don't expect class or canIt find correct class return ["something wrong"]; } return $requestClass->execute(); })->flatten(); }
如果 getResult() 中的程式碼太多,最好將負(fù)責(zé)的程式碼分開(kāi)。
要建立Behavior Trait,getResult不需要負(fù)責(zé)行為邏輯。簡(jiǎn)而言之,它將很容易測(cè)試或修復(fù)。
希望一切順利。