リファクタリング

●リファクタリングとは
外部からみたときにプログラムの振る舞いを変えずに、プログラム内部の構造を改善すること

●リファクタリング箇所

1.マジックナンバーをシンボリック定数に置き換える
・public staic finalのシンボリック定数に置き換える(クラス内での使用はprivate)
・定数そのものの値を使用する(出力、比較)のではなく、種類等であればenumの方がすっきりする。

2.制御フラグの削除
・制御フラグはどんな制御フラグかわかるように名前をかんがえること
例)
・初期化が済んだ事がわかるフラグ→initialized
・デバッグフラグ→debug
・処理が完了した事を表すフラグ→done
・スレッドへの処理のキャンセル指令→interrupted
・メソッドの引数に度々使用されるフラグで再起的にメソッドを適用するかどうかを
制御するフラグ
(Compositeパターンが使用されている再起的な構造「OO-Recursiveな構造」があるとき)
→recurse

・条件に制御フラグにfalse/tureを入れて最後にフラグをreturnするより
そのまま「return true;」のように記載した方が、変数を作らなくてすむ。
・一度、trueになったら、breakをいれるなど。

3.アサーションの導入
・実行時に確かにその条件がなりたっていること、プログラマの意図をはっきりさせるために
アサーションを導入する事を考える
例)valuesは必ず正である
→assert value > 0;
※上記の記述で、もしvalues > 0が成り立たないなら、Java実行処理系は
java.lang.AssertionErrorという例外をthrowする。
この例外は致命的なエラーを表すjava.lang.Errorのサブクラス。
VirtualMachineErrorやThreadDeathなどと同様にcatchするコードは書かない。
あたりまえだが、java.lang.AssertionErrorが投げられるという事は意図と反しているため
修正が必ず必要であるからだ。

・javaコマンドで実行しますが、デフォルトでassertは無効になっている
→java -ea Main
上記のように「-ea」オプションをつけて実行する必要がある。
ちなみに「-ea」はenable assertionsの略(覚えやすい)

・アサーションの記法
a) assert expr;
b) assert expr: option;

aについては、前述していますが、bのoptionですがこれはアサーションが
成り立たなかった時に詳細な情報optionとして与えています。
→assert value > 0 : “value = ” + value;

optionの内容はコンソールに出力されます。

・Javaのアサーションはクラスライブラリではない
assertという語は、Java言語のキーワードとして扱われる。
すなわち、Javaのクラスライブラリとして組み込まれたものではなく、
Java言語仕様として組み込まれている。

・アサーションの完全削除
アサーションは無効で実行されていても、バイトコードの中にに残っている。
ただ、Java言語仕様の14.20「到達不能文」を利用するとassert文を完全にクラスから
削除できる。(厳密にはコンパイラの実装に依存)

private static final boolean ASSERT = true;
…….
if (ASSERT) {
assert value > 0;
}

“ASSERT”をfalseにした時点でif文の中身は実行されない事がコンパイル時にわかるので、
関連コードは含まれなくなります。これは、Java言語仕様14.20「到達不能文」に記述
されているif文を用いた「条件コンパイル」という機能を使っている。