2

カップリングと結束の意味を知っています。
次の例がありますが、保守性の問題がいくつかあるため、リファクタリングが必要です。

問題は、GLOBAL VARIABLES 以外のカップリング、結束、またはその他の保守性の問題を関連付けることができなかったことです。このグローバル変数の問題なしに次のコードをリファクタリングするにはどうすればよいですか (グローバル変数が複雑さを増し、コードの柔軟性が増すため?!)

double value;
double min, max;

public void read()
{
    do 
    {
        value = ConsoleInput.readDouble();
    }
    while(value < min || value > max);
}

public double hyp()
{
    double x, y;
    min = 0.0;
    max = 100.0;
    read();
    x = value;
    read();
    y = value;
    return Math.sqrt(x * x + y * y);
 }

私は以下のようにリファクタリングすることを考えていました:

public void read()
{
    double value;
    double min = 0.0;
    double max = 100.0;

    do 
    {
        value = ConsoleInput.readDouble();
    }
    while(value < min || value > max);
}

public double hyp()
{
    double x, y;
    read();
    x = value;
    read();
    y = value;
    return Math.sqrt(x * x + y * y);
 }

これは正しく見えますか?または、これをリファクタリングする他の効率的な方法はありますか?

4

4 に答える 4

2

read()次のようにメソッドをリファクタリングします。

public double read(double min, double max)

したがって、値をグローバルに保存するのではなく、関数から返します

于 2015-05-27T13:39:49.623 に答える
0

これが私のバージョンです。注意すべき点 - メソッドはその依存関係を適切に公開する必要があります (依存関係 - 依存関係の挿入など)。そうしないと、嘘つきになる可能性があります。また、readメソッドは現在のオブジェクトの状態を利用していません (つまり、this参照を使用していません)。したがって、それは静的である可能性があります(ただし、ユニットテストが困難になります-それがあなたにとって懸念事項である場合)。

したがって、次のことをお勧めします (これは、この小さなプログラムではやり過ぎに思えるかもしれませんが、リアルタイム プロジェクトでは有効です。ReadData の任意の実装をプッシュできるため、カップリングが減少します) -

enum Bound{

 MAX(100.0), MIN(0.0);

 public double value(){
     return this.value;
 }

 private final double value;

 private Bound(double value){
     this.value = value;
 }

}


public class CalcHyp{

ReadData readData;

CalcHyp(ReadData readData){
    this.readData = readData;
}

public double hyp() {
    double x = readData.read();
    double y = readData.read();
    return Math.sqrt(x * x + y * y);
}

public static void main(String[] args) {
    CalcHyp calcHyp = new CalcHyp(new ReadData());//Declare the dependencies.(Dependency Injection)
    System.out.println(calcHyp.hyp());
}

}

class ReadData{ //Can declare an interface in real time, and various implementations based on your requirement.

  double read() {

    double value = Bound.MAX.value()+1;
    while(value < Bound.MIN.value() || value > Bound.MAX.value()) {
        value = ConsoleInput.readDouble();
    }
    return value;
}
}
于 2015-05-27T14:55:41.957 に答える