Há uma discussão em comp.lang.c ++. Moderada sobre se as asserções, que em C ++ existem apenas em construções de depuração por padrão, devem ser mantidas no código de produção ou não.
Obviamente, cada projeto é único, portanto, minha pergunta aqui não é tanto se as afirmações devem ser mantidas, mas , nesses casos, isso é recomendável / não é uma boa idéia.
Por afirmação, quero dizer:
- Uma verificação em tempo de execução que testa uma condição que, quando falsa, revela um bug no software.
- Um mecanismo pelo qual o programa é interrompido (talvez após um trabalho de limpeza realmente mínimo).
Eu não estou necessariamente falando sobre C ou C ++.
Minha opinião é que, se você é programador, mas não possui os dados (que é o caso da maioria dos aplicativos comerciais para desktop), você deve mantê-los, porque uma asserção falha mostra um erro e você não deve ir com um bug, com o risco de corromper os dados do usuário. Isso força você a testar fortemente antes de enviar, e torna os bugs mais visíveis, facilitando assim a localização e a correção.
Qual a sua opinião / experiência?
Felicidades,
Carl
Veja a pergunta relacionada aqui
Respostas e atualizações
Hey Graham,
Uma afirmação é erro, pura e simples e, portanto, deve ser tratada como uma. Como um erro deve ser tratado no modo de liberação, você realmente não precisa de asserções.
É por isso que prefiro a palavra "bug" ao falar sobre afirmações. Isso torna as coisas muito mais claras. Para mim, a palavra "erro" é muito vaga. Um arquivo ausente é um erro, não um bug, e o programa deve lidar com isso. Tentar desreferenciar um ponteiro nulo é um bug, e o programa deve reconhecer que algo cheira a queijo ruim.
Portanto, você deve testar o ponteiro com uma asserção, mas a presença do arquivo com o código de tratamento de erros normal.
Ligeiro fora do tópico, mas um ponto importante na discussão.
Como aviso, se suas afirmações entrarem no depurador quando falharem, por que não? Mas existem muitas razões pelas quais um arquivo não pode estar completamente fora do controle do seu código: direitos de leitura / gravação, disco cheio, dispositivo USB desconectado etc. etc. Como você não tem controle sobre isso, sinto que as afirmações são não é o caminho certo para lidar com isso.
Carl
Thomas,
Sim, tenho o Código Completo e devo dizer que discordo totalmente desse conselho em particular.
Digamos que seu alocador de memória personalizado estrague tudo e zere um pedaço de memória que ainda é usado por outro objeto. Por acaso zero um ponteiro que esse objeto desreferencia regularmente, e um dos invariantes é que esse ponteiro nunca é nulo, e você tem algumas afirmações para garantir que ele continue assim. O que você faz se o ponteiro de repente for nulo. Você apenas se () está em volta dele, esperando que funcione?
Lembre-se, estamos falando de código de produto aqui, portanto não há como entrar no depurador e inspecionar o estado local. Este é um bug real na máquina do usuário.
Carl