2015-11-09 4 views
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 из базы данных, когда некоторые другие не- 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); 

Вопрос

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

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

+0

Отражение (я думаю) http://code.tutsplus.com/tutorials/reflection-in-php--net-31408 – circusdei

+0

Я бы рекомендовал [Образцовый шаблон] (http://martinfowler.com/eaaCatalog/repository.html), который возвращает ' $ motor' вместо настройки геттера с помощью отдельных методов «увлажнения». На мой взгляд, объект не создает себя. См. Также: http://symfony.com/doc/current/book/doctrine.html#fetching-objects-from-the-database –

+0

Вы когда-нибудь соглашались на любой подход? –

ответ

0

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

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

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

$id = Motor::getIdFromModel($model) 
+0

" Какую структуру/класс/шаблон/функцию я использую вместо? ?? выше?" Я знаю, что это не шаблон дизайна, но я ответил на ваш вопрос imho. – ShaneDeconinck

+0

, который работает .. хотя я хочу найти эти методы более постоянным домом. Я рассматриваю их как более * поддерживающие * методы для класса «Мотор». Они не важны для «Мотор», и я думаю, что лучше всего их удалить с места. – Dennis

+0

ОК, это было не совсем понятно мне из вашего вопроса. Удачи вам в квесте. – ShaneDeconinck

1

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

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

0

Factory Method + вспомогательные методы

Использование:

$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); 

Factory Method:

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); 
    } 
} 
Смежные вопросы