2

PHP と MySQL で書かれた PBBG (ゲーム) を 7 か月間開発してきました。プロジェクトはほぼ完了し、まもなくリリースされる可能性がありますが、いくつかの問題が心配です。

実際のプロジェクトをプログラミングするのはこれが初めてであり、OOP を使用するのも初めてでした。私のコードは現在約 25,000 行あります。これが私の質問です。

OOP を正しく使用していますか? クラスの構成要素を過度に呼び出していると思います。私は約 20 の異なるクラスを持っていますが、お互いが必要な場合もあります。OOP の使用方法のサンプル コードを次に示します。

class A {
    
    public $b;
    public $c;

    public function __construct(){
        $b = new B();
        $c = new C();
    }

    public function sampleA(){
        //some stuff that depends $c->sampleC
    }

}

class B { 

    public $c;

    public function __construct(){
        $c = new C();
    }

    public function sampleB($id){
        return $this->c->sampleC($id);
    }

}

class C {

    public function sampleC(){

    }

}

次に、次を使用します。

$a = new A();
$b = new B();
$c = new C();

$whatIWant = $a->sampleA($b->sampleB($c->sampleC()));

私はただできましたが

$a = new A();
$whatIWant = $a->sampleA($a->b->sampleB($a->c->sampleC()));

この単純な例では、これは必要ないように見えますが、スクリプトで 200 を超えるさまざまなコンストラクター呼び出しを行っているため、サーバーの速度が低下し、過負荷になると思います。

おそらく私の例はあまり明確ではなかったので、xdebug プロファイラーの結果を印刷しました。

印刷する

私が必要とするのはシングルトンですか?このような単純な例をシングルトンで使用してみましたが、同じ結果が得られました (クラスごとに複数の構成体)。
これらのクラスを拡張して、親のコンストラクターを使用する必要があるのでしょうか? しかし、20 の異なるクラスが独立していたり​​依存していたり​​すると、どのようにそれが可能になるのでしょうか?
あるいは、私はそれを正しい方法で使用しているのかもしれません (私はそうは思いません)。

4

2 に答える 2

3

私はそんなことはしません。私が行う方法は、依存性注入を使用することです。クラスのインスタンスを に設定しましたprotected(または に設定しましたprivate)。それらを公開する必要はありません。必要だと思われる場合は、ほぼ確実にいくつかの規則に違反しており、設計を再考する必要があります。

私が変更したもう1つのことは、あなたがしたことです$b = new B()。これには 2 つの問題があります。

  1. 私はあなたがするつもりだったと思います$this->b = new B()
  2. Bクラスを他のクラスに密結合しています。

Bこれにより、クラスをモック クラスに置き換えることができないため、単体テストを行うことができなくなります。したがって、ユニット (クラス) をテストする代わりに、複数のクラスをテストしています。

私が行ったもう1つのことは、コンストラクターパラメーターの型ヒントです。クラスのインターフェースがある場合、これはさらに便利です。これにより、クラスのテストも非常に簡単になります。この関連する回答も参照してください。

興味があるかもしれないいくつかのビデオ:依存性注入単体テスト継承、ポリモーフィズム、およびテストまた、 SOLID プログラミングについても少し読みたいと思うかもしれません。コードもLoDに違反しているようです。つまり、他のオブジェクトを介してアクセスしようとしています。

このようなことは、私がやったことです:

class A
{
    protected $b;
    protected $c;

    public function __construct(B $b, C $c)
    {
        $this->b = $b;
        $this->c = $c;
    }

    public function sampleA()
    {
        $this->c->sampleC();
    }
}

class B
{     
    protected $c;

    public function __construct(C $c)
    {
        $this->c = $c;
    }

    public function sampleB($id)
    {
        return $this->c->sampleC($id);
    }
}

class C
{    
    public function sampleC() { }
}

$b = new B();
$c = new C($b);
$a = new A($b, $c);

$whatIWant = $a->sampleA();

正しい OOP コードを書きたい場合は、signleton アンチパターンを (imho) 使用しないでください。基本的に、これはglobal.

これらのクラスを拡張して、親のコンストラクターを使用する必要があるのでしょうか? しかし、20 の異なるクラスが独立していたり​​依存していたり​​すると、どのようにそれが可能になるのでしょうか?

子クラスが親クラスを置き換えることができる場合にのみ、クラスを拡張する必要があります。これを SOLIDではリスコフ置換原理と呼んでいます。言い換えれば、あなたは言うことができなければなりませclass childclass parent.

于 2012-09-03T19:23:24.973 に答える
2

必要なのは、依存性注入と組み合わせた制御パターンの反転です。

これらのパターンを使用すると、クラスを疎結合に保ち、すべてのクラスが正しいクラスとパラメーターで構築されるようにすることができます。

ほとんどの優れた PHP フレームワークには、IoC と DI の実装があります。Symphonyのこのチュートリアルを見てください。

于 2012-09-03T19:21:42.480 に答える