Java中的重构方法:我应该应用什么模式?

时间:2015-04-28 16:23:08

标签: java design-patterns refactoring tdd

我用Java开发了一个应用程序,我正在重构它。我刚刚意识到我有几种方法可以执行几乎相同的操作,并且它们也有类似的名称:

RestrictedPersonServiceImpl.canViewPersonDetails

RestrictedPersonServiceImpl.isSubjectRestrictedToWorker

RestrictedPersonServiceImpl.isAnySubjectRestricted 

RestrictedPersonServiceImpl.isSubjectRestricted 

RestrictedPersonServiceImpl.isAnySubjectOfSubgroupRestrictedToWorker

我很确定它必须是一种编程模式才能应用于处理这种情况。我之前想到的解决方案是将所有这些方法合并为一个并通过参数确定行为。

有更好的选择吗?

谢谢大家。

2 个答案:

答案 0 :(得分:1)

在大多数情况下,将多种方法合并为一种方法是一个糟糕的选择。 这是一些原因。

  1. 代码应该很简单。 if / else或switch / case结构越少越好。此代码测量称为“分支因子”
  2. 删除完整方法(如果需要)比删除特定方法的一部分更容易。
  3. 在javadoc中解释得更清晰,更容易。此外,在大多数情况下,不需要解释任何东西,因为方法名称解释了自己。
  4. 其他情况是,如果所有方法都执行可由参数控制但没有if / else结构的相同操作。例如,使用addOne()addTwo()等一系列方法毫无用处。在这种情况下,您应该定义完成工作的方法add(int value)

    有时定义接受参数但显示一系列公共方法的私有方法是有用的,这些方法没有使用正确参数调用此私有方法的参数。当这些方法之间的错误处理存在一些差异或者如果有多个参数并且并非所有组合都合法时,这通常很有用。

答案 1 :(得分:1)

IMO,几乎相同的完全相同的不同。如果他们真的几乎相同,并且他们的算法行为存在非常本地化的差异,则会想到Template Method PatternStrategy Pattern的组合,您可以使用前者提供模板框架,后者在运行时改变行为。

现在,我假设您有RestrictedPersonService实现的名为RestrictedPersonServiceImpl的接口。合同清洁,合适的界面更重要IMO,因为这将是您的用户所接触的。看看鲍勃叔叔的Interface Segregation Pinciple。它的要点是不要让你的界面知道太多。换句话说,不要将您的接口实现与系统中与其无关的其他实现耦合。理想情况下,每个接口应该只有一个责任,即Single Responsibility Principle。所以,我个人不会将所有这些方法合并在一起,除非他们分担完全相同的责任。