18

PHP で変更できないオブジェクトを作成するのは良い考えですか?

たとえば、セッターメソッドを持つ日付オブジェクトですが、それらは常にオブジェクトの新しいインスタンスを (変更された日付で) 返します。

これらのオブジェクトは、クラスを使用する他の人々を混乱させるでしょうか? PHP では通常、オブジェクトが変更されることが予想されます。

$obj = new Object(2);

$x = $obj->add(5); // 7
$y = $obj->add(2); // 4
4

7 に答える 7

29

不変オブジェクトには setter メソッドがありません。限目。

誰もがsetXyz()メソッドの戻り値の型が void であることを期待します (または、緩やかに型付けされた言語では何も返さない)。不変オブジェクトに setter メソッドを追加すると、人々が混乱し、醜いバグが発生します。

于 2013-01-20T17:19:51.993 に答える
16

私の意見では、オブジェクトは値オブジェクトに対して不変であるべきです。それ以外には、アプリケーション全体でオブジェクトを共有しない限り、あまり利点はありません。

ここにはいくつかの間違った答えがあります。不変オブジェクトはセッターを持つことができます。PHP での不変オブジェクトの実装を次に示します。

例 #1。

class ImmutableValueObject
{
    private $val1;
    private $val2;

    public function __construct($val1, $val2)
    {
        $this->val1 = $val1;
        $this->val2 = $val2;
    }

    public function getVal1()
    {
        return $this->val1;
    }

    public function getVal2()
    {
        return $this->val2;
    }
}

一度インスタンス化するとわかるように、値を変更することはできません。

例 2: を使用setters:

class ImmutableValueObject
{
    private $val1;
    private $val2;

    public function __construct($val1, $val2)
    {
        $this->val1 = $val1;
        $this->val2 = $val2;
    }

    public function getVal1()
    {
        return $this->val1;
    }

    public function withVal1($val1)
    {
        $copy = clone $this;
        $copy->val1 = $val1;

        return $copy;    // here's the trick: you return a new instance!
    }

    public function getVal2()
    {
        return $this->val2;
    }

    public function withVal2($val2)
    {
        $copy = clone $this;
        $copy->val2 = $val2;

        return $copy;
    }
}

いくつかの実装が可能であり、これは決して排他的なリストではありません。そして、リフレクションを使用すると、PHP でそれを回避する方法が常にあることを忘れないでください。したがって、不変性は最終的にすべて頭の中にあります。

多くの場合、不変オブジェクトを final にすることも良い習慣です。

編集:

  • setX を withX に変更
  • ファイナルについてのコメントを追加
于 2015-11-25T02:52:00.243 に答える
5

不変オブジェクトは最初の作成後に変更できないため、その基本原則に反するため、setter メソッドを使用しても意味がありません。

クラス メンバーの可視性を操作し、マジック メソッドをオーバーライドすることで、PHP の不変性をシミュレートするいくつかの回避策を実装できますが、__set()不変性は PHP 言語の機能ではないため、不変であるとは限りません。

PHPで不変の値型を提供する拡張機能を誰かが書いたことがあると思いますが、それについてはグーグルで検索できます。

于 2013-01-20T18:02:35.327 に答える