【问题标题】:Separating Interface from Logic - Java将接口与逻辑分离 - Java
【发布时间】:2013-07-07 19:59:06
【问题描述】:

我对编程很陌生,我希望得到有关此概念的帮助/指导 - “将用户界面与逻辑分离”。我被分配了一个设计货币转换器的简单任务(它几乎是一个非常基本的代码,因为它要求转换率 - 但这是给定的规范),下面是我使用的代码:

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 来做这件事,那也会很有帮助。但当然,我的主要问题是上述问题。

谢谢。

【问题讨论】:

    标签: user-interface multiple-inheritance separation-of-concerns


    【解决方案1】:

    将 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 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 和转换器。调用ui方法提供数据设置给转换器,转换结果传回ui通知用户。

    这种方法允许您添加新的 UI(定义一个接口是个好主意)和转换器实现,而无需编辑现有的。

    【讨论】:

      【解决方案2】:

      如果您创建另一个名为 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 分配给一个新的 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();
      

      【讨论】:

        猜你喜欢
        • 2015-06-16
        • 1970-01-01
        • 2011-07-03
        • 2013-12-15
        • 2018-12-06
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多