避免过度使用方法重载

时间:2011-05-28 18:32:11

标签: java design-patterns refactoring overloading

我遇到过一个Java实用程序类,它有四种处理数据的方法。所有方法都处理然后将参数写入同一文件,每个方法接受四组不同的输入:

util::process(String data1)
util::process(String data1, Object1 data2)
util::process(String data1, String data3)
util::process(String data1, Object2 data4)

我看到的是代码味道,因为每次引入新的数据组合时,都会添加一种新方法。重载方法感觉它掩盖了设计或对象构造问题。

是否可以重构这一点并避免方法重载?怎么样?

3 个答案:

答案 0 :(得分:2)

恕我直言,因为超载而没有臭。如果这些不是重载,而是不同的方法,那么无论如何都会有代码味道。根据您的编写,似乎代码不遵循open/closed principle。如果没有提供有关您尝试使用代码完成的更多详细信息,我们无法建议任何解决方案。

答案 1 :(得分:2)

这是一个有趣的问题,因为没有足够的细节可以确切地说出来。我相信这段代码会产生一种气味,而且尝试看起来像面向对象的编程是程序化的恶臭。有趣的是,该方法名为“进程”,类型是字符串或类似名称的通用对象。做什么处理?我猜,肯定不是控制器对象。在某些时候,您希望拥有有责任的对象。因此,我们假设其基础是应用程序的概念(例如,作业的应用程序)。您可能希望将方法进程拉入该类型,然后使用继承通过引入不同的应用程序类型来增强功能。

另一种选择是引入责任链模式。我看到的问题是你似乎在说潜在链中只有2个链接。链式方法的优点是处理程序不必彼此了解任何事情。

第三种选择是让后继者实现一个接口。这就像命令模式,然后实际的“处理”实际上只是一个触发器,每个事物都对自己的行为负责。

答案 2 :(得分:1)

我可以想到一些可以合理解释这种超载的可能性:

  1. 这些功能中只有一个实际上可以完成工作,而其他功能仅仅是为了方便起见而在内部调用“工人”方法。甚至可能是这些方法都没有做任何工作,它们都称为内部(私人)方法来完成繁重的工作。我没有看到该模式有任何问题,我自己使用它,没有复制。
  2. 由于语法限制或设计决策,重载方法试图实现的目标可能是不可能的。
  3. 如前所述,您不提供有关这些方法试图实现的信息。您可能能够重构并消除这些方法中的所有方法,但在我建议您是否应该这样做或如何做之前,您需要指定方法的目的是什么以及它们与彼此。 “过程”这个名称并没有告诉我们很多。