Essa ideia simplesmente equivale a um método "Self_Test" dentro do contexto de um projeto baseado em objeto ou orientado a objeto. Se estiver usando uma linguagem baseada em objetos compilada como Ada, todo o código de autoteste será marcado pelo compilador como não utilizado (nunca invocado) durante a compilação de produção e, portanto, tudo será otimizado - nada disso aparecerá no executável resultante.
Usar um método "Self_Test" é uma ótima idéia, e se os programadores estivessem realmente preocupados com a qualidade, todos estariam fazendo isso. Uma questão importante, no entanto, é que o método "Self_Test" precisa ter disciplina intensa, pois não pode acessar nenhum dos detalhes da implementação e deve, em vez disso, confiar apenas em todos os outros métodos publicados dentro da especificação do objeto. Obviamente, se o autoteste falhar, a implementação precisará ser alterada. O autoteste deve testar rigorosamente todas as propriedades publicadas dos métodos do objeto, mas nunca confiar de maneira alguma em detalhes de qualquer implementação específica.
Linguagens orientadas a objetos e orientadas a objetos frequentemente fornecem exatamente esse tipo de disciplina com relação a métodos externos ao objeto testado (eles reforçam a especificação do objeto, impedindo qualquer acesso aos detalhes de sua implementação e gerando um erro de compilação se tentativa é detectada). Mas todos os métodos internos do objeto recebem acesso completo a todos os detalhes da implementação. Portanto, o método de autoteste está em uma situação única: ele precisa ser um método interno devido à sua natureza (o autoteste é obviamente um método do objeto testado), mas ele precisa receber toda a disciplina de compilador de um método externo ( tem que ser independente dos detalhes de implementação do objeto). Poucas se qualquer linguagem de programação fornece a capacidade de disciplinar o método interno de um objeto como se fosse um método externo. Então, esse é um importante problema de design de linguagem de programação.
Na falta de suporte adequado à linguagem de programação, a melhor maneira de fazer isso é criar um objeto complementar. Em outras palavras, para cada objeto que você codifica (vamos chamá-lo de "Big_Object"), você também cria um segundo objeto complementar cujo nome consiste em um sufixo padrão concatenado com o nome do objeto "real" (nesse caso, "Big_Object_Self_Test" "), e cuja especificação consiste em um único método (" Big_Object_Self_Test.Self_Test (This_Big_Object: Big_Object) retorna Boolean; "). O objeto complementar dependerá da especificação do objeto principal, e o compilador aplicará completamente toda a disciplina dessa especificação na implementação do objeto complementar.