このアイデアは、オブジェクトベースまたはオブジェクト指向のデザインのコンテキスト内での「Self_Test」メソッドに相当します。Adaのようなコンパイルされたオブジェクトベースの言語を使用している場合、すべてのセルフテストコードは、プロダクションコンパイル中にコンパイラによって未使用(呼び出されない)としてマークされるため、すべて最適化されます-いずれにも表示されません結果の実行可能ファイル。
「Self_Test」メソッドを使用することは非常に良い考えであり、プログラマーが本当に品質に関心があるなら、彼らは皆それをやっているでしょう。ただし、重要な問題の1つは、「Self_Test」メソッドは実装の詳細にアクセスできず、代わりにオブジェクトの仕様内で公開されている他のすべてのメソッドのみに依存しなければならないという点で、厳格な訓練が必要なことです。明らかに、自己テストが失敗した場合、実装を変更する必要があります。セルフテストは、オブジェクトのメソッドの公開されたすべてのプロパティを厳密にテストする必要がありますが、特定の実装の詳細に決して依存しないでください。
オブジェクトベース言語とオブジェクト指向言語は、テスト対象オブジェクトの外部のメソッドに関してその種の規律を頻繁に提供します(オブジェクトの仕様を強制し、実装の詳細へのアクセスを防ぎ、そのような試みが検出された場合はコンパイルエラーを発生させます) )。ただし、オブジェクト自体の内部メソッドには、すべての実装の詳細への完全なアクセス権が与えられます。そのため、セルフテストメソッドは固有の状況にあります。その性質上、内部メソッドである必要があります(セルフテストは明らかにテスト対象のオブジェクトのメソッドです)が、外部メソッドのすべてのコンパイラー規則を受け取る必要があります(オブジェクトの実装の詳細から独立している必要があります)。プログラミング言語がオブジェクトを統制する機能を提供している場合はほとんどありません」■外部メソッドであるかのように内部メソッド。したがって、これはプログラミング言語の重要な設計上の問題です。
適切なプログラミング言語のサポートがない場合、最適な方法は、コンパニオンオブジェクトを作成することです。つまり、コーディングするすべてのオブジェクト(「Big_Object」と呼びます)に対して、2番目のコンパニオンオブジェクトも作成します。その名前は、「実際の」オブジェクト(この場合は「Big_Object_Self_Test」)の名前と連結した標準接尾辞で構成されます")、およびその仕様が単一のメソッドで構成されている(" Big_Object_Self_Test.Self_Test(This_Big_Object:Big_Object)return Boolean; ")。コンパニオンオブジェクトはメインオブジェクトの仕様に依存し、コンパイラはコンパニオンオブジェクトの実装に対してその仕様のすべての規則を完全に実施します。