【问题标题】:How to remove duplication in different methods in a class?如何删除类中不同方法的重复?
【发布时间】:2016-05-04 07:48:53
【问题描述】:

我有一个类,它提供了几个 api 方法,比如 methodA、methodB、methodC...,

这些方法签名是无法更改的 API。 在每种方法中,我都有非常相似的结构:

1) step1:每个方法都一样

2) step2:每个方法都一样

3) step3:不同的待办事项

有没有办法可以删除这些方法中的重复项?

【问题讨论】:

    标签: android


    【解决方案1】:

    如果您在同一个类中有类似的方法,您可以使用相同的代码创建一个辅助私有方法。

    如果您在不同的类中有类似的方法,那么您可以使用“模板方法”设计模式。这里有一个“模板方法”结构示例:

    public abstract class SuperClass {
        ...
    
        /* A template method. Shared code */
        public void similarCode() {
        // same for every methods
        }
        ...
    }
    
    public class Subclass1 extends Superclass {
        ...
        public void something() {
    
            // different stuff todo
            super.similarCode ();
            // different stuff todo
        }
        ...
    }
    
    public class Subclass2 extends Superclass {
        ...
        public void something() {
    
            // different stuff todo
            super.similarCode ();
            // different stuff todo
        }
        ...
    }
    

    谢谢。

    【讨论】:

    • 非常感谢。这是一个很好的观点。我正在努力将每个 api 的过程抽象为一个命令类。
    【解决方案2】:

    您可以创建另一个执行步骤 1 和步骤 2 的方法,并在需要时调用它。您不必重复它。应该用单个方法替换相同的代码片段看看这个post

    另外,你可以看看这个answer

    【讨论】:

    • 是的,这样更好。但这不是我想要的,因为在每个 api 方法中仍然存在相同方法调用的重复
    【解决方案3】:

    感谢亚历克斯的回复。 我通过以下流程(命令模式)进行了重构:

    1:将每个api方法提取成一个命令类xxxCommand

    2:创建一个超类 BaseApiCommand。把重复的部分移到构造函数中,把类似的部分做成抽象方法,需要在具体的命令类中实现。

    3:保留一个HashMap来保存命令实例:HashMap

    4:在老api逻辑存在的地方,直接调用如下: commands.get("name").execute(.....);

    就是这样。使用命令模式删除重复项。

    【讨论】:

    • 对什么投反对票?如果您有建议,请给一些更好的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多