私は、拡張性が高くなるように設計されたシステムの設計を決めようとしています。私が知ることから、抽象的なファクトリのようなパターンは、コードを複製することとは別に、基本メソッドのオーバーライドを許可しません(以下に示すように)。モジュラーデザインパターン
私はアスペクト指向プログラミングに関するいくつかの予備的な研究を行いましたが、私が探しているものに沿っているように見えますが、難しい時を過ごしています。
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とモジュール2)を開発したと仮定します。はい、実際には、うまく設計されたアプリケーションにはネイティブキャッシュが含まれますが、これは単なる例です。あなたの方法は面白いですが、複数の拡張を許さず、既存のデザインパターンに関する質問にも答えません。しかし、ありがとう。 – Godwin
これは、無制限の拡張を可能にします。ロードする拡張の名前を渡すだけで、基本クラスがロードし、そのインスタンスを作成してインスタンスを返します。このような設計では、すべての拡張機能/プラグインを基本クラス(工場)で管理し、必要に応じてすべての拡張機能をシングルトンにすることができます。プラグインは、ベースクラスの動作を変更するベースクラスのメソッドをオーバーロードする可能性があります。 –