【问题标题】:design pattern: refactor the code like these设计模式:像这样重构代码
【发布时间】:2012-06-05 15:09:55
【问题描述】:

我打算在下面重构我的代码

1.Class A_Builder to build A_Model

Class A_Builder{
public A_Model build(arg1){
//build A_Model
}
}


2.Class B_Builder to build B_Model

Class B_Builder{
public B_Model build(arg2,arg3){
//build B_Model
}
}

3.Class C_Builder to build C_Model
Class C_Builder{
public C_Model build(arg4){
//build C_Model
}
}

4.Class D_Builder...

一个builder构建模型,所以我打算使用命令模式来重构它们,将构建方法作为命令,但是如何处理不同的变量号,比如A是(arg1)和B是(arg2,arg3)

或者有什么想法可以重构这样的代码?提前谢谢。

【问题讨论】:

  • 方法中的参数不同
  • 您想要一个基于输入构建多个模型的构建器,还是要将构建器中的通用代码重构为一个超类?
  • 所有模型在构建函数中都有不同数量的参数,或者有可能在两个具有相同签名的构建器类中具有 build(..)?模型类是否以某种方式相关(具有相同的超类等)?
  • @Jeremy Heiler:因为他们在做类似的事情,但构建了不同类型的模型,所以我认为我们可以重构它们吗?
  • @dbf:我想为他们建立一个超大类,但为这种情况创建一个超类似乎并不容易。

标签: java oop design-patterns jakarta-ee refactoring


【解决方案1】:

您尚未指定您使用的语言,但我遇到的大多数语言都支持overloading of functions

这意味着你可以用相同的名字声明两个独立的函数,但接受不同的参数,然后当你调用函数并执行适当的函数时,语言会检查你传递的参数:

class Builder {
    public build( arg ) {
        // Build A Model
    }

    public build( arg, arg ) {
        // Build B Model
    }

    ...
}

或者,如果您的函数参数都是相同的变量类型,您可以简单地创建一个接受参数数组的函数。数组可以是可变长度的,因此您的单个函数可以执行不同的操作,具体取决于数组的长度:

class Builder {
    public build( arg[] ) {
        switch( arg.length ) {
            case 1:
                // Build A Model
                break;
            case 2:
                // Build B Model
                break;
            ...
        }
    }
}

【讨论】:

  • 方法中的参数不同
  • @simon.liu:这个解决方案不适合你吗?正如您所提到的,这里的重载方法也有不同数量的参数。不同Builder类的2个build()方法是否可能具有相同的签名?
  • @Jamie:谢谢大家,但我认为重载不是一个好主意,因为他们正在做不同的事情(一个构建 A_Model,另一个构建 B_Model 等)。使用参数数组也不好,因为 C_Builder 也有 2 个参数,而 D_Builder 可能只有 1 个参数。
  • @simon.liu 如果他们正在构建不同的模型,您为什么要合并这些类?如果你有通用代码,创建一个抽象超类或创建一个可以在每个构建器中使用的类。
  • @Jeremy Heiler:我认为整合它们可以很容易维护并有助于扩展
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多