0

単なる好奇心から!ユーザー入力を受け取り、それを int 変数として格納するメソッドを取得したとします。これらのメソッドを別のメソッドに渡す方法はありますか? 戻り値については知っていますが、それは(私が知る限り)1つの数値、オブジェクトなどのみです...

もちろん、このメソッド内で結果を計算するだけの簡単な方法ですが、これらの int を渡すことは可能ですか: a,b. グローバル変数を使わずに別の方法に?私はちょうど不思議です。

private void takeInput(int valueA, int valueB){
    println("Enter a number: (a) and (b), to calculate the Phytagoeran Theorem: (c)\n");
    int a = readInt("a:");
    println("you set the value of a to: "+a +"\n\nNext! set the value of b");
    int b = readInt("b:");
    println("you set the value of b to:"+b);
}
4

5 に答える 5

1

質問は不明ですが、「依存性注入」を発明したのだろうか?

パズルの最初の部分は、オブジェクトでラップすることにより、メソッドが複数の値を返すことができるということです。

public class ValuePair {
    public int a;
    public int b;
}

public ValuePair takeInput(){
  ValuePair pair = new ValuePair();
  println("Enter a number: (a) and (b)\n");
  pair.a = readInt("a:");
  pair.b = readInt("b:");
  return pair;
}

そしてそれであなたはできる:

ValuePair p = takeInput();
System.out.println("Hypotenuse is " + calculateHypotenuse(p.a, p.b) + "\n";

(パブリック フィールドは通常、適切なスタイルとは見なされないことに注意してください。コードが短いため、ここではパブリック フィールドを使用します。実際のコードでは、ゲッターとセッターを使用します)。


それはあなたが必要とするすべての答えかもしれません。しかし、あなたは尋ねます:

これらのメソッドを別のメソッドに渡す方法はありますか?

そうですね、目的専用のクラスでそのメソッドをラップすれば可能です。理由が明らかになることを願っていますが、最初にインターフェイスを定義します。

 public interface ValuePairSource {
    public ValuePair getPair();
}

...そしてそれを実装するクラス:

public class UserInputValuePairSource implements ValuePairSource {
    @Override
    public ValuePair getPair() {
         ValuePair pair = new ValuePair();
         println("Enter a number: (a) and (b)\n");
         pair.a = readInt("a:");
         pair.b = readInt("b:");
         return pair;
    }
}

これで、値を取得する場所を指定できる Pythagoras クラスを作成できるようになりました。

public class Pythagoras {
     private ValuePairSource valuePairSource;

     public Pythagoras(ValuePairSource source) {
         this.valuePairSource = source;
     }

     public double hypotenuse() {
         ValuePair pair = valuePairSource.getPair();
         return Math.sqrt(pair.a ^ 2 + pair.b ^ 2)
     }
}

コンストラクターでは、作成する各 Pythagoras オブジェクトに値のペアを取得する方法を伝えます。したがって、次のように使用できます。

Pythagoras p = new Pythagoras(new UserInputValuePairSource());
double hypotenuse = p.hypotenuse();

これは何の役に立ちますか?つまり、他の種類の ValuePairSource を発明できるということです。たとえば、設定した Shape オブジェクトから値を取得する ShapeValuePairSource などです。

(これらは、質問の目的のための架空のクラスです)

したがって、次のように使用できます。

Triangle t = canvas.getLastTriangle(); // or whatever
ValuePairSource vps = new ShapeValuePairSource(triangle);
Pythagoras p = new Pythagoras(vps);
double hypotenuse = p.hypotenuse();

そのため、Pythagoras クラスをまったく変更せずに、ユーザー入力ではなく形状オブジェクトから値を読み取るようになりました。

OK、これは少し不自然な例ですが、「これらのメソッドを別のメソッドに渡すことができますか」という質問に答えています。これは、Spring のようなものの基礎です。

一部の言語では、ここにあるようにクラスにラップせずに、メソッドを他のメソッドに直接渡すことができることに注意してください。これを「関数型プログラミング」と呼び、通常は「メソッド」を「関数」と呼びます。

于 2012-09-03T17:08:05.763 に答える
1

2 つの値を保持するクラスを作成できます。

public class PairOfInt {
    private final int a, b;

    public PairOfInt(int a, int b) {
       this.a = a;
       this.b = b;
    }

    //getters
}


private PairOfInt takeInput(){
    println("Enter a number: (a) and (b), to calculate the Phytagoeran Theorem: (c)\n");
    int a = readInt("a:");
    println("you set the value of a to: "+a +"\n\nNext! set the value of b");
    int b = readInt("b:");
    println("you set the value of b to:"+b);
    return new PairOfInt(a, b);
}
于 2012-09-03T16:42:58.937 に答える
0

操作するすべてのメンバーでクラスを作成し、同じクラスにメソッドを作成する必要があります。そうすれば、メソッド間で変数を渡す必要がなく、グローバル変数に依存する必要もありません。

class MyOperations {

    private int valueA;
    private int valueB;

    public MyOperations (int valueA, int valueB) {
      this.valueA = valueA;
      this.valueB = valueB;
    }

    public void doOperationA(){
    //
    }

    public void doOperationB(){
    //
    }

}
于 2012-09-03T16:48:04.933 に答える
0

次のように別のメソッドを宣言できます。

private void doSomething(int a, int b) {
  ...
}

次に、メソッドからtakeInput、次のように呼び出すことができます。

doSomething(a, b);
于 2012-09-03T16:36:34.403 に答える
0

通常、グローバル変数を避けることは良い考えです。

複数の戻り値を渡す主な方法は 2 つあります。

  1. 複合オブジェクトで値を返す
  2. パラメーターとして渡されたオブジェクトに値を入れる

最初の方法では、返したいすべての値を含むオブジェクトを返します。Map や List など、既に利用可能なクラスを使用できます。

public List readIntegersFromInput() {
      List l = new ArrayList();
      l.add(readInt("a: "));
      l.add(readInt("b: "));
      return l;
}

...または、特にニーズに合わせてクラスを作成できます。

public class ValuesAandB {
    public int a;
    public int b;
}

... 次のように使用します。

public ValuesAandB readIntegersFromInput() {
      ValuesAandB ab = new ValuesAandB;
      ab.a = readInt("a: ");
      ab.b = (readInt("b: ");
      return ab;
}

(実際のコードでは、パブリック フィールドの代わりにセッターとゲッターを使用します)

2 番目の方法では、変更可能なオブジェクトをパラメーターとして渡します。ミュータブル オブジェクトは、値を変更できるオブジェクトです。先ほど作成した ValuesAandB クラスのように。

public void readIntegersFromInput(ValuesAandB ab) {
    ab.a = readInt("a: ");
    ab.b = (readInt("b: ");
}

...次のように呼び出します:

ValuesAandB values = new ValuesAandB();
readIntegersFromInput(values);
// use `values`

それで、どれが最高ですか?両方のスタイルが製品コードに表示されます。今日では、ほとんどの場合、最初のスタイルが望ましいということが一般的に認められています。

実際には、コンストラクターで値を設定する ValuesAandB であるimmutableであるクラスを作成し、それらを変更できないようにすることをお勧めします。別の値が必要な場合は、新しいオブジェクトを作成する必要があります。不変オブジェクトでは、2 番目の方法は実行できないことがわかります。それは、理解しやすい、よりクリーンなコードにつながります。

于 2012-09-03T17:29:22.690 に答える