私は現在、サードパーティの開発者に使用してもらいたい API の構築を支援しています。この API は、クラウド内のサービスにフックします。このサービスは常に変化しており、現時点ではあまり信頼できません。したがって、SDK で実際のクライアントと偽のクライアントの両方を提供したいと考えています。サービスがダウンしたときはいつでも、開発者は本物のクライアントではなく偽のクライアントを使用して、コーディングを続けることができます。
私はあらゆる種類のデザインパターンを調べましたが、いくつかは私の問題にうまく対処しました。ただし、問題は次のとおりです。コードをできるだけ単純にしたいと考えています。たとえば、私のサービスが Experia と呼ばれているとします。私は人々がこのようなことをできるようにしたい:
class Experia extends Exp
...
$ex = new Experia(/*initialization parameters*/); //init prameters like user name, password etc
$ex->story()->create($storyArgs);
現在、Experia は、これらのリソースとそれらが利用できるファイルのリストを含む別のクラス Exp を拡張するクラスです。また、基本的な get() および post() メソッドなどを定義する Client と呼ばれるジェネリック クラスも拡張します。そして基本的にクライアントのリモートURLなどを設定します(ペストライブラリをラップします)
したがって、Exp は次のようになります。
class Exp extends Client
{
public function story() {
include_once('classes/User.php');
}
//other resource methods
}
すべての偽のリソースを含む別のクラスを作成したい..次のようなもの:
class ExpFake extends Client
{
public function story() {
include_once('classesFake/User.php');
}
//other resource methods
}
これが私が直面している問題です。私は Experia がその宣言に応じて Exp または ExpFake を醜いことなく拡張できることを望んでいます..そして醜いとは、私の API を使用する開発者が使用しなければならない余分なコードを意味します。たとえば、私がやろうとしたことの1つは、クライアントをExpから切り離し、基本的にこれを行うことでした
$ex = new Experia(/*... */);
$ex->client = new fakeClient(); //I could also do $ex-> client = new realClient();
しかし、問題は、使用したいたびにリソースを呼び出すことでした..クライアントを指定する必要がありました:
$this->client->story()->create($args)
クライアント部分は、API に含めることができない余分なコードです。
簡単に言えば..あるクラスまたは別のクラスから選択的に継承するのと同じ結果を達成するデザインパターン(または可能であれば直接的な方法..php)は何ですか
これを行うオプションがあるように:
class Experia extends (Experia の初期化パラメータに応じて Exp または ExpFake のいずれか)