8

私はオブジェクト、具体的には次のような1つの関数に取り組んでいます。

public class Dog {
    private ArrayList<Paw> paws;
    private double age;
    private Tongue tongue;

    public Dog(ArrayList<Paw> paws, double age, Tongue tongue) {
        this.paws = paws;
        this.age = age;
        this.tongue = tongue;
    }

    public void bark() {
        // ... about 100 lines of side effects operating
        // on the object's global members ...
    }
}

私は本当にこれらの副作用を修正し、オブジェクトを1つのことだけを行う関数にリファクタリングしたいと思っています。

考えられる副作用をマークするための自動化されたプロセスがEclipseにありますか?

そうでない場合は、ウサギの穴に迷わないように、従うことができる手動のアルゴリズムはありますか?

4

4 に答える 4

8

Dogすべての「副作用」を含む 古いクラスをテストする単体テストを作成します(ここで何を意味するのかよくわかりません)。

単体テストに合格した場合は、リファクタリングを開始し (Eclipse を使用して適切な行を選択し、右クリックを使用して [リファクタリング]、[メソッドの抽出] を使用します)、引き続き単体テストを使用して、リファクタリングによって何かが壊れていないかどうかを確認します。

編集:

Pawおよびクラスの属性を他に変更しているものを見つけるには、で使用される任意の属性に変更ウォッチポイントを設定できます (つまり、属性にブレークポイントを設定し、ブレークポイントを右クリックTongueし、ブレークポイント プロパティを選択し、「アクセス」のチェックを外します)。bark()デバッガーでアプリを実行していると、プロパティが変更されるたびにデバッガーが停止します。

于 2013-01-16T22:24:51.170 に答える
2

自動化されたプロセスについては知りません。

手動アルゴリズムに関しては、すべてのクラス フィールドを にすると、 の副作用として、変更されたほとんどのfinal場所でエラーが発生します。(代わりに名前を変更することもできますが、それはそれらからの読み取りにもフラグを立てます) したがって、副作用を非常に簡単に見つけることができます。エラーがなくなるまで、小さな関数にゆっくりとリファクタリングします。bark()bark()

ArrayList の足はこのトリックではカバーされません。それはおそらく名前を変更するものです。finaladd(), remove()

于 2013-01-16T22:25:44.980 に答える
1

可能性のある副作用をマークするために Eclipse に自動化されたプロセスはありますか?

いいえ、ありません。

そうでない場合、うさぎの穴で迷子にならないように、従うことができる手動のアルゴリズムはありますか?

ctrl + /まず、オブジェクトのすべてのグローバル メンバーにコメント ( ) を付けます。したがって、関数では、引数の受け渡しまたはローカル変数で修復する必要がある、赤で下線が引かれた単語が表示されます。後でメンバーのコメントを外します。Eclipse では、ショートカットCtrl + Shift + Mを使用してメソッドを抽出することもできます。Ctrl + Shift + Rリファクタリングには、変数名を変更するための非常に便利なショートカットもあります。

于 2013-01-16T22:26:52.040 に答える