1

構成といくつかの状態固有のメソッドを含む State クラスがあります。また、この State オブジェクトへの参照を持つ MVC クラスを継承する Factory クラスもあります。これにより、すべての MVC オブジェクトに特定の State 関連の機能があることが保証されます。たとえば、私の State クラスには、キャッシュまたはセッションを設定および読み取るためのメソッドが含まれています。

私の Factory クラスには、次のように単純なラッパーであるメソッドがいくつかあります。

public function myFunction($data){
    $this->State->myFunction($data);
}

これらのメソッドは Factory で定義されていますが、実際には State オブジェクトによって実行されます。$this->myFunction();これにより、コードを記述するときに、State を含む長いものではなく、: を呼び出すことができ ます。

PHP が内部でどのように機能するかについてはよくわかりませんが、これは効率的ですか? 私は通常、State オブジェクトのインスタンスを 1 つしか持たないため、Factory クラスにメソッド ラッパーを配置する方がよいと考えていました。そうしないと、ほとんどの場合使用されない多くのコードがメソッドに含まれるからです。しかし、PHPが内部でどのように機能するかはわかりません。

親の Factory クラスを持ち、それらすべてが同じ State オブジェクトを参照する多数のオブジェクトが存在する場合があります。State を直接処理するのではなく、State のメソッドを呼び出すだけのラッパー メソッドを Factory に定義することは効率的ですか? それとも、システム全体に追加のオーバーヘッドを追加しているだけですか?

私の考えは、Factory が単に継承され、多くの機能のラッパーを含むクラスである場合、開発をより効率的に合理化できるというものでした。メソッドで完全に定義されたコードではなく、継承元のクラスにラッパーがある場合、メモリを節約できますか?

4

1 に答える 1

3

いいえ、そのようなラッパーにはパフォーマンス上の利点はありません。実際、これは非常に小さなパフォーマンスの損失です。

さらに重要なことは、このように依存関係を隠しているため、コードの保守が難しくなる可能性があることです。


あなたのトピックに関するいくつかの考え

私はあなたがそれをすべて間違ってやっているという印象を受けますtm。あなたが質問に書いたことに関して私が抱えている問題は次のとおりです。

  • クラスは構成または「状態固有のメソッド」Stateを担当していますか?

    SRPのようなものがあります。これは、すべてのクラスが単一の責任を持つべきであると述べています。また、すべてのクラスで変更するシーズンは 1 つだけにする必要があるとも言えます。

  • 「MVC クラス」がクラスから継承されるのはなぜFactoryですか?

    オブジェクト指向コードでは、キーワードはクラス間のis-a 関係をextends表します。持っていても大丈夫ですが、書くと完全に狂ってしまいます..そしてちょっと侮辱的です。これはLSPでカバーされています(簡単な説明については、こちらを参照してください)。class Oak extends Treeclass User extends Table

  • Factoryパターンの目的を誤解しています。

    工場は創造的なパターンです。つまり、ファクトリの目的はオブジェクト インスタンスを返すことです。インスタンスへのアクセスを提供するいくつかのメソッドを継承する代わりにState、作成された各構造に注入する必要があります。

    class Factory
    {
        protected $state = null;
    
        public function __construct( $state )
        {
            $this->state = $state;
        }
    
        public function create( $name )
        {
            $instance = new $name( $this->state );
            return $instance;
        }
    }
    

    これには、Factoryインスタンスが作成したすべての構造が同じインスタンスを共有するという追加の利点がありStateます。

  • あなたのコードベースをグローバルな状態にしようとしているようです

    アプリケーション内のすべてが のインスタンスにアクセスする必要がある場合、Stateアーキテクチャ全体に深刻な問題があります。単一のオブジェクトがすべてのレイヤーに存在する状況になり、抽象化に大きなリークが発生します。基本的に、グローバル変数を隠しているだけです。

于 2012-06-29T00:04:31.130 に答える