2017-01-26 107 views
0

隨着CsvReader一種類型的對象:尋找設計模式 - 不同來源

class CsvReader { 
    public static function createFromString($csvString){ 
    /.../ 
    return new static($something) 
    } 
} 

我打算用csvString來自不同來源的操作:讀取文件時,從HTTP響應等的身體所以即時通訊尋找設計模式,輕鬆創建此csvReaders對象。現在,我已經結束了這樣的事情:

use SplFileInfo as UploadedFile; 
use CsvReader as Reader; 
use GuzzleHttp\Client as HttpClient; 

class CsvFactory { 
    public function createFromUploadedFile(UploadedFile $uploadedFile){ 
    return Reader::createFromString($uploadedFile->toString()); 
    } 

    public function createFromHttpEndpoint(HttpClient $client, $url, $options = array()){ 
    $response = $client->request('GET', $url, $options); 

    if($response->getStatusCode() != 200){ 
     throw new Exception('Http Code Not Ok', $response->getStatusCode()); 
    } 

    return Reader::createFromString($response->getBody()); 
} 
} 

我覺得它可以在更好的方式完成。但是如何?

+0

*返回新的靜態($ something)*? – CKing

回答

1

你需要問自己的問題是你想做什麼樣的基礎工作?設計模式是有用的工具,可幫助您瞭解和/或解釋以特定方式組織代碼的決策。但是,您絕不需要使用任何特定的設計模式。

如果你想保持包含在這個特定類中的代碼,你構建它的方式工作正常。然而,另一種方法是在CSVable界面中創建一個toCsv方法。然後,您可以將它附加到類並強制它們定義在請求以CSV格式輸出時它們應該如何返回。然後CSV類可以強制執行它只是給定實現您的接口的對象。

有很多方法可以達到這個目的,但是你應該退後一步,找到適合你所做事情的模式;在你知道你想要的優點和缺點之前,找不到適用的模式。甚至可能沒有一種模式完全適合您的使用案例。