0

一个Request类有一个属性colorType,它可以是不同的颜色。根据颜色的类型,它会涉及到不同的处理方式。

这是控制器代码:

def colorInstance = Color(params)
//validates and checks the params. Also, based on some logic sets the `colorType` property 
//to be appropriate color
if (colorInstnace.validate()) 
{
   colorService.processColor(colorInstance)
}

这是colorService代码:

void processColor(Color colorInstance) { 
  if (colorInstance.colorType == "green")
      processGreen(colorInstance)
  else if (colorInstance.colorType == "red")
      processRed(colorInstance)
  ....
  ......
}

processGreen(Color colorInstance) {
  //common code
  //code specific to colortypes that are GREEN
  //more common code
}

processRed(Color colorInstance) { 
  //common code
  //code specific to colortypes that are RED
  //more common code
}

问题

  1. 如何更改服务中的代码,以便不必在所有processXXX方法中复制粘贴代码?
  2. 我怎样才能消除方法if/elseif中的processColor
4

3 回答 3

1

即使答案已被接受,我也想指出使用enumfor的替代解决方案ColorType

class Color {
    ColorType colorType
    ...
}

enum ColorType {
    blue {
        @Override void process(Color color) {
            // code for processing blue
        }
    },
    green {
        @Override void process(Color color) {
            // code for processing green
        }
    },
    red,
    yellow

    void process(Color color) {
        // used for red and yellow
    }
}

就像在 java 中一样,您可以向枚举添加方法(如process(Color color))。您还可以为某些枚举常量覆盖这些方法。在此示例中,枚举值bluegreen覆盖该process(Color color)方法。

使用这种方法,您将能够做到这一点:

void processColor(Color colorInstance) {
     commonMethod(colorInstance)
     colorInstance.colorType.process(colorInstance)
     otherCommonMethod(colorInstance)
}

这个例子的问题是它在和之间创建了一个循环依赖关系ColorColorType应该避免这种依赖关系。但根据您的实现,可能会color从方法中删除参数ColorType.process()以解决此问题。

我只是想指出,在这种情况下,覆盖枚举方法有时可能是一个有用的功能:-)

于 2013-07-10T20:29:47.430 回答
1

我认为如果您改用整数常量会更容易..例如

// you could use actual RGB too.. then red would be 0xff0000
static final int RED = 0
static final int BLUE = 1
static final int GREEN = 2

然后在 colorService 中,你可以尝试这样的事情......

void processColor(Color colorInstance) { 
  commonMethodOne();

  switch(colorInstance.colorType){

  case RED:
     //Handle the red color
  case BLUE:
    // Handle the blue color, etc.

  }

  commonMethodTwo();
}

commonMethodOne(){
  //Here is code that gets executed regardless of Color
}

commonMethodTwo(){
  //Here is more code that gets executed regardless of Color
}
于 2013-07-10T18:43:51.320 回答
1

服务类可以有以下实现。groovy 中的switch case可以处理任何值,您不需要使用任何原始数据类型。

void processColor(Color colorInstance) { 
  processCommonCodeBefore(colorInstance)
  processColorSpecificCode(colorInstance)
  processCommonCodeAfter(colorInstance)      
}

processCommonCodeBefore(Color colorInstance) {
  //common code
}

processCommonCodeAfter(Color colorInstance) { 
  //common code
}

processColorSpecificCode(Color colorInstance) { 
     switch(colorInstance.colorType){
        case 'green':
            processGreen(colorInstance)
            break
        case 'blue':
            processBlue(colorInstance)
            break
        default:
            processDefault(colorInstance)
     }      
}

这样,服务类中的所有方法都可以有效地进行单元测试。

于 2013-07-10T18:54:33.407 回答