2012-01-13 1 views
2

私は、拡張性が高くなるように設計されたシステムの設計を決めようとしています。私が知ることから、抽象的なファクトリのようなパターンは、コードを複製することとは別に、基本メソッドのオーバーライドを許可しません(以下に示すように)。モジュラーデザインパターン

私はアスペクト指向プログラミングに関するいくつかの予備的な研究を行いましたが、私が探しているものに沿っているように見えますが、難しい時を過ごしています。

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; 
} 

(これが悪い例の一種ですが、うまくいけば、それは全体の私のポイントを取得するのに役立ちます)

目的のシステムを拡張するために利用可能な方法の非常に大きな割合を持っているでしょうし、私がしたいと思います開発者に必要な余分な労力と学習を最小限に抑えます。

私はAOPを探していますか、これを処理するには良い方法がありますか?

ありがとうございます!

答えて

-1

基本クラスを抽象クラスとして宣言する必要はありません。それを通常のクラスにして、渡された構築パラメータに基づいて他のクラスをロードしてインスタンス化することができます。コンストラクタは、コンストラクタがあるクラスだけでなく、クラスのインスタンスを返すことができます。コードの重複を避けるために、インスタンス化された関数と変数を静的に混在させることができます。静的関数または変数は、すべてのインスタンスで同じであることを覚えておいてください。静的変数を変更すると、すべてのインスタンスに対して変更されます。プラグインアーキテクチャのかなり基本的な例。

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]; 
    } 
} 
+0

この例では、キャッシュする意図も、データベースからロードする意図も設計によるものです。しかし、元のプログラムフローを変更するために、別の開発者がモジュール(モジュール1とモジュール2)を開発したと仮定します。はい、実際には、うまく設計されたアプリケーションにはネイティブキャッシュが含まれますが、これは単なる例です。あなたの方法は面白いですが、複数の拡張を許さず、既存のデザインパターンに関する質問にも答えません。しかし、ありがとう。 – Godwin

+0

これは、無制限の拡張を可能にします。ロードする拡張の名前を渡すだけで、基本クラスがロードし、そのインスタンスを作成してインスタンスを返します。このような設計では、すべての拡張機能/プラグインを基本クラス(工場)で管理し、必要に応じてすべての拡張機能をシングルトンにすることができます。プラグインは、ベースクラスの動作を変更するベースクラスのメソッドをオーバーロードする可能性があります。 –

0

したがって、デコレータ自体を定義せずにデコレータパターンを使用したいとします。

「はい」の場合、それはモンキータイピングであり、アスペクト指向のツールで行うことができます。これは、次の拡張機能やフレームワークと簡単に解決することができます。

  1. PHP Runkit Extension
  2. Go! Aspect-Oriented framework for PHP
  3. PHP-AOP Extension