使用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 :(得分:1)
你需要问自己的问题是你想要做什么样的基础工作?设计模式是有用的工具,可帮助您理解和/或解释以特定方式组织代码的决策。但是,您无需使用任何特定的设计模式。
如果您希望将代码保留在此特定类中,则构建它的方式可以正常工作。但是,另一种方法是在toCsv
接口中创建CSVable
方法。然后,您可以将其附加到类,并强制它们定义在请求以CSV格式输出时应如何返回。然后,CSV类可以强制只给出实现CSVable
接口的对象。
有很多方法可以实现这一目标,但你应该退后一步,找到适合你所做的事情的模式;在了解您想要的优点和缺点之前,找不到适用的模式。甚至可能没有完全符合您的用例的模式。