208話に次男かずがタッチタイピングの練習をしていると書いたが,実はあれからずっと続いている。なぜ,あんな退屈なことを毎日続けられるのか不思議なのだが,キーボード音を聞いているとかなり速くなったようだ。タイピングに熱中すると頭を休めることができるのかと思ったりしたが,陸上競技部で筋トレにうちこんでいる中2のかずに,あまり頭を休める必要があるとは思えない。

 タッチタイピングの基本はFキーに左手の人差し指を,Jキーには右手の人差し指を置き,他の指はFとJの横一列に軽く置くことである。FとJキーには,出っ張りが付いているので目で確認しなくても,触って正しい位置を探すことができる。これをホーム・ポジションと呼び,ホーム・ポジションから指をあまり上下させずに前後左右に動かすことで速いキータッチが実現できる。ホーム・ポジションに指を戻しておくことで,目でキーを追う必要がなくなる。などと書いているが,実は筆者,自己流できれいなタイピングができない。

 冬になると我が家にはもうひとつホーム・ポジションが増える。このところ北陸は日に日に寒くなっており,12月3日にはとうとう初雪が降った。寒くなるとファンヒーターの前が妻のホーム・ポジションになる。彼女の名誉のために言っておくが,もちろん妻は朝から夜遅くまで忙しくまめに働いている。面と向かっては言いたくないが,私はとても感謝している。しかし手が空くと,決まってファンヒーターの前にいるのだ。気が付くとファンヒーターの前で丸くなっている。へたをすると,そのままウトウトしてしまう。しばらくウトウトしたあと,また家事をこなし,いつのまにか,またホーム・ポジションに戻るようにファンヒーターの前にいる。

 さて,本題に進もう。こうしろうは月に3,4回,1時間半くらいEclipse+Visual Editorの勉強をしている。でも,その様子をこの日記にアップすると画面キャプチャだらけになるので,こうしろうの勉強がひと段落し自分で何かを作り出すまでは,小ネタをお送りしていきたい。今回はリファクタリングである。

 リファクタリングとは,「プログラムの振る舞いを変えることなくソースコードを改善すること」である。たとえば,イベント・ドリブン・プログラム(ユーザーの起こすマウス・クリックなどのイベントに対応するコードを記述するスタイル)では,ボタンが押されたら,どうするという処理をボタンの背面に書いていく(もちろん,ボタンに実際に背面があるわけではないのでイメージとしてとらえてほしい)。コードを書いているうちに,「あれもしなくっちゃ,これもやったほうがいいだろう」とコードがどんどん長くなっていく。プログラムを書く前にきちんと設計をすればいいのだろうが,現実としては漠然としたイメージだけでプログラミングを始めることが多いだろう。

 いろいろ考えて,プログラムを書いていくうちにコードは汚く,見にくくなってくる。書き散らかしたコードを将来の機能拡張に備えて,わかりやすく保守しやすい状態にしておくためにリファクタリングは必要なのである。「プログラムなんて,動けばそれでいいのだ」などと,うそぶいてはいけない。

 もっとも,「リファクタリングなんて言わなくても,昔からコードを書いた後に必ず見直しをしているよ。何をいまさら」といぶかしがる諸兄もおられるだろう。なぜ,リファクタリングを持ち出したかと言うと,Eclipseにはリファクタリングというメニューがあるのだ。

 細かい説明は省略するが,リファクタリング・メニューに多くの機能があることは感じてもらえるだろう。上記の画像では,選択不可(淡く表示)になっているメソッドの抽出を試してみよう。

Visual Editorのパレットから,パネルを二つ,ラベルを二つ(名前とメールアドレス),テキストフィールドを二つ,そしてボタンを二つ配置した。リセット・ボタンが押されたときの処理を記述しようと,リセット・ボタンを右クリックして,Events-actionPerformedを選択する。

 actionPerformedメソッドとそれをリスナーに登録するためのコードのヒナ型が表示される。System.out.println("actionPerformed()");の行をコメントアウトして,リセット・ボタンが押されたときの処理を記述する。

ここに必要な処理はテキストフィールドをクリアするたった2行のコードなのだが,いろいろやらなくっちゃいけないことがあって50行ぐらいのコードを書いたと,無理にでも思ってほしい。

actionPerformedに記述したコードを選択して,リファクタリング-メソッドの抽出を選ぶ。

ダイアログが表示されるので,メソッド名と宛先タイプ(どこにメソッド作るか)を指定する。そうすると,下記のようにdo_resetというメソッドが抽出され,

----------------------------------------------------------

private void do_reset() {
  jTextField.setText("");
  jTextField1.setText("");
}

----------------------------------------------------------
actionPerformed側は,do_resetメソッドを呼び出すように変更される。
----------------------------------------------------------

public void actionPerformed(java.awt.event.ActionEvent e) {
  //System.out.println("actionPerformed()"); 
  do_reset();
}

----------------------------------------------------------
 どのようにメソッドが抽出されるかをプレビューすることもできるので,間違いなくコードを整理できる。

 Eclipseの機能に触れるたびに「エディタ1本あればいい」などと言って,シンプルなエディタだけでPHPのプログラムを書いてちゃいけないなあと実感する筆者である。