Показать сообщение отдельно
  #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 предназначен для удобства выбора параметров авто и в случае надобности для сохранения значений новых параметров.
Ответить с цитированием