例
以下のようなコード、
パンケーキを3つ焼くメソッドがありますが、ループの中でパンケーキを焼く処理を細かく記述されています。
もちろんこれでもそれほど悪いコードではないと思いますが、
パンケーキを焼くための詳細なロジックを他のメソッドに切り出せたら、メソッド全体の見通しが少しスッキリしそうです。
class Test
{
public function makeThreePancake(): void
{
$kitchen = new Kitchen();
$kitchen->initialize();
foreach (range(0, 3) as $i) {
// 見通しが悪い処理
$pancakeMaker = new PancakeMaker($kitchen, $i);
$pancakeMaker->mix();
$pancakeMaker->bake();
$pancakeMaker->turnOver();
$pancakeMaker->bake();
$pancakeMaker->getPancake();
print 'パンケーキが焼けたよ';
}
$kitchen->finalize();
}
}
メソッドに切り出したい箇所を選択してRefactor > Extract > Method...
をクリックします
メソッド名、アクセス修飾子を選択するとメソッドに切り出してくれます。
結果は以下のようになります。
class Test
{
public function makeThreePancake(): void
{
$kitchen = new Kitchen();
$kitchen->initialize();
foreach (range(0, 3) as $i) {
$this->makePancake($kitchen, $i);
print 'パンケーキが焼けたよ';
}
$kitchen->finalize();
}
/**
* @param Kitchen $kitchen
* @param $i
*/
private function makePancake(Kitchen $kitchen, $i): void
{
// 見通しが悪い処理
$pancakeMaker = new PancakeMaker($kitchen, $i);
$pancakeMaker->mix();
$pancakeMaker->bake();
$pancakeMaker->turnOver();
$pancakeMaker->bake();
$pancakeMaker->getPancake();
}
}
これでmakeThreePancake()
がスッキリしました。
コードの中で使ってるローカル変数をメソッドの引数にしてくれるのが賢いですね。
以上、参考になりましたら幸いです。