Eu ficaria tão defensivo quanto você precisa. Um pouco ambíguo, acho que sim, mas tentarei explicar.
Quando você corrige um método, se esse método possui parâmetros de entrada, é necessário tomar uma decisão sobre o que você espera que esses parâmetros sejam. Em situações e lugares dentro de um aplicativo, isso será diferente. Por exemplo, se um método ou parte do código estiver aceitando dados de uma entrada do usuário, você deverá cobrir toda a base do código e manipular qualquer entrada adequadamente, seja por meio de uma mensagem de erro ou de uma maneira agradável de exibir dados inaceitáveis.
Se o método for uma API exposta, é o mesmo. Você não pode controlar o que está chegando, portanto, tente cobrir todos os aspectos e programar adequadamente.
Para métodos produzidos no mecanismo principal do seu projeto, aqui você tem que tomar uma decisão. Suponho que os dados que estão chegando foram pré-selecionados e validados antes de chegarem ou devo fazer as verificações necessárias. Eu acho que isso depende do nível conceitual do método e se esse é um local aceitável para verificar. Então, as coisas que posso considerar é:
1) Esse é o único local em que preciso fazer essa verificação? Essa variável precisará ser verificada em vários locais diferentes para essa condição. Nesse caso, posso fazer a verificação uma vez mais acima na cadeia e assumir a validade depois
2) Outros componentes do sistema devem funcionar com os métodos e interfaces que escrevo. Nesse caso, você pode controlar através de instruções de declaração de depuração, exceções de depuração, comentários de método e arquitetura geral do sistema o resultado que você precisa ou os dados precisam de verificações.
3) Quais são os resultados da falha neste momento do código. Isso fará com que a coisa toda falhe? Algum erro será detectado em outro lugar e será, pelo menos, detectado.
4) Faz sentido colocar um cheque aqui? Às vezes, verificar um dado possível de dados corrompidos, embora ajude a resolver o problema naquele momento e não a erros, pode ajudar a encobri-lo. Nesse ponto, você pode passar horas perseguindo um problema diferente apenas para descobrir que o problema real foi devido a uma verificação válida dos dados que estão na cadeia de eventos que estavam em cascata com a que o usuário / desenvolvedor foi relatado.
Em geral, sou um programador defensivo, no entanto, também acredito que, com o TDD completo e os testes de unidade apropriados, você pode fazer as verificações no código nos níveis exigidos e ter certeza de que está funcionando como deveria quando chega a qualquer seção de nível inferior .