2

私は次のようなコードをたくさん見ます (そして書きます):

class MyClass
{
    private $_myProperty;

    public function setMyPropert($myProperty)
    {
         $this->_myProperty = $myProperty;
    }

    public function getMyProperty()
    {
         return $this->_myProperty;
    }
}

クラスのプロパティは常にプライベートにする必要があると教えられているためです。

しかし、私は本当に上記のシナリオでこれをやりたいだけです:

class MyClass
{
    public $myProperty;
}

これにより、コードが大幅に減り、読みやすくなります。しかし、他の開発者はこのコードを見下し、おそらくコード レビューなどで失敗するでしょう。

なぜですか?これは、oop コードの開発者に根付いているものですか? または、おそらくテスト、将来のメンテナンス、またはその他の明らかでない技術的な理由に関連して、私が行方不明になっている別の理由があります。私は、getter/setter が get/set よりも多くのことに注意を払うシナリオで具体的に話しています。

4

2 に答える 2

1

ゲッターとセッターで何もしていない場合は、プロパティを公開することもできます。ただし、セッターは通常、値をチェックして有効であることを確認するために使用されます。

public function setFoo($foo) {
    if (!is_string($foo)) {
        throw new InvalidArgumentException('No you foo-l!');
    }
    $this->foo = $foo;
}

クラスの整合性を確保するためにこれを行うことをお勧めします。これがカプセル化の目的です。また、このチェックを現在行っていなくても、無効な値の設定に起因する 3 番目のバグを修正した後に、将来追加する可能性があります。その後、プロパティの割り当てではなくメソッド呼び出しに突然切り替え始めると、プロパティを設定するすべてのコードを改良するのに苦労することになります。

できるだけ早く実際のカプセル化を開始することをお勧めします。

于 2013-08-28T20:01:15.887 に答える
0

これは、オープン/クローズの原則に帰着します。

ソフトウェア エンティティ (クラス、モジュール、関数など) は、拡張用に開いている必要がありますが、変更用に閉じている必要があります。

このコンテキストでは、原則は、クラスのメンバーがデフォルトで private であるべきであることを意味します。

場合によっては、パブリック メンバーを宣言するだけでよいように思えるかもしれません。できますが、原則として行うべきではないというのは事実です。部分的には、悪い習慣を避けているだけです。クラスのすべてのメンバーをすべての人に公開するのは、ずさんです。

それはまた、あなたの意図を伝える問題でもあります: 誰かが公開メンバーを見たら、彼らはどう思いますか? 作成者がメンバーを公開するつもりだったのか、それとも自分が何をしているのか本当に知らなかっただけなのかをすぐに知る方法はありません。

于 2013-08-28T20:02:56.327 に答える