web-dev-qa-db-ja.com

パブリックメソッドに対するプライベートメソッド

私はStringTokenizer.Javaクラスと思いついたいくつかの質問がありました。

他のクラスで使用されるパブリックメソッドが、すべての作業を行うプライベートメソッドを呼び出していることに気付きました。今、私はOODの原則の1つが、できる限り多くを作成して、実装の詳細をすべて非公開にすることであることを知っています。ただし、この背後にあるロジックを完全に理解しているとは思いません。

無効な値がフィールドに格納されるのを防ぐために、フィールドをプライベートにすることが重要であることを理解しています(多くの理由の1つにすぎません)。ただし、プライベートメソッドに関しては、なぜそれらが重要なのかわかりません。

たとえば、StringTokenizerクラスの場合、すべての実装コードをパブリックメソッド内に配置することはできませんか?これらのメソッドのAPI(つまり、これらのパブリックメソッドを呼び出すルール)は同じままであるため、これらのメソッドを使用するクラスにどのような違いがありましたか?プライベートメソッドが便利な理由を考えることができた唯一の理由は、重複したコードを書くのに役立つからです。たとえば、すべてのパブリックメソッドが同じことをした場合、このタスクを実行し、パブリックメソッドで使用できるプライベートメソッドを宣言できます。

その他の質問、パブリックメソッドではなくプライベートメソッドで実装を記述することの利点は何ですか?

以下に小さな例を示します。

public class Sum{

    private int sum(int a, int b){
        return a+b;
    }

    public int getSum(int a, int b){
        return sum(a,b);
    }
}

対...

public class Sum{

    public int getSum(int a, int b){
        return a+b;
    }
}

最初のサンプルはどのように有益ですか?

27
kpatelio

何かを追加するために、プライベートメソッドは常に安全に変更できます。これは、それが自分のクラスからのみ呼び出されることを確実に知っているためです。外部クラスはプライベートメソッドを呼び出すことができません。

したがって、メソッドに安全にパラメータを追加することもできますが、プライベートメソッドを使用することは、変更することに問題がないことがわかっているため、常に有効です。

パブリックメソッドを考えると、だれでもそのメソッドを呼び出すことができるので、パラメーターを追加/削除する場合は、そのメソッドへのすべての呼び出しも変更する必要があります。

プライベートメソッドが便利な理由を考えることができた唯一の理由は、重複したコードを書くのに役立つからです。

重複コード(多くの場合「自分自身を繰り返さない」または「DRY」と表現される)を統合することに加えて、プライベートメソッドを使用すると、コードの構造化と文書化にも役立ちます。いくつかのことを行うメソッドを記述していることに気付いた場合は、それをいくつかのプライベートメソッドに分割することを検討してください。そうすることで、各ロジックの入力と出力が何であるかがより明確になる可能性があります(より細かい粒度で)。さらに、記述的なメソッド名は、コードのドキュメントを補足するのに役立ちます。

2
zjs

メソッドprivateを宣言する目的は

  • 実装の詳細を隠す
  • メソッドをパブリックAPIとしてリストから除外します
  • コードの背後にあるロジックが外部で使用/誤用されていないことを確認してください
  • ほとんどの場合、メソッドの実行は、その前に実行されている他のメソッドに依存します。そして、あなたはあなたの方法を使用する正しい順序を確実に制御することができます

メソッドをクラスのコンテキスト外で安全に使用する場合を除き、メソッドにはprivateを使用します。

1
Nar Gar

Javaまたは他のオブジェクト指向言語でクリーンなコードを記述する場合、一般に、最もクリーンで読みやすいコードは短い簡潔なメソッドで構成されます。メソッド内のロジックをより適切に表現できるコードをよりクリーンで保守しやすくするための個別のメソッド呼び出し。

これを念頭に置いて、単一の目標に向かってタスクを実行する多くのメソッドがある状況を想定できます。複雑な目的が1つだけあるクラスを考えてください。その単一の目標のエントリポイントは、1つの開始点(1つのパブリックメソッド)だけでなく、複雑な操作の一部である他の多くのメソッド(多くのプライベート支援メソッド)を必要とする場合があります。

プライベートメソッドを使用すると、クラス自体の外部からアクセスできないロジックを非表示にすることができます。

1
BVSmallman

一般に、パブリックメソッドは、そのクラスを実装する他のクラスが使用するコードです。プライベートメソッドは通常、クラスの外部ではそれほど有用ではないか、クラスが達成しようとする目的を(単独で)提供しません。

たとえば、IDEを選択し、クラスAを実装します。クラスAは、ドキュメント生成など、1つのことだけを行うように設計されています。ドキュメントを生成するために必要なクラスAのメソッドですが、クラスAを使用しようとする人は、ドキュメントが必要なだけなので、これらの他のメソッドは必要ありません。私たちのクラス。

1
zclark

関数をプライベートにすると、次の場合に利点が得られます。

  1. 関数をプライベートにすると、JVMコンパイラに関数をインライン化するオプションが与えられ、アプリケーションのパフォーマンスが向上します
  2. クラスが継承可能で、子クラスから拡張する場合、子クラスから関数を非表示にする場合は、これを実行できます(StringTokenizerを拡張できます)。
  3. コードの一部を複数の関数で使用する必要がある場合は、プライベートユーティリティメソッドでそのコードを移動します
0
Saurabh

パブリッククラス内でプライベートメソッドを使用する利点と正当な理由は、セキュリティとバグ防止のためです。プライベートとして宣言されたメソッドは、それらが属するクラスによってのみアクセス可能です。これは、プログラム内の他の場所から誤ってプライベートメソッドを呼び出すことができないことを意味し、バグやその他の問題を軽減します。メソッドをパブリックとして宣言すると、問題全体からアクセスでき、複雑化する可能性があります。

プログラムの他の部分に干渉させたくない特定のデータに対して機能する多くのメソッドがあります。プライベートメソッドや変数を介してデータのカプセル化を使用すると、これを防ぐことができ、コードの追跡と文書化も容易になります。

0
Kerry Tolhurst