向Java计算器程序添加日志功能

时间:2019-05-12 19:12:07

标签: java

我正在构建个人科学计算器。我需要帮助,以将长函数添加到程序中,而编译器在整个程序中只给出一个答案。我应该在if语句的哪一部分添加该方法?

顺便说一句,我是一个初学者,这是我正在从事的第一个项目。

public void OperatorIndicator(double x, double y, String op){
        if (op == "*") {
            multiply(x, y);
        } else if (op == "/") { 
            divide(x, y); 
        } else if (op == "+") {
            sum(x, y);
        } else if (op == "-") {
            difference(x, y);
        } else if (op == ""){
            if (y == 0) {
                squareroot(x);
            } else {
                exponent(x,y);
            }
        } else {
            System.out.println("OPERATOR NOT VALID");
        }
    }

我希望结果始终显示一个值

2 个答案:

答案 0 :(得分:2)

您可以在此控件结构的任何位置添加其他条件以进行检查。

例如,假设您要向程序添加对数函数,并且假定该函数的方法签名包含log(double value, double base),则可以添加语句...

else if (op == "log") {
    log(x, y);
}

...在初始if语句之后和else语句之前的任何位置。您甚至可以通过检查此条件来替换初始的if语句,并根据需要将当前的if语句下推到一系列else if语句中。

鉴于这种自由度,设计此程序的最终目标应该是管理复杂性,以便其他尝试阅读您的代码的人可以轻松理解您的意图。我的意思是,尽管您可以在任何地方添加此条件,但应将其放置在最有意义的位置。

我认为,看到您的控制结构首先检查乘法和除法运算符,然后检查加法和减法运算符,然后再检查指数/平方根运算符时,我将检查对数运算符,在您检查指数/平方根运算符之后,并且在您的else语句之前。

我还建议将指数/平方根运算分为两个单独的else if语句,并为这两个运算定义操作码,而不要使用空的运算码来定位这些运算。我建议这样做不仅是为了使您的代码清晰易读。还有另一个原因。

要使某人理解他们应该将字符串""作为该程序的操作代码传递,他们需要了解其内部工作原理。面向对象编程的很大一部分是“信息隐藏”,或者试图使您的方法和类易于理解,而无需知道它们是如何实现的。假设有人想使用该程序而不阅读其内部工作原理。如果没有其他人将要使用该程序,请假设您希望从现在开始使用该程序,并且您不想再通读该程序以了解其功能。您只想传入两个值和一个操作码,然后接收所需的值即可。

在这种情况下,一种更加用户友好的实现方式是为每个可能的内部操作提供明确定义的操作码。您可以提供操作码列表及其功能描述作为文档供用户参考,即使这只是您自己。

作为一个很小的理由,假设用户意外地尝试将字符串""作为操作码传递给此方法。在这种情况下,理想的响应是通知用户无效的操作码已传入该方法,但是在您当前的实现中,该方法将执行平方根运算或指数运算,具体取决于传入的值。如果用户不希望这种行为,他们可能会感到困惑,并可能会浪费一些时间来试图理解为什么这种方法的表现不如他们期望的那样。

另一个小建议是使用String比较函数equals()将传入的操作码与您要检查的每个值进行比较。可以在here中找到此功能的文档,程序的修订版将如下所示:

public void OperatorIndicator(double x, double y, String op){
    if (op.equals("+")) {
        multiply(x, y);
    } else if (op.equals("/")) { 
        divide(x, y); 
    } else if (op.equals("+")) {
        sum(x, y);
    } else if (op.equals("-")) {
        difference(x, y);
    } else if (op.equals("")){
        if (y == 0) {
            squareroot(x);
        } else {
            exponent(x,y);
        }
    } else {
        System.out.println("OPERATOR NOT VALID");
    }
}

答案 1 :(得分:1)

我不知道您是否已经知道,但是在您的情况下,您可以使用switch之类的声明。看起来像:


public void OperatorIndicator(double x, double y, String op){

    switch(op) {
        case "*":   multiply(x, y);   break;
        case "/":   divide(x, y);     break;
        case "+":   sum(x, y);        break;
        case "-":   difference(x, y); break;
        case "^":   pow(x, y);        break;
        case "log": log(x, y);        break;
        // ...
        default: 
            System.out.println("OPERATOR NOT VALID");
    }
}