我遇到过一个Java实用程序类,它有四种处理数据的方法。所有方法都处理然后将参数写入同一文件,每个方法接受四组不同的输入:
util::process(String data1)
util::process(String data1, Object1 data2)
util::process(String data1, String data3)
util::process(String data1, Object2 data4)
我看到的是代码味道,因为每次引入新的数据组合时,都会添加一种新方法。重载方法感觉它掩盖了设计或对象构造问题。
是否可以重构这一点并避免方法重载?怎么样?
答案 0 :(得分:2)
恕我直言,因为超载而没有臭。如果这些不是重载,而是不同的方法,那么无论如何都会有代码味道。根据您的编写,似乎代码不遵循open/closed principle。如果没有提供有关您尝试使用代码完成的更多详细信息,我们无法建议任何解决方案。
答案 1 :(得分:2)
这是一个有趣的问题,因为没有足够的细节可以确切地说出来。我相信这段代码会产生一种气味,而且尝试看起来像面向对象的编程是程序化的恶臭。有趣的是,该方法名为“进程”,类型是字符串或类似名称的通用对象。做什么处理?我猜,肯定不是控制器对象。在某些时候,您希望拥有有责任的对象。因此,我们假设其基础是应用程序的概念(例如,作业的应用程序)。您可能希望将方法进程拉入该类型,然后使用继承通过引入不同的应用程序类型来增强功能。
另一种选择是引入责任链模式。我看到的问题是你似乎在说潜在链中只有2个链接。链式方法的优点是处理程序不必彼此了解任何事情。
第三种选择是让后继者实现一个接口。这就像命令模式,然后实际的“处理”实际上只是一个触发器,每个事物都对自己的行为负责。
答案 2 :(得分:1)
我可以想到一些可以合理解释这种超载的可能性:
如前所述,您不提供有关这些方法试图实现的信息。您可能能够重构并消除这些方法中的所有方法,但在我建议您是否应该这样做或如何做之前,您需要指定方法的目的是什么以及它们与彼此。 “过程”这个名称并没有告诉我们很多。