C0とはすべてのステートメントを一回実行するというのが定義である。オブジェクト指向言語に対応するにはこの定義を変えなければならない。なぜならば、オブジェクト指向言語では条件分岐のない、多相性を利用したプログラムを書くのが作法だからである。goto文を使わないのはもちろん、switch文やcase文も使わない。動的束縛が可能な言語ではメソッド自体を可変、つまり変数にもできる。
- 手続き型の場合
for (i=0; i < numType; i++) switch(accounts[i].type) { case 1: printFutsuu(accountType[i]); break; case 2: printTeiki(accountType[i]); break;}
すべてのcase文をとおるテストケースを実行すればよい。
- オブジェクト指向言語の場合
(accouts) do :[:eachAccount | eachAccount printTo: aStream.].
eachAccountのインスタンス数分、テストケースを用意しなければならいない。
eachAccountのオブジェクトを生成するクラスでprintTo:メソッドの単位テストが終了していれば、上述のステートメントを一度とおるテストをすればc0であろう。しかし、上述のステートメントをaTypeがメソッドで受け入れられるかを事前条件として表明しているか、もしくはバリデーションチェックしていないかぎり、上述のステートメントのテストは不完全である。同様に、excptionやassertのテストも従来のステートメントによるカバレッジでは、不完全である。
それでもカバレッジを信奉しますか。