オブジェクト指向プログラミング十戒 10 試験可能なコードを書く


 

10 試験可能なコードを書く

メソッドが複雑すぎては、試験プログラムも簡単にはならない。

Process.java
public class Process { public void doProc(boolean a, boolean b, boolean c) { if (a) { if (b) { if (c) { // 処理11 } else { // 処理12 } } else { if (c) { // 処理21 } else { // 処理22 } } } else { if (b) { // 処理11 } else { // 処理21 } } } }

分岐が多く、試験プログラムですべてのコードを網羅することが難しくなります。

また、同じコードの部分がありますが、これらを重複して試験することにもなります。

Process.java
public class Process { public void doProc(boolean a, boolean b, boolean c) { if (a) doProcA(b, c); else doProcB(b); } private void doProcA(boolean b, boolean c) { if (b) doProcAA(c); else doProcAB(c); } private void doProcAA(boolean c) { if (c) doProc11(); else doProc12(); } private void doProcAB(boolean c) { if (c) doProc21(); else doProc22(); } private void doProcB(boolean b) { if (b) doProc11(); else doProc21(); } private void doProc11() { /* 処理11 */ } private void doProc12() { /* 処理12 */ } private void doProc21() { /* 処理21 */ } private void doProc22() { /* 処理22 */ } }

試験プログラムが単純になるように、条件分岐を排除するようにするか、別メソッドに分割して分岐を少なくしましょう。


試験のたびに実行環境が変わるようでは、試験プログラムも簡単にはならない。

Process.java
public class Process { public void doProc() { Calendar cal = Calendar.getInstance(); int dow = cal.get(Calendar.DAY_OF_WEEK); if (dow == Calendar.SUNDAY) { // 処理 } } }

実際の曜日と処理の振る舞いが密接に結合しているため、試験が難しくなっています。

Process.java
public class Process { public void doProc(int dow) { if (dow == Calendar.SUNDAY) { // 処理 } } }

引数を使って、曜日を置き換えられるようにしていますので、任意の曜日の試験がしやすくなっています。