3

私はJavaで些細なことですが、苛立たしい問題を抱えています。次のクラスとメソッドがあるとします。

class A{
    void doSth(int[] array){    
        int index1, index2, index3;
        int value1, value2, value3;    

        if(array[index1] > 10){    
            //Long code modifies value1, value2, value3
        }  

        if(array[index3] > 100){    
            //Same long code modifies value1, value2, value3
        }      

        if(array[index2] > 20){    
            //Same long code modifies value1, value2, value3
        }    
    }

これが何を達成しようとしているのかを無視して、どういうわけかこの冗長性をなくしたいと思います。通常、値をhlperメソッドに渡しますが、ブロックがローカル変数を変更しているため、渡すことはできません。これを単純化する方法はありますか?

4

3 に答える 3

9

それはあなたのように聞こえますvalue1value2そしてvalue3おそらく組み合わせて何らかの意味を持っています。したがって、それらを別のクラスにカプセル化し、その時点で、既存のインスタンスを変更するか、そのクラスの新しいインスタンスを返すメソッドを呼び出すことができます。いずれにせよ、単一のローカル変数で問題ありません。

于 2012-06-10T19:17:58.937 に答える
0

コードをリファクタリングして、必要なものすべてを渡すメソッドを作成できますが、いくつかのプライベートフィールドを導入する必要があります。

   private int value1、value2、value3;

private void doIt(int index, int threshold) {
    if (array[index] <= threshold)
        return;
    ... //Same long code modifies value1, value2, value3
}

次に、メインコードを次のように置き換えます。

void doSth(int[] array, int index1, int index2, int index3) { 
    doIt(index1, 10);
    doIt(index3, 100);
    doIt(index2, 20);
}

これで完了です。

于 2012-06-10T19:26:41.327 に答える
0

ifステートメントのコードがすべてまったく同じである場合は、次のようにしてみませんか。

class A{
   void doSth(int[] array){
      int value1, value2, value3;
      int index[][] = {
        {val1, 10},
        {val2, 100},
        {val3, 20}
      };

      // ... 

      for(int i = 0; i < index.length; i++){
         if(array[index[i][0]] > index[i][1]){
           // ... Long code modifies value1, value2, value3
         }
      }
   }
}
于 2012-06-10T19:39:39.083 に答える