2017-01-26 2 views
0

С CSVReader:Цель шаблон проектирования - один тип объекта с различными источниками

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

Я планирую работать с csvString, поступающих из различных источников: чтение файла, из тела ответа HTTP и т.д. Таким образом, im ищет шаблон дизайна для легкого создания этих объектов 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

Вопрос, который вам нужно задать себе, - это то, какую основу вы хотите сделать? Шаблоны проектирования - полезные инструменты, которые помогут вам понять и/или объяснить решения для организации кода определенным образом. Однако вы никоим образом не обязаны использовать какой-либо конкретный шаблон проектирования.

Способ, которым вы его построили, отлично работает, если вы хотите сохранить код, содержащийся в этом конкретном классе. Однако альтернативой будет создание метода toCsv в интерфейсе CSVable. Затем вы можете присоединить это к классам и заставить их определить, как они должны возвращаться при запросе вывода в формате CSV. Тогда класс CSV мог бы обеспечить, чтобы это были только объекты, которые реализуют ваш интерфейс CSVable.

Существует много способов сделать это, но вы должны сделать шаг назад и найти образец, который соответствует тому, что вы делаете; не находите шаблон для применения, прежде чем вы узнаете, какие преимущества и недостатки вы хотите. Там может быть даже не шаблон, который точно подходит для вашего прецедента.

Смежные вопросы