Оптимизация классов. PHP
Всем привет.
Столкнулся с такой задачей: Есть модель Авто. У нее есть параметры такие как : цвет, кузов, колеса и т.д. Для каждого параметра своя модель и своя таблица в БД. Так как параметры имеют схожие поля (id, name, datCreate) реализован родительский класс TechnicalData class TechnicalData { protected $id; protected $name; protected $tableName; protected $error; protected $DB; public function __construct() { $this->DB = new DB(); } public function getAllRecords() { $data = $this->DB->Select("SELECT * FROM " . $this->tableName . " LIMIT 20"); if(isset($this->DB->error)) { $this->error = "M_TechnicalData->getAllRecords => " . $this->DB->error; return false; } return $data; } } Наследники выглядят так: include_once('M_TechnicalData.php'); class Body extends TechnicalData { public function __construct() { parent::__construct(); $this->tableName = 'body'; $this->modelName = 'body'; } public function getError() { parent::getError(); return $this->modelName . " => ". $this->error; } } Для того что бы вывести все возможные данные о Авто реализован класс SpecialOffers То есть я хочу создать машину, нужно выбрать цвет из возможных, колеса из возможных (то есть все записи соответствующей таблицы) class SpecialOffers { public $id; protected $modelId; protected $Manufacturer; protected $manufacturerId; protected $bodyId; /* И Т.Д. */ public $error; protected static $_instance; // ПРИВЕДЕНЫ Не Все методы !!! public function getColors() { $this->Model('Color'); $this->Color = new Color(); $allColors = $this->Color->getAllRecords(); if($allColors == false ) { $this->error = "M_SpecialOffers->getColors => " . $this->Color->getError(); return false; } else { return $allColors; } } public function getRings() { $this->Model('Ring'); $this->Ring = new Ring(); $allRings = $this->Ring->getAllRecords(); if($allRings == false ) { $this->error = "M_SpecialOffers->getRings => " . $this->Ring->getError(); return false; } else { return $allRings; } } private function __clone() { } public static function Instance() { // проверяем актуальность экземпляра if (null === self::$_instance) { // создаем новый экземпляр self::$_instance = new self(); } // возвращаем созданный или существующий экземпляр return self::$_instance; } public function getError() { return $this->error; } protected function Model($fileName) { include_once("m/M_".$fileName.".php"); } } Как вы понимаете на страничке создания в контроллере вот такой код идет : //КУСОК КОДА $this->Model('M_SpecialOffers'); $SpecialOffers = SpecialOffers::Instance(); print_r($SpecialOffers->getManufacturers()); echo "<br/>"; print_r($SpecialOffers->getModels()); echo "<br/>"; print_r($SpecialOffers->getBodys()); echo "<br/>"; print_r($SpecialOffers->getColors()); echo "<br/>"; print_r($SpecialOffers->getMotors()); echo "<br/>"; print_r($SpecialOffers->getPpcs()); echo "<br/>"; print_r($SpecialOffers->getRings()); echo "<br/>"; print_r($SpecialOffers->getPrices()); // Пусть название вида вас не пугает и параметры будут передаваться только не реализовано пока $this->title = 'saleBook'; $this->content = $this->View('V_CreateSpecialOffer',array('title'=>$this->title)); break; Например можно реализовать вызов всех параметров авто через доп. метод класса SpecialOffers такой как getAllAttributes который будет делать действия которые сейчас делает контроллер но вопрос в другом Как можно убрать избыточност кода класса SpecialOffers Как видите все методы идентичны что мне не нравится и думаю что есть способ сделать это более компактно! Класс TechnicalData -> с методами для работы с БД которые идентичны во всех моделях наследниках (параметрах авто) Класс Body и ему подобные (параметры) наследуются от TechnicalData Класс SpecialOffers предназначен для удобства выбора параметров авто и в случае надобности для сохранения значений новых параметров. |
На самом деле ты слишком много пытаешься сделать по ооп. То что тебе надо сделать это грубо говоря фабрику. Одним запросом вытаскиваешь данные из таблички (чаще всего это данные в одной табличке), а потом через конструктоп запуливаешь данные в приватную переменную, а потом геттерами и сеттерами работай.
<?php class Auto { private static $_params; public function __construct ($params) { $this->_params = $params; } public function getId() { return isset($this->_params['id']) ? $this->_params['id'] : null; } public function getColor() { return isset($this->_params['color']) ? $this->_params['color'] : null; } } // getDB получаешь данные из таблички $dbAuto = array('id' => 1, 'color' => 'blue', ...); $auto = new Auto($dbAuto); $auto->getId(); $auto->getColor(); |
На фоне
print_r($SpecialOffers->getManufacturers()); echo "<br/>"; вопрос оптимизации кошмарных объектов как-то не прорисовывается. |
Часовой пояс GMT +3, время: 16:07. |