如果方法中的陈述还是主要的?

时间:2016-07-27 14:31:23

标签: java

您好我目前正在阅读本书的第5章,我们研究了if语句和.equals以及其他一些基本内容。我注意到我的所有问题 在本书的例子中,我们通常倾向于将if语句放在类中的那些方法中。这是我做的一个不完全的练习 完了但画面很清楚。我只是要求用户在某些单位之间进行转换。但是当我在思考如何处理这个问题时,我不想在我的方法中使用if语句,因为我希望if语句是关于用户输入的,而且根据我的知识,我们应该总是放Scanner在主要(这是我们迄今为止一直在做的事情)。因为我无法从主要访问那些扫描程序,所以我在主要文件中使用了if语句。

这是不好的做法,还是通常情况下更好地做任何事情?如果我们放太多,我可以在大型程序中看到主要变得丑陋 那里的东西。我只在下面编写了一个测试用例,但你可以看到如果我做了其他组合会有多难看。

继承我的代码

import java.util.Scanner;
class Conversion{
    public double mmToCm(double value){
        value = value / 10.0;
        return value;
    }
    public double cmToMm(double value){
        value = value * 10.0;
        return value;
    }
    public double cmToMeter(double value){
        value = value / 100.0;
        return value;
    }
    public double meterToCm(double value){
        value = value * 100.0;
        return value;
    }
    public double mmToMeter(double value){
        value = value / 1000.0;
        return value;
    }
    public double meterToMM(double value){
        value = value * (1000.0);
        return value;
    }   
}


public class test{
    public static void main(String [] args){
        Conversion convertThisVal = new Conversion();
        Scanner typeOne = new Scanner(System.in);
        Scanner typeTwo = new Scanner(System.in);
        Scanner valueOne = new Scanner(System.in);
        System.out.println("Convert From: ");
        String newTypeOne = typeOne.next();
        System.out.println("To: ");
        String newTypeTwo = typeTwo.next();
        System.out.println("Enter the values!");
        double newValueOne = valueOne.nextDouble();

        if (newTypeOne.equalsIgnoreCase("mm") && newTypeTwo.equalsIgnoreCase("cm"))
        {
            System.out.println("cm:" + convertThisVal.mmToCm(newValueOne));
        }
    }
}

2 个答案:

答案 0 :(得分:8)

创建一个好的结构化应用程序,它是使用分离的组件构建的,并且通过分离我的意思是逻辑上不是物理的,你需要将每个组件视为一个独立的一方,这意味着,转换逻辑应该与输入逻辑分开(通过输入我的意思是获取输入数据)

让我们稍微谈谈输入数据,它可以来自Scanner,就像你的情况一样,它可以来自数据库,它可以来自web请求参数。这导致我们将转换逻辑视为分离单元,它接受一些参数(IN)而不管这些参数的来源,并且基于特定逻辑(一些if语句,一些其他逻辑)它返回将使用的特定输出稍后在这个过程中

您的转换类可能包含一个方法,该方法将根据输入参数决定调用哪种其他转换方法。

例如:将此方法添加到您的转化类

public double convert(String newTypeOne, String newTypeTwo, double newValueOne){
    if (newTypeOne.equalsIgnoreCase("mm") && newTypeTwo.equalsIgnoreCase("cm")){
        return mmToCm(newValueOne);
    }else if (...){
        return ...;
    }
    :
    : ... and so on
}

正如您所看到的,我们使用此方法根据最初使用Scanner从用户获得的参数来决定要执行的转换。

所以您的main将如下所示:

public static void main(String [] args){
    Conversion convertThisVal = new Conversion();
    Scanner typeOne = new Scanner(System.in);
    Scanner typeTwo = new Scanner(System.in);
    Scanner valueOne = new Scanner(System.in);
    System.out.println("Convert From: ");
    String newTypeOne = typeOne.next();
    System.out.println("To: ");
    String newTypeTwo = typeTwo.next();
    System.out.println("Enter the values!");
    double newValueOne = valueOne.nextDouble();

    System.out.println("cm:" + convertThisVal.convert(newTypeOne,newTypeTwo, newValueOne ));
}

所有新转换类型都将添加到convert()中,以保持调用者方法不会意识到或涉及转换值所需的任何逻辑。

只需将您需要的任何参数传递给目标方法,然后让它决定要做什么。

通过这种方式,您将拥有一个可以在任何其他系统中使用的转换组件,正如我之前告诉您的那样(对于数据库,Web服务,等等)

希望这会对你有所帮助。

答案 1 :(得分:1)

我想说根本不要使用if语句。

创建Converter界面,

interface Converter {
double convert(double value);
}

然后为您需要的每次转换创建此接口的多个实现 在例子中

class MmToCmConverter implements Converter{
    double convert(double value){
    return value / 10.0;
    }
}

然后为converterters创建并填充查找表

Map<String,Converter> lookup = new Hashap<>();
lookup.put("MM2CM",new MmToCmConverter());

然后转换您的数据,您需要做的就是:

String code = newTypeOne +"2"+newTypeTwo; //create code
Converter converter = lookup.get(code.toUpper());
double convertedValue = converter.convert(newValueOne);