使用面向对象和函数式方法(函数式)重构Java应用程序。其中,前者几乎从第一版Java就已经存在,而功能则从2014年3月推出的Java1.8开始。1.面向对象和函数式方法作为经典的面向对象语言,Java允许用户创建灵活的对象结构。Java1.8出现函数式特性后,不仅可以使用对象或方法,还可以使用lambdas(本身就是可执行代码,https://dzone.com/articles/java-lambda-method-reference)进行各种itemaction.在函数世界中,您可以像在OO世界中操作对象一样操作函数。2.使用OO方法重构代码通过使用继承或组合来处理各种接口和类,可以创建各种可重用的通用解决方案,从而减少程序代码量,提高可读性。如果一个类满足以下条件,则可以在相同的公共结构中联合:具有相似的字段,并且被识别为同一实体具有父/子(parent/children)关系和具有相似目的的方法3.重构代码使用a功能方法不同于OO方法,后者提取具有相同行为的代码。例如,我们可以找出下面两个例子的相似之处:返回相同类型的能力在具体实现中具有相同的功能4.使用两种方法进行重构的例子假设我们有一个小应用程序,其功能是发薪水正式员工(Employee)和合同工(Contractor)。我们会在每次发薪水的时候打印一份Employee报告,并以不同的格式显示(https://dzone.com/articles/so-much-data-so-many-formats-a-conversion-service),即:正式员工为JSON格式,而合同工为XML格式。下面是一个使用两种方法进行重构的例子:现在让我们看一下它的默认结构:5.重构类的结构很明显,Contractor可以是Employee类的子类。此外,可以覆盖makePayment。当然,我们也可以创建一个Payable接口并提取makePayment方法,但这里让我们保持简单。如下代码片段所示,经过重构,我们有了一些公共字段,以及可重用的构造函数。6.重构功能现在我们可以从功能的角度来回顾和发现源码中的相同点:如上图所示,从打印的报告中可以看出我们可以使用同样的方法来处理,即:传递一个对象并返回一个字符串。因此,我们可以将代码部分提取为可重用的函数,动态地用于业务逻辑。我们甚至可以在业务之外使用它。7.创建功能接口为了确定正确的功能接口(例如,Predicate、Consumer、Function等),我们需要检查自己的输入和输出。在这种情况下,我们得到了一个对象,需要将其转换为字符串。该接口由功能函数提供。为了更容易理解,我们使用serialize方法创建一个自己的Converter接口。对应的代码如下,可读性很强:8.创建Lambda转换器(Converter)功能接口接下来,我们可以基于功能接口创建两个转换器:JSON和XML。它们都将匹配定义的签名,即:ObjectInput和StringOutput。接下来我们在代码中使用它们:9.将转换器封装在Employee类中与前面的方法类似,我们可以将这个函数封装在Employee父类中,在内部函数中使用。下图显示了转换器是如何封装在Employee类中的:10.查看最终版本最后,我们初始化两个员工类并遍历它们的支付实现和打印方法。我们最终会得到:在Contractor中复用了Employee父类中的Commons字段和方法,并且可以在不改变Employee类的情况下抽取function函数转换器(以后可以添加)。提取出来的函数函数可以在Employee11中使用。点评总的来说,上面的例子还不够完善,需要改进。例如,我们可以将Employee和Contractors类隐藏在接口后面。你也可以尝试写一个简单的例子来展示一些面向对象和函数式的特性。当然,我创建的函数可能不是严格意义上的纯函数。并且一些开发人员倾向于坚持认为在Java中只有纯函数更好。在这里,我有所保留。12.总结让我们总结一下上面的内容:使用面向对象的方法,我们可以将性质相似的对象统一到相同的结构中。使用功能方法,我们可以统一功能相似的代码。这两种方法都可以显着提高程序代码的可读性和可维护性。原文链接:https://dzone.com/articles/refactoring-java-application-object-oriented-and-f译者介绍陈朱利安(JulianChen),51CTO社区编辑,拥有十余年IT项目实施经验、善于管控内外部资源和风险,注重传播网络与信息安全知识和经验;持续以博文、专题、翻译等形式分享前沿技术和新知识;经常在线和离线进行信息安全课程。培训和教学。
