您好我目前正在阅读本书的第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));
}
}
}
答案 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);