Какой шаблон проектирования я использую, когда мне нужно вызвать вспомогательную функцию перед созданием объекта?

1

У меня есть класс 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);

Вопрос

Какую структуру/класс/узор/функцию я использую вместо ??? выше?

Я знаю, что я могу создать класс только для вышеупомянутых двух функций, но я чувствую, что для этого есть лучший ответ/шаблон, и я хотел спросить. Я не вижу смысла создавать класс только для методов "что-то". Я хотел бы иметь какое-то значение.

  • 0
    Отражение (я думаю) code.tutsplus.com/tutorials/reflection-in-php--net-31408
  • 0
    Я бы порекомендовал шаблон репозитория, который возвращает сущность $motor а не параметр getter с отдельными методами "hydrating-lite". На мой взгляд, объект не создает сам себя. Смотрите также: symfony.com/doc/current/book/…
Показать ещё 2 комментария
Теги:
oop
design-patterns

3 ответа

1

Для этого вы обычно используете Factory Patter. Это может быть автономная функция или метод статического класса в зависимости от того, как вы хотите ее реализовать.

http://www.oodesign.com/factory-pattern.html

0

Метод 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);
    }
}
0

Я бы сделал их статическими функциями, членом Motor.

public static function getIdFromModel($model)
{
  ..
}

Затем вы можете вызвать функцию без необходимости экземпляра.

$id = Motor::getIdFromModel($model)
  • 0
    "Какую структуру / класс / шаблон / функцию я использую вместо ??? выше?" Я знаю, что это не шаблон дизайна, но я ответил на ваш вопрос imho.
  • 0
    это работает .. хотя я хочу найти эти методы более постоянным домом. Я вижу их как дополнительные вспомогательные методы для класса Motor . Они не являются необходимыми для Motor , и я думаю, что лучше их удалить оттуда.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню