簡體   English   中英

如何在 Java 中重構這個 Class?

[英]How can I refactor this Class in Java?

我在學習java方面比較新。

我試圖構建一個 java class 來搜索數組以檢查用戶輸入是否列在數組中。 如果該值在數組中,則此代碼會在下一個數組項中打印出網站名稱和 URL。

我最初嘗試使用 OOP 並將掃描儀添加到自己的 class 中,但是當掃描儀位於不同的 class 時,我很難以主要方法從掃描儀獲取輸入。

理想情況下,我還想在單獨的方法中添加 for 循環來清理代碼,但是當我將它添加到單獨的websites.length中時,我無法訪問 website.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 中重構這個 Class?

正如 Federico 評論的那樣,對於這么小的程序,這樣做既沒有必要也不可取。 它太小了,拆分部分代碼不會提高可讀性。

不過,為了在Java中學習編程而做這件事也不是壞事。 所以讓我們假設是你的目標。

我最初嘗試使用 OOP 並將Scanner添加到它自己的 class 中,但是當Scanner位於不同的 class 時,我很難以主要方法從掃描儀獲取輸入。

好吧,我們需要看看你做了什么來理解你的困難。

如果輸入要求很復雜,將它們分解為單獨的 class(甚至方法)可能會起作用。 但是如果你在這里嘗試,你最終會添加許多代碼行而沒有任何好處。

使用 OOP 本身並不是一個目標 這是一種用於實現其他目標的技術。 但是,學習使用OOP 是一個目標。

理想情況下,我還想在單獨的方法中添加 for 循環以清理代碼,但是當我將其添加到單獨的websites.length中時,我無法訪問 website.length 字段。

你不會把它放在一個單獨的類中! 將它放在Search class 的單獨方法中。

您最有可能遇到的問題是website不在 scope 中,因為它在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... 因為我們使用的是static方法和static字段。 但它說明了如何通過使用字段在不同的方法(甚至類)之間共享內容。

而且......再一次...... OO本身並不是一個目標。 所以以上內容足以滿足您的功能需求。 但是,如果您想讓上述內容更加面向對象,您可以

  1. 通過刪除static使search方法成為實例方法。

  2. 像這樣稱呼它:

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

(使websites成為實例字段可能會適得其反。如果您的要求要求搜索者檢查一組固定的網站,則使用static是一種自然的方法。)


對於如何重構這些簡單的代碼行以提高性能或符合 Java 最佳實踐的任何幫助或想法,我將不勝感激。

首先,“最佳實踐”在編程/軟件工程的上下文中是一個無用的術語。 請閱讀沒有最佳實踐! 明白我的意思。

其次,您無法以任何重要的方式提高此代碼的性能。 啟動 Java JVM 並加載您的代碼將花費 100 毫秒。 等待用戶的輸入需要幾秒鍾。 但是進行實際搜索的時間將是幾微秒 在此示例中,您的代碼性能無關緊要。

現在,您可以通過執行以下任一操作來使代碼更簡單、更具可讀性:

  • websites更改為 2 個 arrays,一個包含網站名稱,另一個包含相應的 URL。 (將搜索鍵和搜索值混合到一個數組中會導致問題。)
  • websites更改為HashMap<String, String>然后您可以用get調用替換循環。

但另一方面是這兩者都會使websites的初始化更加復雜。 (在實際應用程序中,將從配置文件加載該信息,或搜索數據庫......)

此外,如評論中所述,您可以將搜索功能與打印結果分開。 閱讀關注點分離設計原則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM