セッターとゲッターについて


一言で言えば、すべての時間ではない.
私は彼らの使用について話し合いたい.

免責事項


私はそれが古い議論であるということを知っています、しかし、私はそれがまだ価値があると思います.この記事は私の意見を反映している.

基礎


次のコードに精通しているかもしれません.
class Character {

    private $name;

    public function setName(string $name){
        $this->name = $name;
    }
    public function getName(){
        return $this->name;
    }
}
それが我々がゲッターとセッターと呼ぶものです.プライベートプロパティにアクセスするためだけに使用しないでください.それは奇妙な使用(いくつかは、貧しい使用を言うかもしれません).これは、データの検証の層を追加することができます.

マーフィーの法則


Anything that can go wrong will go wrong.


それはあなたのオブジェクトに十分です.それが誤用されるならば、それは悪用されます.それは多くの場合、ほとんどの場合、変更可能なクラスを作成するときに発生します.つまり、クラスの作成後に状態を変更することができます.
$character = new Character();
$character->setName("Gokû");
$character->setName("Freezer");
echo $character->getName();// displays "Freezer"
Gok Chenは今フリーザーです.宇宙7はもう意味をなさない.
大したことない?ハム、あなたは驚くかもしれません.支払いと電子商取引はどうですか?そのようなことがお金で起こりますか?

乱用を許さない


我々のコードでセッターを使用する代わりに、我々はそのようなコンストラクタを使用できました:
class Character {

    private $name;

    public function __construct(string $name){
        $this->name = $name;
    }
    public function getName(){
        return $this->name;
    }
}

$character = new Character("Gokû");
echo $character->getName();// displays "Gokû"
この方法では、オブジェクトを作成するときに名前が注入され、変更不可能です.setterはなく、属性はプライベートなままです.

使用するとき


この記事ではっきりしていないかもしれないのは、setterとgettersを使うときです.我々は、セッターが時々間違った選択であるのを見ました.
特に初心者のために、セッターとゲッターをデータをカプセル化する強力な方法と考えることは、まれでありません.まあ、その観点では、誰かがあなたのオブジェクトの状態をそのように複数回変更することができれば、それはおそらく良い考えではないでしょう.
それで、それはカプセル化を壊すようです?
ある程度、あなたの使用に応じて、はい、しかし、アクセッサとの考えはそれらを適用する前に値をチェックすることです(セッター)、そして、あなたがそうであるとき、そして、どんな処理が適用されるときでも、値を得るために.
言い換えると、セッターとゲッターは特定のタイプだけを許して、あなたが開発者として予想する何かを取り戻すために意味されます.

オブジェクトデザイン


何が良いオブジェクトデザインですか?それはとても広大な話題です.我々は、特にここで私がこの記事が不足して欲しい原因について話しません.
しかし、実装の詳細を知らなければ、setterとgettersでは確実ではありません.詳しくはそのポストを読んでください.


さらに、どんな検証層も持っていないなら、セッターとゲッターはほとんど興味がありません.
いくつかのIDE(統合開発環境)では、多くの場合、settersとgettersの使用を奨励します.それは間違いなく便利です(すべてのものを何度もタイプする必要はありません).
開発者の中には、セッターとゲッターをアンチパターンと考えています.

結論


imho、immutabilityは、それが可能なので、セッターはないより良い選択です.それは特にあなたのチームの新しい開発者に便利です.クラスがmutableである間、彼らは若干のバグを導入するかもしれません.
セッターを使うべきではないということです.あなたがそれがあなたの問題を解決すると思う場合でも、体系的にそれらを使用しないでください、それはトラップです.