Модульная конструкция - PullRequest
       23

Модульная конструкция

2 голосов
/ 14 января 2012

Я пытаюсь принять решение о разработке системы, которая должна обеспечивать большую степень расширяемости. Из того, что я могу сказать, шаблон, такой как абстрактная фабрика, не позволял бы переопределять базовые методы, кроме дублирования кода (как показано ниже).

Я провел некоторые предварительные исследования в аспектно-ориентированном программировании, и, похоже, это соответствует тому, что я ищу, но мне трудно обдумать детали.

abstract class Object {

    protected $object_id;
    protected $name;

    function LoadObjectData()
    {
        $file_contents = readfile('object'.$object_id.'.data');
        $data = array();
        // parse file contents into $data array...
        return $data;
    }

    function Create()
    {
        $data = $this->LoadObjectData();
        $name = $data['name'];
        return $data;
    }

}

class User extends Object {

    protected $email_address;

    function Create()
    {
        $data = parent::Create();
        $this->email_address = $data['email_address'];
        return $data;
    }

}

//----------Module 1-MySQL Lookup-------------
/*
 * Redefine Object::LoadObjectData() as follows:
*/

function LoadObjectData()
{
    $data = array();
    $result = mysql_query("SELECT...");
    // construct array from result set
    return $data;
}

//----------Module 2-Cache Machine-------------
/*
 * Redefine Object::LoadObjectData() as follows:
 */

function LoadObjectData()
{
    if (exists_in_cache($object_id)) {
        return get_cached_object($object_id);
    }
    $data = parent::LoadObjectData();
    cache_object($object_id, $data);
    return $data;
}

(Это плохой пример, но, надеюсь, это поможет донести мою мысль)

Предполагаемая система будет иметь очень большую долю доступных методов для расширения, и я хотел бы минимизировать дополнительные усилия и обучение, необходимые для разработчиков.

Является ли АОП именно тем, что я ищу, или есть лучший способ справиться с этим?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 декабря 2013

Итак, вы хотите использовать шаблон декоратора, не определяя сам декоратор.

Если да, то это мартынч-патчинг, и его можно выполнить с помощью аспектно-ориентированных инструментов.Это можно легко решить с помощью следующих расширений и платформ:

  1. Расширение PHP Runkit
  2. Go!Аспектно-ориентированная среда для PHP
  3. Расширение PHP-AOP .
0 голосов
/ 14 января 2012

Вам не нужно объявлять базовый класс как абстрактный класс. Вы можете сделать его обычным классом, чтобы он загружал и создавал другие классы на основе переданных параметров конструкции. Конструктор может возвращать экземпляр класса, а не только класс, в котором находится конструктор. Чтобы избежать дублирования кода, вы можете смешивать статические с экземплярами функций и переменных. Просто помните, что статическая функция или переменная одинаковы для ВСЕХ экземпляров. Измените статическую переменную на одну, и она будет изменена для всех экземпляров. Довольно простой пример архитектуры плагина.

class BaseObject {
    protected static $cache = array();

    public function __construct($load_plugin) {
        require_once($load_plugin.'.class.php');
        $object  = new $load_plugin();
        return $object;
    }

    public static function cacheData($cache_key, $data) {
        self::$cache[$cache_key] = $data;
    }
}

class Plugin extends BaseObject {
    public function __construct() {
    }

    public function loadData() {
        // Check the cache first
        if ( !isset(self::$cache[$cache_key]) ) {
            // Load the data into cache
            $data = 'data to cache';
            self::cacheData($cache_key, $data);
        }
        return self::$cache[$cache_key];
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...