Паттерн Factory и типизация результата

CRL

Новичок
Паттерн Factory и типизация результата

В ходе осмысления работы Фабрики возник вопрос по типизации результата. Например, в прототипе (интерфейсе) описан метод query($data). Данный метод принимает запрос к стораджу и возвращает результат. Результат возвращается в специфичной для реализации форме: например, для SQL-запроса это ресурс, для запроса к текстовому файлу - это строка. Фабрика создает объект нужной реализации, который потом используется в программе; в ходе использования этого объекта я вызываю метод $obj->query($current_data) и получаю... что? То есть понятно, что я получаю некий сет-результат, но для того, чтобы понять, что именно это за сет, придется провести его анализ уже в приложении, чего делать не хотелось бы. Иыми словами, как и где должен описываться результат работы методов реализаций, чтобы с ним можно было работать, не выполняя проверки типа в самом приложении? Вопрос касается не столько моей ситуации со стороджами, сколько такой проблемы в целом - важно понять принцип.

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

PHP:
interface IStorage 
{ 
    public function query($data); 
    ... 
}
или

PHP:
interface IStorage 
{ 
    public function query(DataSet $data); 
    ... 
}
И в случае типизированного, и в случае нетипизированного описания параметров, они всё равно остаются формальными, т.е., в реализации я должен передавать в экземпляр реализации некую структуру, а уже сама реализация эту структруру распарсивает. Что-то типа такого:

PHP:
$data = array(); 
$data["dbhost"] = "localhost"; 
... 
$current_storage = new StorageFactory($data);
или, если формальный параметр типизирован:

PHP:
$data = new DataSet; 
$data->host = "localhost"; 
... 
$current_storage = new StorageFactory($data);
Вот именно эта парсировка структуры смущает. Нужно бы, наверное, передавать в экземпляр реализации уже конечные параметры, а не структуру, их содержащую, но как тогда согласовать это с интерфейсом?
 
>в ходе использования этого объекта я вызываю метод $obj->query($current_data) и получаю... что?

реорганизуйте код, так чтобы в том месте, где вы получаете результат, вы знали что вы там получаете. Я полагаю у вас примерно так:

...

function getRes($type, $data) {
$obj = SomeClass::factory($type);
// тут действительно непонятно, что возвращается
return $obj->query($data);
}
...


сделайте так:

if ($type == 'file') {
$res = $this->getFileRes($data);
} else {
$res = $this->getDbRes($data);
}
 
Сверху