Tips

エラーを起こさないコードを記述するためにアサーションを活用する

日付2009/07/10
ID75814 (英語原文参照)
バージョン11
プラットフォームMac & Win

エラーを起こさないコードを記述するために、表明(アサーション)と呼ばれる技法を応用することができます。アサーションは、C、C++、Javaなどのプログラミング言語でしばしば用いられ、プログラムの前提条件を試すために使用されるものです。たとえば、ある物質の移動速度を計算するプログラムの場合、その移動速度は光速以下であることが計算の前提条件になるかもしれません。

それぞれのアサーションは、そのプログラムが実行されるためにTrueであるべきブール式の形を取ります。Trueでない場合、プログラムはエラーを投げ返します。ブール式がすべてTrueであることにより、プログラムの動作に関する前提条件が満たされていることが確認でき、したがってプログラムがエラーが返さずに実行できるという信頼性が高まります。

アサーションは、バグを検出し、修正する上で非常に効果的であることが経験により実証されてきました。加えてアサーションは、そのプログラムの内部構造をドキュメント化することにもなり、結果としてプログラムの保守性も高まります。

他のプログラミング言語では、アサーションはマクロに形を取るのが一般的です。assertのようなランゲージマクロは、ソースコードに記述され、コンパイルの際、プラグマディレクティブに応じて、アサーションコードが実行ファイルに組み込まれたりします。このようなランゲージの拡張、マクロ、プラグマディレクティブは4Dランゲージの一部ではありません。

とはいえ、似たようなことはできます。下記のAssertメソッドは、4Dアプリケーションがコンパイルされているかどうかを調べます。コンパイルされていれば、Trueが返されます。この場合の前提条件とは、インタプリタモードでメソッドがじゅうぶん検証されているということです。

Assertメソッドは、ブール式を受け取り、その真偽を表明します。式がTrueであれば、割り込まれることなく処理を継続します。Falseであれば、実行を停止し、関係するメソッドの名前と第三引数で受け取ったメッセージをアラート表示します。Shiftキーを押しながらアラートを閉じれば、デバッガを起動することもできます。

Assertの用法は次のとおりです。Assert($Condition;$CallingMethod;$AlertMsg)

たとえばこのように使用します。

If (Assert ($Divider#0;$MethodName_T;"Divide by zero condition!"))
  `Do Something
end if

Assertのコードは下記のとおりです。

C_BOOLEAN($0;$Condition;$1)
C_TEXT($Caller;$2)
C_TEXT($AlertMsg;$3)

If (Is compiled mode)
  `If compiled the assumption is the calling method has already passed this test
  $0:=True
Else 
  If (Count parameters#3)
    ALERT(Current method name+": Assert called with incorrect # of parameters (3).")
    $Condition:=False
  Else 
    $Condition:=$1
    If (Not($Condition))
      $Caller:=$2
      $AlertMsg:=$3
      ALERT($Caller+": "+$AlertMsg)

      If(Shift down)
        Trace
      End if
    End if 
  End if 

  $0:=$Condition

End if