編集:私が個人的な、または保護された変数/プロパティについてだけ話していると人々は想定しているようです。オブジェクト指向を学んだとき、たとえそれが公開されていたとしても、すべてのプロパティに対してゲッター/セッターを使うように教えられました(そして実際には変数/プロパティを決して公開しないように言われました)。私は始めから誤った仮定から始めているかもしれません。この質問に答える人々はあなたが公共の財産を持っているべきで、ゲッターやセッターを必要としないと言っているのかもしれませんが、それは私が教えたことや私が話していたことに反します。Answer60これには宗教戦争の可能性がありますが、ゲッター/セッターを使用している場合は、内部でも使用する必要があります。誰かが、そのプロパティが設定されるたびに実行する必要があるセッターにコードを追加し、そのプロパティはそのセッターが呼び出されることなく内部的に設定されています)。source42個人的には、一貫性を保つことが重要だと思います。ゲッターとセッターがある場合は、それらを使用してください。フィールドに直接アクセスするのは、アクセサが多くのオーバーヘッドを抱えているときだけです。不必要にコードを膨らませているように感じるかもしれませんが、将来的には頭痛の種を大幅に減らすことができます。古典的な例:後で、あなたはフィールドが機能する方法を変えることを望むかもしれません。それはオンザフライで計算されるべきであるか、あるいは多分あなたはバッキングストアのために異なるタイプを使用したいと思うでしょう。あなたが直接プロパティにアクセスしているならば、そのような変更は1つのうねりのための膨大なコードを壊すことができます。source25私は、「ゲッター」とセッターが素晴らしくて良いという感情が全会一致であることにかなり驚いています。[ゲッターとセッターは悪]]を提案します。確かに、タイトルは衝撃的価値のためのものですが、作者は有効なポイントを作ります。setters`があれば、それらのフィールドはpublicと同じくらい良いものになります。`getter`を呼び出すすべてのクラスに波及効果を与えずにプライベートフィールドの型を変更するのは非常に困難です。厳密にオブジェクト指向の観点からすると、オブジェクトはそれらの(うまくいけば)単一の責任に対応するメッセージ(メソッド)に応答するべきです。`Pen.getColor()`よりも私には意味があります。ゲッターとセッターはまた、クラスのユーザーがオブジェクトにデータを要求し、計算を実行してから、オブジェクトに他の値を設定することを推奨します。これは手続き型プログラミングとしてよく知られています。そもそも自分がやろうとしていたことを行うようにオブジェクトに指示するほうがよいでしょう。Expertイディオムとしても知られています。ゲッターとセッターはレイヤーの境界、つまりUI、永続性などにおいて必要な悪です。`getters`とsetterの可視性をそれらを必要とする人だけに減らすのに役立ちます。source19プロパティの使い方によって異なります。nameプロパティを持つ学生オブジェクトがあるとします。取得されていない場合は、Getメソッドを使用してデータベースから名前を取得できます。これにより、データベースへの不要な呼び出しを減らすことができます。今、あなたはあなたのオブジェクトの中に名前が呼ばれた回数を数えるプライベート整数カウンタを持っているとしましょう。無効なカウントを生成する可能性があるため、オブジェクトの内側からGetメソッドを使用したくない場合があります。etc)と、それをカウントするためのパブリックラッパーです。getName();を返します。getName();このようにして、あなたはまだ他の何かのためにその最初の引数を使うことができます(おそらくここでキャッシュされたデータを使うべきかどうかに関するフラグを送ることのように)。source13PHPはこれを処理するための無数の方法を提供しています。set`という魔法のメソッドがありますが、私は明示的なゲッターとセッターを好みます。これが理由です:バリデーションはセッター(そしてそれに関するゲッター)に置くことができますIntellisenseは明示的な方法で動作しますプロパティが読み取り専用、書き込み専用、または読み書き可能かどうかにかかわらず、問題はありません。どこでも、それは文書化されていませんsource11私はここでポイントを逃しているにちがいありません、なぜあなたはそのオブジェクトの特性にアクセスするためにオブジェクトの中でゲッターを使うのですか?これを結論として、ゲッターはゲッターを呼び出し、ゲッターはゲッターを呼び出すべきです。)source7「純粋主義者」とは「ほとんどのカプセル化」を意味します。通常、私は自分のすべてのフィールドをプライベートとして宣言し、クラス自体の中からthis.fieldを使用しますが、サブクラスを含む他のすべてのクラスはゲッターを使用してインスタンス状態にアクセスします。Demeterに従うことです。2つのクラスを結合し、オブジェクトをパラメータとして使用します。int、アクセス方法を使用し、プログラミングドメインではなく問題ドメインに名前を付けます。doSomethingWithProperty(this.daysPerWeek());これらはあなたがカプセル化とどんな事後条件または従属不変式も維持することを可能にするでしょう。setterメソッドを使って前提条件や依存する不変式を維持することもできますが、setterという名前を付けることの罠には陥らないでください。Principleに戻って名前を付けてください。source7オブジェクト内でもアクセサメソッドを使用する方が良いと思います。私の頭に浮かぶポイントは次のとおりです。1)オブジェクトの外部で行われたアクセスとの一貫性を保つために行われるべきです。2)場合によっては、これらのアクセサメソッドはフィールドにアクセスするだけでは不十分です。彼らはいくつかの追加処理をしている可能性があります(それはまれですが)。このような場合、フィールドに直接アクセスすることで、その追加の処理を見逃してしまい、この処理がこれらのアクセス中に常に行われることになっているとプログラムがうまくいかなくなる可能性があります。