2

私はプログラミングにまったく慣れていないので、この概念に関するヘルプ/ガイダンスをお願いします-「ユーザーインターフェイスをロジックから分離する」。私は通貨コンバーターを設計するという単純なタスクを割り当てられています (変換率を要求するため、これは非常に基本的なコードですが、それは指定された仕様です)。以下は私が使用したコードです。

public class CurrencyConverter 

{

public static void main(String[] args) 
{

    System.out.println("Welcome to Currency converter!" + "\n");
    System.out.println("Please select an option below: ");
    System.out.println("1 >> Pound to Euro " +
                       "\n2 >> Euro to Pound");


    Scanner s = new Scanner(System.in);
    String selection = s.next();

    switch (selection) 
    {
        case "1":
            System.out.println("Enter the conversion rate from Pound to Euro");
            break;
        case "2":
            System.out.println("Enter the conversion rate from Euro to Pound");
            break;
    }
    Scanner rate = new Scanner(System.in);
    double conversionRate = rate.nextDouble();

    System.out.println("Now enter the amount to be converted: ");

    Scanner input = new Scanner(System.in);
    double amount = input.nextDouble();

    double totalValue = conversionRate * amount;
    System.out.println(totalValue);
}

この方法 (つまり、1 つのクラスのみ) を行わず、GUI を使用しないという特定の指示があります。2 つのクラスが使用されます。1 つはユーザー インターフェイス用で、もう 1 つは変換 (ロジック) 用です。以下のコードを 2 番目のクラス「変換」に入れてみましたが、うまくいきません。

double totalValue = conversionRate * amount;

ヒント/ヘルプをいただければ幸いです。ところで、GUI を使用してそれを行う方法を知っていれば、それも役に立ちます。もちろん、私の主な問題は上記の問題です。

ありがとう。

4

2 に答える 2

2

UI をロジックから分離すると、コードのスケーラビリティと可読性が向上します。あなたの場合、必要なデータを提供するためにユーザーとのやり取りをサポートするメソッドと、変換プロセスを処理する他のクラスを提供する必要があります。両方のクラスが互いを認識しないようにする必要があります。

たとえば、ui は次のように実装できます。

public class ConverterUI {

public Double askForConversionRate() {

    System.out.println("Welcome to Currency converter!" + "\n");
    System.out.println("Please select an option below: ");
    System.out.println("1 >> Pound to Euro "
            + "\n2 >> Euro to Pound");

    Scanner s = new Scanner(System.in);
    String selection = s.next();

    switch (selection) {
        case "1":
            System.out.println("Enter the conversion rate from Pound to Euro");
            break;
        case "2":
            System.out.println("Enter the conversion rate from Euro to Pound");
            break;
    }
    Scanner rate = new Scanner(System.in);
    return rate.nextDouble();
}

public Double askForAmountToConvert() {
    System.out.println("Now enter the amount to be converted: ");
    Scanner input = new Scanner(System.in);
    return input.nextDouble();
}

public void showResult(Double result) {
    System.out.println("Convertion result is: " + result);
}

}

ユーザーからデータを取得するために使用できる3つの簡単な方法がありますが、それをどうするかについての情報はありません. Converter クラスは、この部分を担当します。


public class Converter {

private Double conversionRate;
private Double amount;

public Double convert() {
    return conversionRate * amount;
}

public void setConversionRate(Double conversionRate) {
    this.conversionRate = conversionRate;
}

public void setAmount(Double amount) {
    this.amount = amount;
}

}

変換率と金額の値を設定し、convert() メソッドで計算を行うことができます。データのソースが何であるかを知る必要はありません。有効な引数をサポートする必要があり、応答が返されます。

この状況では、メイン クラスは次のようになります。

パブリック クラス メイン {

public static void main(String[] args) {
    ConverterUI ui = new ConverterUI();
    Converter converter = new Converter();

    Double convertionRate = ui.askForConversionRate();
    converter.setConversionRate(convertionRate);

    Double amount = ui.askForAmountToConvert();
    converter.setAmount(amount);

    Double result = converter.convert();
    ui.showResult(result);
}

}

ui と converter という 2 つのオブジェクトを作成します。ui メソッドを呼び出すと、converter に設定されたデータが提供され、変換の結果が ui に返されてユーザーに通知されます。

このアプローチにより、既存のものを編集する必要なく、新しい UI (インターフェイスを定義するのは良い考えです) とコンバーターの実装を追加できます。

于 2013-07-07T21:19:11.617 に答える
1

Conversion という別のクラスを作成すると、conversionRate 変数と amount 変数にアクセスできなくなります。これらの変数は CurrencyConverter オブジェクトのメイン メソッド内にしか存在しないためです。

Conversion クラスのオブジェクトを作成し、conversionRate と amount をメソッド パラメータとして渡す必要があります。conversionRate をコンストラクターに渡して、同じレートを使用して多くの異なる金額を変換し、毎回金額のみを渡すことを考えるかもしれません。

// Construct an object of the Conversion class with
// conversionRate as a parameter.
Conversion c = new Conversion(conversionRate);

// Call the convert method of the Conversion object using amount as a param.
System.out.println("Value of " + amountOne +
                   " Pounds in Euros: " + c.convert(amountOne));
System.out.println("Value of " + amountTwo +
                   " Pounds in Euros: " + c.convert(amountTwo));

レートを変更したい場合は、後で c を新しい Conversion オブジェクトに割り当てることができます。

c = new Conversion(aDifferentRate);

同じことが Scanner オブジェクトにも当てはまります。同じ変数を何度でも再利用できます。あなたの例では、それを新しいオブジェクトに割り当てる必要さえないと思いますが、次のことができます。

Scanner in = new Scanner(System.in);
String str = in.next();
in = new Scanner(3.14159);
double d = in.nextDouble();
于 2013-07-07T20:31:19.973 に答える