Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.12.2013, 15:45
Аватар для Duda.Ml1986@gmail.com
Профессор
Отправить личное сообщение для Duda.Ml1986@gmail.com Посмотреть профиль Найти все сообщения от Duda.Ml1986@gmail.com
 
Регистрация: 01.09.2011
Сообщений: 263

Оптимизация классов. 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 предназначен для удобства выбора параметров авто и в случае надобности для сохранения значений новых параметров.
Ответить с цитированием
  #2 (permalink)  
Старый 08.12.2013, 13:54
Интересующийся
Отправить личное сообщение для Ruzarh Посмотреть профиль Найти все сообщения от Ruzarh
 
Регистрация: 01.05.2011
Сообщений: 22

На самом деле ты слишком много пытаешься сделать по ооп. То что тебе надо сделать это грубо говоря фабрику. Одним запросом вытаскиваешь данные из таблички (чаще всего это данные в одной табличке), а потом через конструктоп запуливаешь данные в приватную переменную, а потом геттерами и сеттерами работай.

<?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();
Ответить с цитированием
  #3 (permalink)  
Старый 05.01.2014, 16:41
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

На фоне

print_r($SpecialOffers->getManufacturers());
echo "<br/>";


вопрос оптимизации кошмарных объектов как-то не прорисовывается.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Связь между страницами с javascript и php ... и обратно okrip25 AJAX и COMET 7 09.01.2012 14:43
Запуск выполнения PHP при нажатие на кнопку??? Abibas220 Общие вопросы Javascript 1 05.01.2011 12:05
Как передать картинку из javascript в php KIVagant AJAX и COMET 3 12.05.2010 11:54
javascript и php (Вопрос) Гауляйтер Общие вопросы Javascript 3 06.05.2009 09:23