web-dev-qa-db-ja.com

常に「パブリック」な方法を使用することは、ソフトウェアエンジニアリングの悪い習慣と考えられていますか?

私は常にパブリックメソッドを使用しており、最近はできるだけメソッドをパブリックに定義しないように友人から勧められていますが、私はどの営利会社でも働いたことがあります。 「時々使用しても安全」ではありません。

私はc#で多くの作業をしてきましたが、publicinternalprivateprotectedなどの他のアクセスタイプを使用しましたが、それらがどのように機能するかはわかっていますが、なぜこれらのアクセスレベルでメソッドを定義する必要があるのか​​本当に理解していません。生産中。

22
Sid Khanye

publicアクセサーを使用して定義するメソッド、プロパティ、およびコンストラクター(つまり、クラスのメンバー)は、クラスのユーザーが操作できる表面領域を決定します。この表面領域の一部にしたくないメソッドは、publicにしないでください。

一部のメンバーが公開されない理由:

  1. これらは実装の詳細です。パブリックメンバーが必要とする動作を実装しますが、外部から直接呼び出すことを意図していません(つまり、private)。
  2. これらは、派生クラスでアクセスするためのものですが、直接呼び出されることはありません。 (つまり、protected)。

あなたの家の観点から考えてみてください。あなたは税務署員があなたの家に入って、あなたの小切手帳を見つけて、彼自身に小切手を書かせないでください。むしろ、税務署員はあなたに請求書を送り、あなたはその請求書をレビューし、小切手を書いて彼に送ります。請求書の送付と小切手はどちらも公的な行為です。法案を確認し、小切手を書くという行為は、税務官が何も知る必要のない、あなた自身の家のプライバシーの中で実行される実装の詳細です

さらに読む
カプセル化

59
Robert Harvey

簡潔な答え:

メソッドまたはフィールドを「パブリック」に宣言すると、約束に変換されます。

親愛なる同僚、

この方法またはフィールドを適切と思われる場所で使用することをお勧めします。

私はあなたがその使用法について知っておく必要があるすべてを文書化しました、そしてあなたがこの文書に違反しない限り、私はこの文脈のすべてのバグに対して責任を負います。

このメソッドの動作/このフィールドのデータの解釈を決して変更しないことを約束します。または、私のメソッドを使用してすべてのコードを分析し、適切に変更します。

本当によろしいですか(特に「ドキュメント」の部分)?

38
Ralf Kleberhoff

クラスがある場合:

class SomeThing
{
    public DoSomething()
    {
        DoThing1();
        DoThing2();
    }

    public DoThing1() ...
    public DoThing2() ...
}

さて、私は誰もがDoSomethingだけを呼ぶように意図するかもしれません。しかし、私はDoThing1DoThing2も公開したので、人々はまだそれらを使用するかもしれません。その結果、後でDoThing3のみを使用するようにDoSomethingを書き換えると、行き詰まってしまいます。つまり、DoThing1DoThing2を使用しなくなっても、それらを取り除くことができません。

privateとしてマークした場合、そのような問題は発生しません。外部コードを壊すことなく安全に削除できます。

したがって、クラスの外部から絶対にアクセスする必要がない限り、すべてのprivateをマークすることをお勧めします。アクセスする必要がある場合は、そのプロジェクトに対して「プライベート」のままであり、他のプロジェクトを中断することなく変更できるため、可能であればinternalをマークしてください。プロジェクトのパブリックAPIの一部として必要な場合にのみ、publicとマークする必要があります。これは、クラスや列挙型など、それらのクラスのメンバーなどに適用されます。

10
David Arno

クラスは、それらを使用するためのインターフェース(c#キーワードではなく英語の単語)を公開します。

インターフェースを正しく使いやすく、誤って使いにくくします。

他のクラスから呼び出されるべきではない関数がクラスにある場合でも、他のクラスからは呼び出せるようにすると、クラスが誤って使用されやすくなります。これにより、バグ、メンテナンスコスト、トレーニングコストが発生します。あなたが唯一の開発者である場合、これは悪くありません-あなたはすでにコードを知っており、どの関数を呼び出すことができるか、またはできないかを知っています。 6か月後にコードを再確認する必要がない限り、その時点で思い出せません。

7
Peter

「大規模な」ソフトウェアを作成している場合(つまり、複数のチームと協力して新しいバージョンをリリースし、一度にすべてを頭の中で維持するのが難しいほどのコードがある場合)、それは悪いエンジニアリング手法です(参照)。他の素晴らしい答え)。

1回限りのコード(たとえば、3つのメソッドでデータをプッシュする単一ファイルのスクリプト)を作成しているだけの場合は、やりすぎです。

1
Carl Walsh

アクセス指定子は、一種のドキュメント/コメント/説明としても機能します。ソースコードを読んでいるときにプライベートなものが見つかると、そのものが内部でのみ使用されていることがすぐにわかります。これにより、コードが読みやすくなります。

0
cshu