Sou um programador um tanto defensivo e um grande fã dos contratos de código da Microsofts.
Agora nem sempre posso usar C # e, na maioria dos idiomas, a única ferramenta que tenho são as asserções. Então, geralmente acabo com um código como este:
class
{
function()
{
checkInvariants();
assert(/* requirement */);
try
{
/* implementation */
}
catch(...)
{
assert(/* exceptional ensures */);
}
finally
{
assert(/* ensures */);
checkInvariants();
}
}
void checkInvariants()
{
assert(/* invariant */);
}
}
No entanto, esse paradigma (ou o que você chamaria) leva a muita confusão de código.
Comecei a me perguntar se realmente vale a pena o esforço e se o teste de unidade adequado já cobriria isso?