オブジェクト指向プログラミング十戒 7 変数をむやみに作らない


 

7 変数をむやみに作らない

ローカル変数はその変数を必要とするブロック内に定義すべきである。無駄にその変数のスコープを広げないようにする。

Process.java
public class Process { private String s = ""; public void doProc(String text) { int i = 0; int n = 3; char c; for (i = 0 ; i < text.length() ; i++) { c = text.charAt(i); s += (c >= '0' && c <= '9')? '#' : c; } // 略 while(n-- > 0) { // 3回繰り返す // 略 } return s; } }

変数のスコープが必要以上に広くなっています。値を与えたところと使用するところが離れていると不注意で変更されてしまうかもしれません。

Process.java
public class Process { public void doProc(final String text) { String s = ""; for (int i = 0 ; i < text.length() ; i++) { char c = text.charAt(i); s += (c >= '0' && c <= '9')? '#' : c; } // 略 int n = 3; while(n-- > 0) { // 略 } return s; } }

変数を使用している範囲の中で、使用する直前に定義します。不注意による変数の書き換えを防ぐことができます。また、変更されたくない変数には final を付けるようにします。


インスタンスの生成はそのインスタンスを必要とするブロック内に定義すべきである。無駄にインスタンスを生成しないようにする。

Process.java
public class Process { public void doProc(int n) { Calendar cal = Calendar.getInstance(); if (n > 0) { cal.add(Calendar.DAY_OF_MONTH, n); // 略 } } }

n が 正のときだけ Calendar インスタンスが必要になります。インスタンスを無駄に生成しないようにします。

Process.java
public class Process { public void doProc(int n) { if (n > 0) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, n); // 略 } } }

インスタンスは必要になったときに生成します。


boolean 型の変数の場合、if 文などの条件で (変数名 == true) のようにしないと、意味が分からない名前は避ける。

Process.java
public class Process { public void doProc(boolean changeFlag) { if (changeFlag == true) { // 略 } } }

changeFlag という変数名では true と false のどちらが変更可能なのか、あるいは既に変更されたということなのか、変数名から推測できません。

Process.java
public class Process { public void doProc(boolean changeable) { if (changeable) { // 略 } } }

changeable という変数名は、変更可能であることを表しています。