9

OODの経験則は、合理的に達成できる限り、特定のオブジェクトのすべてのメンバーへのアクセスを最小限に抑えることであることを理解しています。

C#とJavaはどちらも、同じアクセス修飾子のセットを実装しているようです。ただし、しばらくの間私を当惑させたのは、Javaクラスがほとんどパブリックとして宣言されているように見えるのに対し、C#クラスはほとんどデフォルトとして宣言されているように見える理由です。 これらの言語にこれらの違いを課す微妙な点はありますか、それとも単に慣習の問題ですか、それとも何ですか?

コンパイラを喜ばせるために、C#コード(内部クラス、匿名クラス、および範囲が狭く有用な他のクラスを除くほとんどのクラスを習慣的に公開しています)を頻繁に使用していますが、何かが足りないのではないかと思います。重要。

4

4 に答える 4

6

あなたはあなたの質問に答えたと思います。Joshua Bloch によると、「経験則は単純で、各クラスまたはメンバーにできるだけアクセスできないようにすることです。」 効果的なJava

于 2009-08-18T19:34:03.987 に答える
5

Java のスコープは、 C#のスコープとは少し異なります。

これについては、C# From a Java Developer's Perspectiveの The Same, But Different: Access Modifiersで簡単に説明されています。このドキュメントは、現在は少し古くなっていますが、ほとんどの場合関連性があります。

そのリストには 2 つの誤りがあります。

  1. C# のinternalスコープは、Java のデフォルト スコープ (独自のスコープ) に相当します。
  2. C#internal protectedは Java と同等protectedです。

さらに、上記のドキュメントでは、クラスのデフォルトのアクセス修飾子が何であるかについては言及されておらず、メソッドとプロパティ/変数についてのみ言及されています。

参考までに、C# のクラスの既定のスコープは internal です。前述のように、Java のスコープは通常のデフォルトのスコープです。

于 2009-08-19T13:37:54.730 に答える
1

私が公開しているのは静的/最終変数だけです。これは一般的に定数です。それ以外はすべてプライベートであり、アクセスは、必要に応じてgetXXX()メソッドとsetXXX()メソッドを介して行われます。setXXX()メソッドは、データに対する検証も実行します。何かを保護する必要がある場合はそうしますが、通常は避けます。

于 2009-08-18T19:32:04.753 に答える
0

「クライアント」(他のコード) がクラスの内部動作について知っていることが少ないほど、彼はより多くの利益を得ます...抽象化の単純なルールであり、OOP の基本的な柱です。正しい答えはすでに上で与えられています:

「経験則は簡単です。各クラスまたはメンバーにできるだけアクセスできないようにします。」〜ジョシュア・ブロック

于 2009-08-18T20:15:09.177 に答える