如何用Java重构这个类

  • 本文关键字:重构 何用 Java java
  • 更新时间 :
  • 英文 :


我在学习java方面相对较新。

我尝试构建一个java类,该类搜索数组以检查用户输入是否列在数组中。如果该值在数组中,则此代码将打印出下一个数组项中的网站名称和URL。

我最初试图使用OOP并在自己的类中添加Scanner,但当Scanner在不同的类中时,我很难在主方法中从Scanner获得输入。

理想情况下,我还想在一个单独的方法中添加for循环来清理代码,但当我在一个独立的类中添加websites.length字段时,我无法访问它。

对于如何重构这些简单的代码行以提高性能或符合Java最佳实践,我将不胜感激。


public static void main(String[] args) {
String[] websites = {"Google", "http://www.google.com", "Facebook", "http://www.facebook.com", "Ebay", "http://www.ebay.com", "Netflix", "http://www.netflix.com"};
System.out.println("Enter Your Search Query");
Scanner sc = new Scanner(System.in);
String userInput = sc.nextLine();
for (int i = 0; i < websites.length; i++) {
if (userInput.equals(websites[i])) {
System.out.println("We Found The Value");
System.out.println(websites[i]);
System.out.println(websites[i + 1]);
break;
} else {
System.out.println("There is no matching file");
}
}
}

如何在Java中重构这个类?

正如Federico所评论的,对于这么小的程序来说,这样做既没有必要也不可取。它太小了,将代码的各个部分分开并不能提高可读性。

然而,为了学习用Java编程而并不是一件坏事。因此,让我们假设是您的目标。

我最初试图使用OOP并在它自己的类中添加Scanner,但当Scanner在另一个类中时,我很难在主方法中从扫描仪中获得输入。

好吧,我们需要看看你做了什么来理解你的困难。

如果输入需求很复杂,那么将它们分解为一个单独的类(甚至方法)可能会起作用。但如果你在这里尝试,你最终会添加很多行代码,而没有任何好处。

使用OOP本身并不是的目标。这是一种你用来实现其他目标的技巧。然而,学习使用OOP是一个目标。

理想情况下,我还想在一个单独的方法中添加for循环来清理代码,但当我在一个独立的类中添加websites.length字段时,我无法访问它。

你不会把它放在一个单独的类中!把它放在Search类的一个单独的方法中。

您最可能遇到的问题是website超出了作用域,因为它在main方法中被声明为局部变量。要使website在另一个方法中可访问,需要将其声明为字段,或者需要将其作为参数传递给该方法。以下是第一种方法的示例

public class Search {
private static String[] websites = {
"Google", "http://www.google.com", 
"Facebook", "http://www.facebook.com", 
"Ebay", "http://www.ebay.com", 
"Netflix", "http://www.netflix.com"
};
public static void main(String[] args) {    
System.out.println("Enter Your Search Query");
Scanner sc = new Scanner(System.in);
String userInput = sc.nextLine();
search(userInput);
}

private static void search(String userInput) {
for (int i = 0; i < websites.length; i++) {
if (userInput.equals(websites[i])) {
System.out.println("We Found The Value");
System.out.println(websites[i]);
System.out.println(websites[i + 1]);
break;
} else {
System.out.println("There is no matching file");
}
}
}
}

以上不是有用的重构的好例子。它不是OO。。。因为我们使用的是CCD_ 9方法和CCD_。但它说明了如何通过使用字段在不同的方法(甚至类)之间共享内容。

而且。。。再一次OO本身并不是一个目标。因此,以上内容足以满足您的功能要求。但是,如果你想让以上更OO,可以:

  1. 通过移除static使search方法成为实例方法。

  2. 这样称呼它:

    Search s = new Search();
    s.search(userInput);
    

(将websites作为实例字段可能会适得其反。如果您的要求要求搜索者对照一组固定的网站进行检查,则使用static是一种自然的方法。)


如果您能为我提供任何帮助或想法,告诉我如何重构这些简单的代码行以提高性能或符合Java最佳实践,我将不胜感激。

首先;最佳实践";在编程/软件工程的上下文中,是一个没有帮助的术语。请阅读无最佳实践!理解我的意思。

其次,您无法以任何显著的方式来提高此代码的性能。启动Java JVM并加载代码将花费100毫秒。等待用户的输入需要几秒钟的时间。但实际搜索的时间将是微秒。在本例中,代码的性能无关紧要。

现在,您可以通过执行以下任一操作使代码更简单、更可读:

  • websites更改为两个数组,一个包含网站名称,另一个包含相应的URL。(将搜索关键字和搜索值混合到一个数组中会导致问题。)
  • websites更改为HashMap<String, String>,然后可以用get调用替换循环

但另一方面,这两者都会使初始化websites变得更加复杂。(在实际应用程序中,将从配置文件加载该信息,或搜索数据库…)

此外,如注释中所述,您可以将搜索功能与打印结果分开。阅读"关注点分离"设计原则。

最新更新