如何使用OO和函式式兩個方法實現重構? - DZone

banq發表於2022-05-14

Java 中的重構有很多方面,但其中有兩個基礎:物件導向函式式。物件導向幾乎從第一個 Java 版本開始就存在,而函式式只出現在 Java 1.8(2014 年 3 月)中。
Java 是一種經典的物件導向語言,允許建立靈活的物件結構。在 Java 1.8 獲得功能特性之後,它不僅可以使用物件或方法,還可以使用lambdas(它本身就是可執行程式碼)進行操作。在函式世界中,您可以像在 OO 世界中使用物件一樣操作函式。

重構最佳實踐:
  • 使用物件導向的方法將性質相似的物件統一在一個結構中 
  • 使用函式方法來統一函式相似的程式碼。它們一起使程式碼的可讀性和可維護性顯著提高。


使用 OO 方法重構程式碼
使用繼承或組合來處理介面和類,您可以建立可重用的通用解決方案,從而減少程式碼量並提高可讀性。類可以在相同的公共結構中聯合,如果它們:

  • 具有相似的欄位並被識別為同一實體
  • 有關係父母/孩子
  • 有類似目的的方法

使用函式式方法重構程式碼
與 OO 方法不同,這種方法提取具有相同行為的程式碼。例如,我們可以在下一個示例中識別相似之處:

  • 實現具有相同的返回型別
  • 實現具有相同的函式


假設我們有一個小型應用程式,它向永久和合同員工付款。每次付款後,我們都會列印一份報告Employee並顯示不同格式的資料(永久和承包商的 JSON 和 XML)。
案例使用的程式碼 可在此處獲得
  • Contractor和Employee有類似結構
  • Contractor可以重構成為Employee類的孩子


上面這段程式碼中還有相似的功能:轉換到JSOn和轉到XML:
我們傳遞一個物件並返回一個字串。因此,我們可以將該程式碼提取為一個可重用的函式,並將其動態地用於此業務邏輯,甚至在它之外使用。

為了決定正確的 函式介面(例如,Predicate、Consumer、Function 等),我們需要檢查我們的輸入和輸出。在我們的例子中,我們得到一個Object 並將其轉換為String。 

@FunctionalInterface
    interface Converter<T, R> {
        R serialize(T var1);
    }


有了一個函式介面,我們建立了兩個Converters:json 和 xml。它們都將匹配定義的簽名(物件輸入和字串輸出)。

   final static Converter<Object, String> JSON_CONVERTER = (object) -> {
        Gson gson = new Gson();
        return gson.toJson(object);
    };

    final static Converter<Object, String> XML_CONVERTER = (object) -> {
        XmlMapper xmlMapper = new XmlMapper();
        try {
            return xmlMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    };


 

相關文章