1

getter および/または setter メソッドを両方を処理する単一のメソッドに置き換えることは良い考えですか?

例えば:

    function name($what = null){

      if(!$what)
        return $this->name;

      $this->name = $what;
    }

次のように使用します。

    // get name
    print $obj->name();

    // set name
    $obj->name('bla');

いくつかのフレームワークがそれを行うのを見てきました。コミュニティはそれを良い習慣と考えていますか、それとも悪い習慣と考えていますか? :P

より効率的であるように見えますが、私は PHP で getThing() と setThing() に慣れているため、少し混乱しているように見えます。このスタイルは jQuery を思い起こさせます。

4

5 に答える 5

7

getter および/または setter メソッドを両方を処理する単一のメソッドに置き換えることは良い考えですか?

いいえ。

たぶん、非常に特定のユースケースのためです。しかし、いいえ。に割り当てる必要がある場合は、独自のコードで検討してnullください$name。あなたのコードはそれを許可しません。

performanceに関して効率的である限り、方法がわかりません。最終的には、まだ 1 つのメソッド呼び出しを行います。を設定または取得します。

より少ないコードで効率的であることを意味する場合、独自のポイントで、読みやすさを犠牲にしています。これはより非効率的です。特に時間の経過とともに。

于 2012-11-15T12:35:38.673 に答える
2

私も単一メソッドのjQueryのようなソリューションを使用して気に入りましたが、何らかの理由で他の人が悪い習慣だと思った投稿を読んだことがあります。しかし、今、私はもう一度読んでいて、この投稿に出くわしました。

私のソリューションには(免責事項:圧縮されたフォーマット)がありました

class Person {
    protected $name;
    protected $age;
    public function name($value = null) {
        if (null !== $value) {
            $this->name = (string) $value;
            return $this;
        }
        return $this->name;
    }
    public function age($value = null) {
        if (null !== $value) {
            $this->age = (int) $value;
            return $this;
        }
        return $this->age;
    }
}

クラスのこのタイプのインターフェースを楽しんでいました

$person1 = new Person();
$person1->name('Bob')->age(30);
echo $person->name();

一般的な考え方は、$value が null の場合はプロパティを送り返し、それ以外の場合はプロパティを $value に設定し、タイプ キャストするか、他のフィルターを介して実行し、クラスのインスタンスを返すというものでした。

これを再確認したので、プロパティのデータ型またはクラスのいずれかになるため、IDE と戻り値を混同する可能性があるという事実を除いて、なぜこれがそれほど悪いのかよくわかりません。

ここでも値を false に設定する必要がありますが、(私にとっては) null に設定する必要があるエッジケースでは、デフォルト/条件チェックを 1 回限り/ケースバイケースで変更するだけで対応できます。

2 つのメソッドとそれに関連付けられた phpdoc ブロックを記述する必要がないという定型的な感覚が少ないことに感謝しています。

于 2013-01-04T16:00:18.693 に答える
2

一般に、あるときは何かを返し、別のときは別の何かを設定して void を返す関数を持つことは、決して良い考えではありません (読みやすさと findbug の理由)。

于 2012-11-15T12:53:55.330 に答える
1

あなたができることは、オブジェクト内のすべての変数に対してGetSetを作成することです。

したがって、関数 getName() および getAge() の代わりに

get('name') または set('name', 'Foo Bar'); を使用できます。

関数は次のようになります。

    public function __set($name, $value) {
    $method = 'set' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    $this->$method($value);
}

public function __get($name) {
    $method = 'get' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    return $this->$method();
}

ゲッターとセッターの効率的な代替手段を探しているなら、これがそれかもしれません。

于 2012-11-15T12:41:46.393 に答える