Volevo trovare una risposta solida alla domanda se disporre o meno di controlli di runtime per convalidare l'input allo scopo di garantire che un client si sia attenuto alla fine dell'accordo in fase di progettazione per contratto. Ad esempio, considera un semplice costruttore di classi:
class Foo
{
public:
Foo( BarHandle bar )
{
FooHandle handle = GetFooHandle( bar );
if( handle == NULL ) {
throw std::exception( "invalid FooHandle" );
}
}
};
In questo caso direi che un utente non dovrebbe tentare di costruire un Foo
senza un BarHandle
valido. Non sembra giusto verificare che bar
sia valido all'interno del costruttore di Foo
. Se mi limito a documentare che il costruttore di Foo
richiede un valido BarHandle
, non è abbastanza? È un modo corretto per far rispettare la mia condizione preliminare nella progettazione per contratto?
Finora, tutto ciò che ho letto ha opinioni contrastanti su questo. Sembra che il 50% delle persone direbbe che bar
è valido, l'altro 50% direbbe che non dovrei farlo, ad esempio consideri un caso in cui l'utente verifica che il BarHandle
sia corretto, ma un il secondo (e non necessario) controllo viene eseguito anche all'interno del costruttore di Foo
.