BT

リファクタリング中は考えることを止めよう

| 作者: Vikas Hazrati フォローする 0 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2011年10月24日. 推定読書時間: 3 分 |

原文(投稿日:2011/10/20)へのリンク

リファクタリングは,プログラムの外部的なふるまいを変えずに内部構造を変更するテクニックだ。一見すると相当な思考を伴う作業にも思われるが,過度に考え込むことはかえってマイナスにもなり得る。

Kent Beck 氏は,リファクタリングを実施する上での課題のひとつとして継続性を あげている。いかに作業を安全なステップに分割して順序付けを行うか,それが重要だというのだ。性急すぎるリファクタリング作業の実施は,不安定なコードを伴う火傷を負う結果にもなりかねない。しかし一方では,過度な考慮と安全策の選択が,プロセスに多大な遅延を引き起こす可能性もある。

ペアプログラミングのパートナから何度となく言われたことなのですが,私にはリファクタリングの最中に "考えるのを止めろ" と言うやっかいな習慣があります。ことばで言い表すのは難しいので,これが本当に私の言いたいことでないのはよく分かっています。しかしそれよりもよい表現が,今になるまで見つけられないでいるのです。

Kent は "水平および垂直のリファクタリング" という概念について説明している。垂直リファクタリング (Vertical Refactoring) とは,メソッドを移動したり,あるいはフィールドを呼び出しスタック上で上下に移動したりするものであり,水平リファクタリング (Horizontal Refactoring) は同じような操作を同一レベル内で実施するものだ。リファクタリング時にこの2つをクロスすることは適切でない,というのが Kent の意見だ。

複数の呼び出し処理,あるいは複数の実装処理をリファクタの対象にする場合,垂直と水平との切り替えに注意を払ってこの2つを分離し,垂直リファクタリングをプッシュする深さを常に認識するように努めなければなりません。

とはいえ,これを実行するのは簡単ではない ...

有効な方法のひとつは,インデックスカードを利用することだ。

コンピュータの横にインデックスカードを置いておくと,集中を保つのに役に立ちます。水平リファクタリングの最中に垂直リファクタリングすべき場所を見つけたとき (またはその逆のとき),アイデアをカードに書き留めて,それまでやっていた作業に戻るのです。こうしておけば次の作業に移る前に,ひとつのジョブを効率的に終えることができるのと同時に,グッドアイディアを失うこともありません。究極的には,このプロセスには瞑想に近いものがあります。すなわち自身の息吹を意識しつつ,自身の意識のスパイラルにとらわれることがない状態です。

B. Rainsberger 氏もこれに同意して,次のように述べている。

いつでも,いかなる作業をしているときでも,カードとペンを用意しておきましょう。今すぐに実行する必要のまったくない何かが頭に浮かんだならば,5語程度のことばでそれを書き留めておいて,それまでやっていたことに戻るのです。本当にうまくいきます。

これは原理上,Joshua Kerievsky 氏の唱えた限定的変更 (narrow change) アプローチと非常によく似ている。この場合,1作業のフォーカスは少数の変更点に限定され,このときの情報が,次にリファクタリングすべき限定的あるいは並行的な変更をピックアップするために使用される。

リファクタリングには思索を伴うものだが,しかしその方向を変えるような誘惑に打ち勝ってフォーカスを維持することが,有効なリファクタリングのためには不可欠だ。 Kent も次のように言う。

私のパートナが途中で,いくつかの機能を B へ移行するためのよいアイデアを思いつきました。私が彼に考えることを止めるように彼に言ったのは,その時なのです。実際に彼に考えることを止めて欲しかったのではなく,現在行っていることに集中し続けて欲しかったのです。途中でハーケン(登山用の杭)を叩くような意味のないことは止めるべきです。進むべき次の1インチはすでに分かっているのですから。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT