2

クラス内にプライベートフィールドがあり、そのフィールドをパブリックプロパティに公開する場合、クラス内からどれを使用すればよいですか?

以下は、私が見つけようとしているものの例です。プライベート フィールド _Counter またはプロパティ カウンターを操作する必要がありますか?

公開クラステスト

Private _Counter As Integer

Public Property Counter() As Integer
    Get
        Return _Counter
    End Get
    Set(ByVal value As Integer)
        _Counter = value
    End Set
End Property

Private Sub Dosomething()

    'What is the best practice?
    'Direct access to private field or property?

    'On SET
    _Counter += 1
    'OR
    Me.Counter += 1

    'On Get
    Console.WriteLine(_Counter)
    Console.WriteLine(Me.Counter)

End Sub

クラス終了

助けてくれてありがとう。教育

4

9 に答える 9

2

回答と提案をありがとうございました。

ここでのすべての提案と他の調査を検討した結果、プライベート フィールドと評価者のこの状況では、どちらかというと個人的な選択であるというのが私の印象です。したがって、基本的に最も重要なことは、何を選択しても一貫性を保つことです。

そうは言っても; 私の個人的なルールはこれに傾いています:

  1. プライベート フィールドに直接アクセスします。

  2. アクセサーにアクセスする場合は、キーワード ME を使用します。読みやすさを向上させる

  3. アクセサーは、プライベート アクセスにも適用される重要なロジック ロジックを実装する場合にのみ使用してください。このようにして、アクセサーを使用している場合、それは「それに何か他のもの」があるためであることがわかります

  4. 保護されたフィールドを使用しないでください。派生クラスは常にアクセサーを使用する必要があり、フィールドに直接アクセスすることはありません。

どう考えているか教えてください。

サイドノート:

この後、クラス レベル フィールドの新しいスコープが不足していると思います。このフィールドが getter/setter からのみアクセスできる「Restricted」のようなキーワード。この方法では、常にプライベート フィールドに直接アクセスできますが、特定のフィールドにそのアクセサーのみがアクセスできるようにする必要がある場合は、プライベートを制限付きに変更します。(「Restricted、RestrictedRead、RestrictedWrite」はどうですか?)

于 2009-05-08T04:07:34.420 に答える
1

私の意見では、パブリック アクセサーを内部で使用するのは過剰なカプセル化です。コードがぼやけてしまいます。このようなアプローチでは、そうでなければ単純な操作が、より複雑なロジックを含む可能性のあるアクセサーを呼び出すため、操作のコードを分析するのが難しくなります。

私のプログラミング経験では、それが大いに役立つ状況はめったにありません。代わりに、パブリック アクセサーと他の関数の両方で使用できるプライベートアクセサーを作成して、フィールドに直接アクセスし、本当に必要な場合にのみアクセスを抽象化することを好みます。論理的根拠は、パブリック アクセサーに特別なロジックを追加する必要がある場合、ロジックが内部アクセスと同じではない可能性があるためです。

また、ほとんどの最新の IDE (Eclipse など) では、プライベート フィールドへのすべての参照をすぐに確認し、直接アクセスする代わりに関数を使用するようにコードをリファクタリングできます。

于 2009-05-07T06:25:22.740 に答える
0

プロパティ アクセサーがフィールドに直接アクセスするときの呼び出しのパフォーマンス オーバーヘッドが心配な場合は、心配しないでください。ほとんどのコンパイラは、この種のものをインライン化し、実質的に同じパフォーマンスを提供します。少なくとも、フィールドに直接行くことで得られる余分なナノ秒の時間を必要とする可能性はほとんどありません.

プロパティ アクセサーを使用することをお勧めします。これは、a) すべてのコードで非常に一貫性を保つことができるため、保守が容易になり、b) ここで他の人が指摘した利点が得られるためです。

Me.また、スコープの問題 (識別子を慎重に選択することで回避しようとしています) がない限り、通常は(またはthis.) キーワードを追加しません。これで混乱することはありません。私の関数とサブルーチンは、ローカル (スタックベースの) 変数を操作しているのか、クラスのメンバーを操作しているのかわからないほど長くなることはないからです。長くなりすぎて簡単に説明できない場合は、リファクタリングします。

于 2009-05-07T06:21:59.440 に答える
0

元のポスターは正確です。

1) プライベート フィールドに直接アクセスします。

  • リファクタリングを容易にします。

2) アクセサーにアクセスする場合は、キーワード ME を使用します。読みやすさを向上させる

  • スコープを明示的にリストすることで、読者が考える必要が少なくなります

3) アクセサーは、プライベート アクセスにも適用される重要なロジック ロジックを実装する場合にのみ使用してください。このようにして、アクセサーを使用している場合、それは「それに何か他のもの」があるためであることがわかります</p>

  • これがルール 1 に違反する唯一の理由です。

4) 保護されたフィールドを使用しないでください。派生クラスは常にアクセサーを使用する必要があり、フィールドに直接アクセスすることはありません。

于 2009-07-10T11:58:36.650 に答える
0

可能な限りプロパティを使用することを好みます。これにより、将来、プライベート変数を使用していたすべての場所を調べて見つけることなく、プロパティが返す/設定するものを変更する柔軟性が得られます。

于 2009-05-07T05:51:11.917 に答える