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

Java中的重构方法:我应该应用什么模式?,java,design-patterns,refactoring,tdd,Java,Design Patterns,Refactoring,Tdd,我用Java开发了一个应用程序,我正在重构它。我刚刚意识到,我有几个方法执行几乎相同的操作,它们也有相似的名称: RestrictedPersonServiceImpl.canViewPersonDetails RestrictedPersonServiceImpl.isSubjectRestrictedToWorker RestrictedPersonServiceImpl.isAnySubjectRestricted RestrictedPersonServiceImpl.isSub

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

RestrictedPersonServiceImpl.canViewPersonDetails

RestrictedPersonServiceImpl.isSubjectRestrictedToWorker

RestrictedPersonServiceImpl.isAnySubjectRestricted 

RestrictedPersonServiceImpl.isSubjectRestricted 

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

有更好的选择吗


谢谢大家。

在大多数情况下,将多个方法合并为一个是错误的选择。 以下是一些原因

  • 代码应该很简单。if/else或switch/case结构越少越好。此代码度量称为“分支因子”
  • 删除完整方法(如果需要)比删除特定方法的一部分更容易
  • 在javadoc中,它更清晰、更容易解释。此外,在大多数情况下,不需要解释任何内容,因为方法名称可以解释自己 另一种情况是,如果所有方法都执行相同的操作,这些操作可以由参数控制,但没有if/else结构。例如,像
    addOne()
    addTwo()
    等一系列方法是没有用的。在这种情况下,您应该定义执行此任务的方法
    add(int-value)

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

    在我看来,几乎相同的与完全相同的是不同的。如果它们确实几乎相同,但在算法的行为上存在非常局部的差异,那么会想到和的组合,其中使用前者提供模板框架,使用后者在运行时改变行为


    现在,我假设您有一个名为
    RestrictedPersonService
    的接口,您的
    RestrictedPersonService
    实现了该接口。在我看来,按照合同进行干净、正确的界面设计更为重要,因为这将向用户公开。看看鲍勃叔叔的。它的要点是不要让你的界面知道太多。换句话说,不要将您的接口实现与与之无关的系统的其他实现结合起来。理想情况下,每个接口只应承担一项责任,即:。因此,我个人不会将所有这些方法合并在一起,除非它们分担完全相同的责任。

    也许这个问题是CodeReview站点的一个很好的候选问题:?@JFPicard:这些只是方法名称,而不是实际的代码。整个问题似乎也是假设性的。我不认为一个巨大的
    if
    语句和一个带参数的方法是一种改进。您仍然需要用交际方法名称来包装它。重构是否有意义取决于这些方法的实际实现,我们看不到。我认为你有一种门面模式——因为每个方法都明确定义了它的作用域。。因此,当呼叫者呼叫它时,在呼叫者代码中,您知道正在进行什么样的检查。@ STACKPEPE,如果您发现任何有帮助的答案,请考虑支持和接受。谢谢