5

私はしばらくプログラミングをしていますが、パブリックメソッドの使用について質問があります。私は自動販売機のプログラムに取り組んでおりsetUpMachine()、ゲームを初期化してオブジェクトを設定するためのプライベートメソッドがあります。startMachine()ゲームを開始し、ユーザーに入力を求める別のプライベートメソッドがあります。次に、入力が有効かどうかを確認するさらに別のプライベートメソッドに入力を渡しcheckInput()ます...しかし、ここで私はそれほど「問題」に遭遇しませんが、私が何かを正しく行っていないという奇妙な感覚に遭遇します。setUpMachine()3番目のメソッドでは、最初のメソッドにあるオブジェクトにアクセスする必要がありますcheckInput()。問題は、私がたくさんのオブジェクト(キャンディー、チップ、ソーダ、クッキー)を持っていて、それらすべてを渡して境界をチェックするのは正しくないように見えることです。言い換えれば、これを行う:

checkInput(FoodType candy, FoodType chips, FoodType soda, FoodType cookie)

正しくないようです。これは、プライベートメソッドを使用する場合、オブジェクトを使用するたびにオブジェクトを渡す必要があることを意味しますか?パブリックメソッドを作成することは悪い習慣だと読みました。

これについての説明は素晴らしいでしょう。私のコーディングが非効率的であるという説明ではなく、プライベートメソッドをいつどのように使用するか、またはこれを行う別の方法があるかどうを説明する説明です。

4

3 に答える 3

3

オブジェクトを渡したくない場合は、インスタンス変数として構成できます。

public class VendingMachine {
    private FoodType candy;
    private FoodType chips;
    private FoodType sodas;
    private FoodType cookies;

    private static String errorMessage = "A really bad error occurred.";

    public VendingMachine(){
        this.setupMachine();
    }

    private void setUpMachine(){
        this.candy = new FoodType();
        this.chips = new FoodType();
        this.sodas = new FoodType();
        this.cookies = new FoodType();
    }

    private boolean checkInput(){
        if (this.candy==null || this.chips==null || this.sodas==null || this.cookies==null)
            return false;
        else
            return true;
    }

    public void doSomething() throws Exception() {
        if (!this.checkInput()) throw new Exception(VendingMachine.errorMessage);
        // do things
    }
}

このクラスは、次のように呼び出すことができます

VendingMachine vendingMachine = new VendingMachine();
try {
    //vendingMachine.checkInput() is not available because it is private
    vendingMachine.doSomething(); // public method is available
} catch (Exception e){
    // validation failed and threw an Exception
}
于 2012-10-21T00:58:49.547 に答える
2

プライベートメソッドは、外の世界には見えません。同じクラスのメソッドからのみプライベートメソッドを呼び出すことができます。

プライベートメソッドを使用して、大きなメソッドをいくつかの小さな部分(ステップ)に論理的に分割できます。

また、クラス内の複数のメソッドで繰り返されるように見えるコードがある場合は、プライベートメソッドを使用できます。

オブジェクトがクラスのフィールドでもある場合は、プライベートメソッドのパーメンターとしてオブジェクトを定義する必要はありませんが、そうでない場合は定義する必要があります。

于 2012-10-21T00:55:41.960 に答える
2

一般に、何かを外の世界に公開したい場合は、パブリックメソッドを使用する必要があります。通常、これはより高レベルのメソッドであり、プライベートメソッドを使用して詳細を提供します。プライベートメソッドは、パブリックメソッドでは不可能な他のクラスに影響を与えることなく、簡単に変更できます。

例を考えてみましょう

public void run() {

  setUpGame();
  validateInput();
  doSomethingInteresting();
  endGame();
  notifyUserGameIsComplete();

}

この例では、runはパブリックですが、他のメソッドはどれもパブリックではありません。これは、パブリックメソッドの呼び出し元は、ゲームを実行したいことだけを知っているが、ゲームがどのように機能するかについての詳細には関心がないためです。

多くのプライベートメソッドを持つことは確かに大丈夫です。メソッドは単一に焦点を合わせ、それぞれが1つのことだけを実行する必要があります。これにより、コードの読み取り、デバッグ、および保守がより簡単になります。

複数のメソッドがデータを共有する必要がある場合は、それらをクラスのメンバー変数として宣言できます。これは、それらがクラスの状態であることを意味します。例えば:

public class Person {
   private String name;

   public String getName() { return name; }
   public boolean nameMatches(String pattern) { // do some regex testing against the name }
}

この例では、methdsはへのアクセスを共有しnamename人の一部です。

本当にたくさんのパラメータを渡す必要がある場合は、それらすべてを保持するオブジェクトを作成できます。したがって、param1、param2、param3などを渡す代わりに、次のようなデータ転送オブジェクトを作成できます。

class MyStuff {
   private final String param1;
   private final String param2;
   private final String param3;
}

MyStuffこれで、個々のパラメーターをリストするのではなく、便宜上渡すことができます。

これが明確さを追加するのに役立つことを願っています。

于 2012-10-21T00:52:57.590 に答える