[[リファクタリング]] * メソッドの抽出 [#wa237b1f] ** 内容 [#g23b84f4] : ひとまとめにできるコードの断片がある | -- コードの断片をメソッドにして、それを目的を表すような名前をつける。 *** 変更前 [#me8b2cf6] #pre{{ void printOwing(double amount) { printBanner(); //明細の表示 System.out.println("name:" + _name); System.out.println("amout:" + amount); } }} *** 変更後 [#f9f1e7fe] #pre{{ void printOwing(double amount) { printBanner(); printDetails(amount); } void printDetals(double amount) { System.out.println("name:" + _name); System.out.println("amout:" + amount); } }} ** 動機 [#x1b02594] 長すぎるメソッドやコメントがないとその目的が理解できないメソッドを目にしたとき。 長すぎるメソッド、コメントがないとその目的が理解できないメソッドを目にしたとき。 うまく名前付けされた短いコードが好ましい理由は、 - メソッドの粒度が細かければ、他のメソッドから利用できる可能性が増える。 - メソッド呼び出しがコメント列のように読み取れ、メソッドのオーバライドも容易になる。 *** 注意点 [#pbfd2411] メソッドのネーミングは、その長さではなく、メソッド本体の意味が明快にわかるようにすることが大切である。 ** 手順 [#v2c73fbe] + 新たなメソッドを作成し、メソッドの意図に合わせて命名する。 -- どんな処理をするかではなく、何をするかによって命名する + 抽出されるコードを本のメソッドから新たな抽出先のメソッドにコピーする。 + 元のメソッドのローカル変数とメソッドパラメータへの参照を探す。 + 一時変数は抽出されるコード内だけで使われていることを確認し、抽出先のメソッドの一時変数として定義する。 + 抽出されるコードがローカルスコープ変数を変更するかどうか調べる。 -- 変更される変数が1つならば、抽出したコードを問い合わせメソッドとする -- [[一時変数の分離>リファクタリング/一時変数の分離]]、[[問い合わせによる一時変数の置き換え>リファクタリング/問い合わせによる一時変数の置き換え]]を適用して一時変数を除去する + すべてのローカルスコープ変数に対する処理が終わったらコンパイルする。 + 元のメソッド呼び出しを新しく抽出されたメソッドに置き換える。 ** コメント [#bac88bee] #comment