如何将新参数添加到高度耦合的方法?

时间:2013-10-01 18:00:15

标签: java refactoring

我有一个Java类,其方法在我的app API中高度耦合,如下所示:

public class ProductModel {
    public static Product createProduct(ProductType productType, String comment) {
        return createProduct(productType, comment, null);
    }

    public static Product createProduct(ProductType productType, String comment, Long sessionTrackingId) {
        // Here now need sessionTrackingId Long
        // But this method is never called
        ....
    }
}

第一种方法在许多类和我的API项目(业务)和我的应用程序项目(前端)中调用。第二种方法只是在同一个类ProductModel中调用,但现在我需要通过传递我从app项目(前端)获取的sessionTrackingId来做一种重构来使用第二种方法。

API是另一个像Java库.jar一样使用的项目,我需要将此参数传递给第二个方法。

我该怎么做?也许在第一个方法的每个调用中向接口添加一个新的抽象类?

3 个答案:

答案 0 :(得分:1)

我会简单地在第一个方法内联它,它被调用。现在你的调用者都在调用第二个方法,第三个参数为null。找到它被调用的所有地方,并用调用上下文中适当的任何内容替换null。

答案 1 :(得分:0)

这种事情属于立面facade pattern的范畴。这是很好的做法。关键是在方法签名之间保留尽可能多的代码。 您对问题的描述有点难以理解,但您实际上并未尝试按照标题中的建议添加第三个参数。

我大多同意卡尔的观点。您可以在默认不匹配的参数的同时添加方法签名。请注意,“inlining”不是Java中的开发人员责任,而是留给JVM。

答案 2 :(得分:0)

由于这个方法是高度耦合的,我使用单例模式解决了这个问题,并在会话启动时设置了这个值,并在方法调用中使用它:

public class ProductModel {
    public static Product createProduct(ProductType productType, String comment) {
        return createProduct(productType, comment, Application.getSessionTrackingId());
    }

    public static Product createProduct(ProductType productType, String comment, Long sessionTrackingId) {
        // Here now need sessionTrackingId Long
        // But this method is never called
        ....
    }
}