akon2.00βのよっぱらいの戯言

色しょく是食、食しょく是色 当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

C0の神話

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のテストも従来のステートメントによるカバレッジでは、不完全である。
それでもカバレッジを信奉しますか。