У меня есть класс Motor
, который я использую, чтобы предоставить мне различные характеристики двигателя.
В настоящее время у меня есть следующие методы в классе Motor
:
public function getIdFromModel($model)
{
$sql = "SELECT id FROM ... WHERE model = ...";
return process($sql);
}
public function getIdByFrame($size)
{
$sql = "SELECT id FROM ... WHERE size = ...";
return process($sql);
}
Выше приведены дополнительные функции, используемые для получения id
двигателя из базы данных, когда известен какой-то другой параметр non- id
. id
используется для создания реального двигателя.
Прежде чем я смог:
$model = "ABC";
$motor = new Motor();
//retrieve ID
$id = $motor->getIdFromModel($model)
$motor-loadSpecs($id);
$motor = new Motor($id);
Моя проблема возникает после того, как я изменил структуру своего класса, чтобы потребовать знания id
в момент создания Motor
. Теперь мне нужно сделать:
$model = "ABC";
//retrieve ID
$id = $???->getIdFromModel($model)
$motor = new Motor($id);
Вопрос
Какую структуру/класс/узор/функцию я использую вместо ???
выше?
Я знаю, что я могу создать класс только для вышеупомянутых двух функций, но я чувствую, что для этого есть лучший ответ/шаблон, и я хотел спросить. Я не вижу смысла создавать класс только для методов "что-то". Я хотел бы иметь какое-то значение.
Для этого вы обычно используете Factory Patter. Это может быть автономная функция или метод статического класса в зависимости от того, как вы хотите ее реализовать.
Метод Factory + поддерживающие методы
Применение:
$id = 17;
$model = "ABC";
$frame = "T123";
$factory = new MotorFactory();
//instantiation via various pieces of data
$motor = $factory->fromId($id);
$motor = $factory->fromModel($model);
$motor = $factory->fromFrame($frame);
Заводской метод:
class MotorFactory
{
public function fromId($id)
{
return new Motor($id);
}
public function fromModel($model)
{
$id = $this->getIdFromModel($model);
return $this->fromId($id);
}
public function fromFrame($frame)
{
$id = $this->getIdFromFrame($frame);
return $this->fromId($id);
}
//supporting methods
private function getIdFromModel($model)
{
$sql = "SELECT id FROM ... WHERE model = ...";
return process($sql);
}
private function getIdFromFrame($size)
{
$sql = "SELECT id FROM ... WHERE size = ...";
return process($sql);
}
}
Я бы сделал их статическими функциями, членом Motor.
public static function getIdFromModel($model)
{
..
}
Затем вы можете вызвать функцию без необходимости экземпляра.
$id = Motor::getIdFromModel($model)
Motor
. Они не являются необходимыми для Motor
, и я думаю, что лучше их удалить оттуда.
$motor
а не параметр getter с отдельными методами "hydrating-lite". На мой взгляд, объект не создает сам себя. Смотрите также: symfony.com/doc/current/book/…