He estado buscando una respuesta sólida a la pregunta de si se deben realizar o no verificaciones de tiempo de ejecución para validar las entradas con el fin de garantizar que un cliente se haya apegado a su final del acuerdo en el diseño por contrato. Por ejemplo, considere un constructor de clase simple:
class Foo
{
public:
Foo( BarHandle bar )
{
FooHandle handle = GetFooHandle( bar );
if( handle == NULL ) {
throw std::exception( "invalid FooHandle" );
}
}
};
Yo diría en este caso que un usuario no debe intentar construir un Foo
sin un válido BarHandle
. No parece correcto verificar que bar
sea válido dentro del Foo
constructor. Si simplemente documento que Foo
el constructor requiere un válido BarHandle
, ¿no es suficiente? ¿Es esta una forma adecuada de hacer cumplir mi condición previa en el diseño por contrato?
Hasta ahora, todo lo que he leído tiene opiniones encontradas sobre esto. Parece que el 50% de las personas diría que verifica que bar
es válido, el otro 50% diría que no debería hacerlo, por ejemplo, considere un caso en el que el usuario verifique que BarHandle
es correcto, pero una segunda verificación (e innecesaria) también se está haciendo dentro del Foo
constructor de.