2

MyClassフィールドのバウンスがあり、各値は別のインスタンス値に依存し、最後に。に依存しますDependencyClass。非常に簡単な例:

ソリューションA(コンストラクターを使用)

public class MyClass
{
    private $myField1, $myField2;

    public function MyClass(DependencyClass $dependency)
    {
        $value = $dependency->getValue();
        $value++; // Computations on dependency value

        $this->myField1 = $value + 3;
        $this->myField2 = $value - 1;
    }

    public function getMyField1()
    {
        return $this->myField1;
    }

    public function getMyField2()
    {
        return $this->myField2;
    }
}

私の質問は、クラスコンストラクターはこの計算ロジックを配置する適切な場所ですか?または、次のようなコードの複製を行う方が適切です。

ソリューションB(依存関係のみのコンストラクター)

public class MyClass
{
    private $dependency;

    public function MyClass(DependencyClass $dependency)
    {
        $this->dependency= $dependency
    }

    public function getMyField1()
    {
        $value = $this->dependecy->getValue();
        $value++; // Computations on dependency value

        return $value + 3;
    }

    public function getMyField2()
    {
        $value = $this->dependecy->getValue();
        $value++; // Computations on dependency value

        return $value - 1;
    }
}

または、MyClass単にコンテナを作成し、次のような外部アセンブラクラスを使用します。

ソリューションC(外部アセンブラー)

Class Assembler
{
    public getMyClass()
    {
        $dependency = new Dependency();
        $value      = $dependency->getValue();
        $value++; // Computations on dependency value

        $myClass = new MyClass();
        $myClass->setMyField1($value + 3);
        $myClass->setMyField2($value - 1);

        return $myClass;
    }

}
4

2 に答える 2

1

それはあなたの状況とニーズに依存します。

計算が単純で常に使用されている場合は、それらをコンストラクターに入れます。(ソリューションA)

計算の1つが複雑であるか、常に使用されるとは限らない場合は、アクセサーで「遅延評価」を選択し、計算された結果をアクセサーにキャッシュさせます。(ソリューションBですが、結果のキャッシュを追加します)。

ソリューションCはお勧めしません。これは実際には別のスコープのコンストラクターであるため、クラスのまとまりが少なくなります。別のクラスへの依存関係を非表示にします。他のクラスはモックまたはスタブできないため、テストが困難になります。クラスが存在する理由はほとんどありません。読み取り専用配列とほぼ同じです。

于 2012-06-02T00:08:47.213 に答える
1

答えは「状況次第」です。何を達成しようとしていますか?

ソリューションAとBを使用して、依存関係と計算への結合をMyClassオブジェクトの本質的な部分にしました。MyClassは依存関係とともに存在せず、常に特定の方法で依存関係を使用します。一方、ソリューションCは、MyClassをDependencyから完全に切り離し、MyClassを控えめなデータオブジェクトにします。

したがって、問題は、特定の瞬間に直面するより具体的なケースでどちらが理にかなっているのかということです。MyClassのデータを将来さまざまな方法で構築できるようにしたいですか、それとも常にDependencyから作成したいですか?

于 2012-06-01T12:30:50.630 に答える