2015-04-28 69 views
5

我在Java中开发了一个应用程序,我正在重构它。我刚刚意识到,我必须执行几乎同样的动作几种方法,它们具有相似的名称,以及:Java中的重构方法:我应该应用哪种模式?

RestrictedPersonServiceImpl.canViewPersonDetails 

RestrictedPersonServiceImpl.isSubjectRestrictedToWorker 

RestrictedPersonServiceImpl.isAnySubjectRestricted 

RestrictedPersonServiceImpl.isSubjectRestricted 

RestrictedPersonServiceImpl.isAnySubjectOfSubgroupRestrictedToWorker 

我敢肯定,它必须是一种编程模式,适用于对付这种情况。我之前想到的解决方案是将所有这些方法合并为一个,并通过参数确定行为。

有没有更好的选择?

谢谢大家。

+1

也许这个问题是CodeReview站点的一个很好的候选人:http://codereview.stackexchange.com/? – JFPicard

+0

@JFPicard:这些只是方法名称,而不是实际的代码。整个问题似乎也是假设的。 – Jamal

+0

我不明白巨大的'if'语句和带参数的单个方法是如何改进的。你仍然需要用通信方法名称来包装它。重构是否有意义取决于这些方法的实际*实现,这是我们看不到的。 –

回答

1

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

  1. 代码应该很简单。 if/else或switch/case结构越少,你就越好。此代码测量称为“分支因子”
  2. 删除完整方法(如果需要)比移除部分特定方法更容易。
  3. 它在javadoc中更清晰和更容易解释。而且在大多数情况下,不需要解释任何事情,因为方法名称解释了它自己。

其他情况是,如果您的所有方法执行的操作都可以通过参数控制,但没有if/else结构。例如,有一系列方法,如addOne(),addTwo()等等,在这种情况下你应该定义方法add(int value)来完成这项工作。

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

1

IMO,差不多不同于完全一样。如果他们确实是差不多与他们的算法的行为非常本地化的差异,结合Template Method PatternStrategy Pattern想到,您使用前者提供模板框架,而后者改变运行时的行为。

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

相关问题