内部変数がパブリックと宣言され、アクセス可能であるときに使用される用語はありますか?


10

ゲッター/セッターメソッドを使用せずに内部変数$ _fieldsにアクセスできるように誰かがコードを記述した場合、それを説明する適切な用語はありますか?

管理で使用するのに十分な丁寧なもの:)


9
カプセル化の欠如?
2011

@Oded私はあなたが正しいと思います-カプセル化の欠如/不十分なカプセル化はそれをよく説明しています
PeterB

この質問に答えようとしているときに私が考えた2つのフレーズは、「漏れやすい抽象化」と「ルーズスコーピング」でした。これらのそれぞれは(私の頭の外で)何を指しますか?
PeterB

1
漏れのある抽象化とは、概念を抽象化しようとしたが実際には機能しない場合です。基礎となる概念は依然として漏れています(SQL上のORMおよびHTTP / HTML上のWebフレームワークは、漏れやすい抽象化になる傾向があります)。
2010

@PeterB-Odedの説明に追加するには、これを参照してください:joelonsoftware.com/articles/LeakyAbstractions.html
Joris Timmermans

回答:


30

プライベートメンバーを公開することは、礼儀正しい社会では決して良いことではありません...

この習慣は、カプセル化の欠如/不十分です。


6
+1、まあ、あなたはあなたのプライベートをオフィスに出さないでしょうか?
StuperUser

6
-1:カプセル化は実際に起こり、よく起こりました。しかし、それは一般的に受け入れられている方法でソースコードを通じて文書化されていませんでした。一部の言語(Pythonなど)には真にプライベートな変数がありませんが、それでもカプセル化を実践しています。
S.Lott、2011

6
@Oded:カプセル化は設計コンセプトです。言語によって、概念の実装は異なります。プライベート宣言を持つ言語は、1つの実装を許可します。ステートレスオブジェクトを使用する関数型プログラミング言語では、実装が異なる場合があります。Python(を欠いているprivate)には、カプセル化の概念のさらに別の実装があります。
S.Lott、2011

1
@Sロット; Oded-カプセル化は適切であり、プライベート変数が他のクラスから頻繁に直接アクセスされるコードに依存することは、カプセル化が不十分です。Pythonでは、これを行うには、別のクラスの名前がマングルされたプライベート変数にアクセスするか、単一の下線プレフィックスの規則を無視します(ただし、ゲッターが他の動作をしている場合は__、名前のマングリングに実際に使用する必要があります)。他の言語でも、カプセル化が不十分な場合があります。たとえば、Javaでのリフレクションや、C ++でのポインター演算により、プライベート変数にアクセスできます。Pythonは、構文を複雑にしないだけです。
ジンボブ博士、2011

2
@drjimbob:Pythonコードが__名前のマングリングを使用することはほとんどありません。がなくて__も、デザインは良好なカプセル化を反映しています。「パブリック」が「カプセル化の欠如/不十分なカプセル化」を意味すると主張することは間違っています。コンセプトはまだ存在しています。ソースコードには適切な装飾がありません。
S.Lott、2011



2

そのプロパティバッグと呼ばれます。

通常、関連する可能性のあるプロパティのセットを保持するために使用されます(それぞれが、適切なアクセス指定子を持つクラスオブジェクトである可能性がある場合)。しかし、周囲の構造はプロパティのバッグにすぎません。


2

「特定のコーディング標準に従っていない」と呼ばれています。

OPは書きました:

内部変数$ _fieldsは、getter / setterメソッドを使用せずにアクセスできます

それはあなたの標準に反するかもしれません、そしてそれはそれがコード臭いかもしれません。しかし、それは必ずしも不十分なカプセル化ではありません。ゲッターとセッターを介して内部変数(「内部使用のみ」など)を外部に公開すると、さらに悪くなります。

問題は$_fields、外部からアクセスできるようにする必要があるかどうかです。

もしそうなら、getter / setterメソッドを追加するケースがあります。これらのメソッドは何もカプセル化しませんが、それ$_fieldsはある種の変数であるという事実(その場で計算/フェッチなどされるものとは対照的です)。言語にもよりますが、おそらく型(実装の詳細)を外部に漏らしてしまうでしょう。常にゲッター/セッターが必要かどうか、または「必要」な場合のみコーディング標準の問題。

アクセスできないようにする$_fields必要ある場合は、アクセスしないでください。他の人が言語レベル(プライベートや友達)でアクセスできないようにする必要があるかどうか(特定の状況でのデバッグが容易になる可能性があります)は、コーディング標準の問題です。

カプセル化の問題はこれと完全に直交しています。ゲッターとセッターを使用すると、カプセル化の違反が完全に可能になります。それもあります簡単にコード一見のベストプラクティスを、次のだ-彼らはゲッターとセッターの束を見たときにほとんどの人々の警鐘を鳴らしていないので、にスリップします。コードは、$_fieldsたまたまとして指定されていないと呼ばれる変数よりも、内部の実装の詳細にはるかに多くの依存関係をもたらす可能性がありますprivate

私は悪いアナロジーのファンです。不十分なカプセル化は、銃を構えている誰かを殺人者と呼ぶようなものです。



-2

あなたのセッター/ゲッターメソッドが何もない場合

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

次に、pubic変数を作成するだけで、違いが問題となるいくつかのエッジケース以外の入力を節約できます。


3
それがあなたのゲッターとセッターが今やっていることのすべてだからといって、それが常にそうであることを意味するわけではありません。また、セッターに検証を追加するために、プロパティがアクセスされるすべての場所を見つけるために数万行のコードをくまなく調べる必要がある場合、最初のカプセル化を意図的に回避することで、節約した数十秒が瞬時に吹き飛ばされます。
Plutor

@Plutor:オブジェクトがそれだけの場合(たとえば、別のプロセスに送信されたメッセージまたはデータベース内のレコードを表すため)、問題はありません。それらは高度に保存されるべきものです。
ドナルフェロー2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.