我对编程很陌生,我想要帮助/指导这个概念 - “将用户界面与逻辑分开”。我分配了一个设计货币转换器的简单任务(它几乎是一个非常基本的代码,因为它要求转换率 - 但这是给定的规格)以下是我使用的代码:
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);
}
有一个特定的指令,不这样做(即只有一个类),也不使用GUI。将使用两个类,一个用于用户界面,另一个用于转换(逻辑)。我已经尝试将下面的代码放在第二个类“转换”中,但它不起作用。
double totalValue = conversionRate * amount;
任何提示/帮助将不胜感激!顺便说一句,如果你知道如何使用GUI来做到这一点,那也是有帮助的。但当然我的主要问题是上面的问题。
感谢。
答案 0 :(得分: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);
}
}
它有三种简单的方法可用于从用户获取数据,但没有关于如何处理它的信息。转换器类负责这一部分:
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);
}
它允许您设置转换率和金额值,并使用convert()方法进行一些计算。它不需要知道什么是数据来源 - 您应该支持有效的参数,它将提供响应。
在这种情况下,主类可以如下所示:
public class Main {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; }
}
}
我们创建两个对象 - ui和转换器。调用ui方法提供设置为转换器的数据,并将转换结果传递回ui以通知用户。
这种方法允许您添加新的UI(定义接口是个不错的主意)和转换器实现,而无需编辑现有的。
答案 1 :(得分:1)
如果你创建另一个名为Conversion的类,它将无法访问conversionRate和amount变量,因为这些变量只存在于CurrencyConverter对象的main方法中。
您必须创建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分配给新的转化对象:
c = new Conversion(aDifferentRate);
您的扫描仪对象也是如此。您可以反复重复使用相同的变量。在您的示例中,我认为您甚至不需要将其分配给新对象,但您可以:
Scanner in = new Scanner(System.in);
String str = in.next();
in = new Scanner(3.14159);
double d = in.nextDouble();