vlambda博客
学习文章列表

如何使用OO和函数式两个方法实现重构?

                   
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;
    };