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

enum回答が受け入れられたとしても、 forを使用した代替ソリューションを指摘したいと思い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))。特定の列挙型定数に対してこれらのメソッドをオーバーライドすることもできます。この例では、列挙値blueとメソッドをgreenオーバーライドしますprocess(Color color)

このアプローチを使用すると、次のことが可能になります。

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

この例の問題点は、回避する必要があるColorとの間に循環依存関係が作成されることです。ColorTypeただし、実装によっては、この問題を解決するため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 に答える