2017-03-08 65 views
0

我是java编程的新手,我刚创建了一个计算器程序,它似乎工作正常,但其他程序员似乎在他们的计算器程序中使用“分析很多”。只是想问我是否采取了错误的做法,并可能在未来使用这种逻辑遇到问题。谢谢。需要关于代码java效率的建议

class Refresh { 

private final String a; 
private final String b; 
private final String c; 
private final String d; 
private double x, y; 

public Refresh() { 
    a = "Enter the first number: "; 
    b = "Enter the function; "; 
    c = "Enter the second number: "; 
    d = "The result is: "; 
} 

public void types() { 
    Scanner typ = new Scanner(System.in); 

    try { 
     System.out.println(a); 
     x = typ.nextDouble(); 
    } catch (InputMismatchException e) { 
     System.out.println("Please use only numbers!"); 
     System.exit(1); 
    } 
    System.out.println(b); 
    String func = typ.next(); 

    try { 
     System.out.println(c); 
     y = typ.nextDouble(); 
    } catch (InputMismatchException e) { 
     System.out.println("Please use only numbers!"); 
     System.exit(1); 
    } 

    switch (func) { 

     case "+": 
      System.out.println(d + (x + y)); 
      break; 

     case "-": 
      System.out.println(d + (x - y)); 
      break; 
     case "/": 
      if (y == 0) { 

       System.out.println("Cannot divide by zero!"); 
      } else { 
       System.out.println(d + (x/y)); 
      } 
      break; 
     case "*": 
      System.out.println(d + (x * y)); 
      break; 

     default: 
      System.out.println(func + " is not valid function"); 
    } 
} 

    public static void main(String[] args) { 
     Refresh fin = new Refresh(); 
     fin.types(); 
    } 
} 
+1

请解释什么是“解析了很多”在这个问题里指 –

+0

对不起,我的意思是,我看到了“分析”的方法很多他们的程序 –

回答

0

作为演示程序或作为学习Java的一个步骤,您的程序很好,但您可能不会将其用作生产程序。原因是你的代码假设一个命令行界面(static void main(),Scanner,System.out.println())。

用户现在习惯于图形解决方案。他们期望输入和输出在图形前端给出,并且计算应该在单独的逻辑中完成。

在此视图中,我会在3份重组程序:

  • 甲后端类它执行计算(在下面的示例代码Calculator类)
  • 前端类(称为下面的SimpleFrontEnd),它建立在你的代码之上,但后来可以用例如一个Web界面
  • 数据对象后端和前端之间的通信(以下计算类来发送信息从前端至后端)

有了这三个部分,你可以独立的进行修改彼此。您可以决定在前端只输入一个字符串,然后在发送到后端之前解析该字符串。

我可能不会在需要解析的前端使用单个字符串,而是直接映射到下面的Calculation类的JSON对象,原因如下:前端可以轻松修改操作数和操作符JSON对象彼此独立,而修改必须被解析的字符串更复杂。

这里是分开后端前端代码示例:

public class Calculation { 
    private double leftOperand; 
    private String operator; 
    private double rightOperand; 

    public double getLeftOperand() { 
     return leftOperand; 
    } 

    public void setLeftOperand(double leftOperand) { 
     this.leftOperand = leftOperand; 
    } 

    public String getOperator() { 
     return operator; 
    } 

    public void setOperator(String operator) { 
     this.operator = operator; 
    } 

    public double getRightOperand() { 
     return rightOperand; 
    } 

    public void setRightOperand(double rightOperand) { 
     this.rightOperand = rightOperand; 
    } 
} 

public class Calculator { 
    public double calculate(Calculation calculation) { 
     switch (calculation.getOperator()) { 
      case "+": 
       return calculation.getLeftOperand() + calculation.getRightOperand(); 
      case "-": 
       return calculation.getLeftOperand() - calculation.getRightOperand(); 
      case "/": 
       if (calculation.getRightOperand() == 0) { 
        throw new IllegalArgumentException("Cannot divide by zero!"); 
       } 
       return calculation.getLeftOperand()/calculation.getRightOperand(); 
      case "*": 
       return calculation.getLeftOperand() * calculation.getRightOperand(); 
      default: 
       throw new IllegalArgumentException(String.format("%s is not valid function", calculation.getOperator())); 
     } 
    } 
} 

public class SimpleFrontEnd { 
    public static void main(String[] args) { 
     try { 
      //1. input, could be later replaced with a front end 
      Scanner typ = new Scanner(System.in); 
      System.out.println("Enter the first number: "); 
      double x = typ.nextDouble(); 
      System.out.println("Enter the function: "); 
      String func = typ.next(); 
      System.out.println("Enter the second number: "); 
      double y = typ.nextDouble(); 

      //2. store input in an data object that will be sent to the back end (later on, a web interface could send this as a JSON) 
      Calculation calculation = new Calculation(); 
      calculation.setLeftOperand(x); 
      calculation.setOperator(func); 
      calculation.setRightOperand(y); 

      //3. retrieve the result from the back end 
      Calculator calculator = new Calculator(); 
      try { 
       double result = calculator.calculate(calculation); 
       System.out.println(String.format("The result is: %f", result)); 
      } catch (IllegalArgumentException e) { 
       System.out.println(e.getMessage()); 
      } 
     } catch (InputMismatchException e) { 
      System.out.println("Please use only numbers!"); 
     } 
    } 
} 
+0

该死!我会永远尊重你。我可以从中学到很多东西,我将在接下来的几天中花费这些代码。非常感谢! –

+0

虽然这是一个简单的例子,我不能在这篇文章中给出所有答案,尽管我可以告诉你我最重要的经历是什么。大约10年前,当我作为一名软件工程师开始我的职业生涯时,我被告知软件应该具有“松耦合和高内聚性”的建议。我认为这是软件设计中最重要的一条法则。至于获得经验,我认为最重要的两种方式是练习和阅读。在实践中,你会看到别人在做什么,并通过阅读你从聪明的人身上学习。祝你好运! – toongeorges

0

解析只是意味着扫描一组字符,然后将它们分离成其自身结构(标记化它们)。

String aStr = "10";

可变aStrString类型。然后你可以解析字符串。

int aInt = Integer.parseInt(aStr);

+0

谢谢你,所以我真的不需要它在我的代码右上方? –

+0

这很好,因为你正在调用'type.nextDouble()',它返回一个double而不是一个字符串。 – PeskyPotato

0

只是为了您的信息,Java已经内置计算器库。

ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); 
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); 
String result = "100/10"; 
System.out.println(scriptEngine.eval(result)); 
+1

对于真正的!,从来不知道,谢谢你的信息 –

+0

不错的建议,如果你刚刚回答问题,然后给出建议,我会更高兴。因为我觉得这个答案不是在接近OP问题的地方。由于他是Java的新手,所以引入新的项目变得非常困难。 – Smit

0

好的,这其实是非常基本的例子。说实话,你做得很好。甚至在这个时候问这个问题更好。通常人们在学习过程中忽视效率并且太迟。

他们为什么要解析?

如果你不知道下面的内容,那么你应该更多地尝试reading

扫描仪读取用户的所有关键输入。让我们举例

输入号码>12

扫描仪将会12\n

现在你看到了吗?扫描仪只能保持数字,而实际上却保持在一个字符串上。其中包含12\n

当你问扫描仪nextDouble它只会给你12

但是,它仍然坚持到那\n所以下一个字符串输入,字符串\n将被分配。

通过解析,您将忽略此问题。并且您将更好地控制用户输入。

+1

非常感谢您抽出宝贵时间回答Smit,现在我正在接受 –

+0

感谢您的赞赏。乐于帮助。 :) @OfentseProsperNglazi – Smit

+0

它似乎你理解“解析”不同于我。如果它与扫描仪有关,则您的答案是相关的。 – toongeorges