1

コーディングするときは、常にカプセル化の原則に従うようにしています。たとえば、これを行う:

パブリッククラスの学生

private Name As String

public sub setName(ByVal name2 As String)
  Name = Name2
End Public

クライアントがプロパティに直接アクセスできるようにする代わりに、次のようになります。

Dim s1 As Student
s1.Name = "Mark"

すべての本は、クラスを変更するとクライアントコードが壊れることを意味するため、オプション2に従うのは悪い習慣であると述べています。しかし、なぜそうなるのか完全には理解していません。Nameメンバーを削除すると、プロパティへの直接アクセスを許可するかどうかに関係なく、クライアントコードが壊れます。私は何が欠けていますか?

4

3 に答える 3

2

簡単に言うと、は、Nameを返すプロパティまたはメソッドのシグネチャとバイナリ互換ではありませんString。したがって、パブリックメンバーを作成し、後でそれをプロパティに変更すると、元々メンバーを呼び出していたクライアントコードが壊れます。

詳細はこちら:http ://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx

その他の理由:

  • プロパティを使用して、よりきめ細かいアクセス制御を取得できます。
  • プロパティにブレークポイントを追加できます。
  • プロパティにログを追加できます。
  • プロパティに検証を追加できます。
  • プロパティはデータバインディングに使用されます。フィールドはそうではありません。
于 2012-08-20T22:27:09.380 に答える
1

プロパティがある場合は、インターフェイスで定義できますが、フィールドでは定義できません。また、getterとsetterを区別して、読み取り専用の「フィールド」を作成することもできます。アイデアは、外部に与えるオプションをできるだけ少なくすることです。そうすれば、考えるシナリオが少なくなります。

于 2012-08-20T22:28:39.473 に答える
1

これらの種類の空のプロパティを使用すると、指定された値をフィールドに割り当てるか、フィールド値を返すだけでコードが膨張します。これはカプセル化ではありません。

カプセル化とは、本質的に、フィールドが外部から完全に隠されている場合であり、外部のコードはフィールドの数さえ知らず、フィールドのタイプまたは値だけを認識します。次に、フィールドで実行する必要のある処理はすべて、クラスのパブリックメソッドによって実行されます。

例はメールクラスです。たとえば、ドメイン部分を別の文字列に分割する場合でも、電子メールアドレスをどの形式で保存するかは外の世界には関係ありません。クラスの内部動作。これは、どのように値がプライベートフィールドに配置されるかであり、外部に対して完全に不透明でなければなりません。

それは誰かがあなたにローンを要求するようなものです。その人は、あなたがお金をどこに、財布に、安全に、銀行口座に何を入れたかを知る必要はありません。その人はまたあなたがどれだけの合計お金を持っているかを知る必要はありません。クラスのあなたは、お金を取り出して与える責任があります。

これを行うには、すべてのフィールドをプライベートにします。私のメソッドの多くもプライベートです。メッセージパッシングで使用されるパブリックメソッドのほんの一握りです。また、値が参照によって、常に値によって返されることはないため、外部の世界では、メソッドのフィルターを通過せずにクラスのデータを変更することはできません。

プロパティは実際にはメソッドです。メソッドがあるときはいつでも、いくつかの独自の処理を行う必要があります。処理は論理であり、条件またはループ、あるいはその両方があります。条件はポリモーフィックな振る舞いの形で隠されているかもしれませんが、それでも条件です。実行する処理がない場合は、メソッドは必要ありません。

于 2012-08-20T22:32:57.977 に答える