Vamos voltar e usar um exemplo diferente que calcula a média aritmética de uma matriz de valores.
Se a matriz de entrada estiver vazia (ou nula), você pode atender razoavelmente à solicitação do chamador? Não. Quais são suas opções? Bem, você poderia:
- presente / retornar / lançar um erro. usando a convenção da sua base de código para essa classe de erro.
- documento que um valor como zero será retornado
- documento que um valor inválido designado será retornado (por exemplo, NaN)
- documentar que um valor mágico será retornado (por exemplo, um mínimo ou um máximo para o tipo ou algum valor potencialmente indicativo)
- declarar o resultado não especificado
- declarar a ação indefinida
- etc.
Eu digo que dê a eles o erro se eles fornecerem uma entrada inválida e a solicitação não puder ser concluída. Quero dizer, um erro grave desde o primeiro dia, para que eles entendam os requisitos do seu programa. Afinal, sua função não está em posição de responder. Se a operação pode falhar (por exemplo, copiar um arquivo), então a sua API deve dar-lhes um erro eles podem lidar.
Portanto, isso pode definir como sua biblioteca lida com solicitações malformadas e solicitações que podem falhar.
É muito importante que o seu código seja consistente na maneira como lida com essas classes de erros.
A próxima categoria é decidir como sua biblioteca lida com solicitações sem sentido. Voltando a um exemplo semelhante à sua - vamos usar uma função que determina se um arquivo existe em um caminho: bool FileExistsAtPath(String)
. Se o cliente passa uma cadeia vazia, como você lida com esse cenário? Que tal uma matriz vazia ou nula passada para void SaveDocuments(Array<Document>)
? Decida sua biblioteca / base de código e seja consistente. Por acaso, considero esses erros de casos e proíbo os clientes de fazer solicitações sem sentido, sinalizando-os como erros (por meio de uma asserção). Algumas pessoas resistem fortemente a essa idéia / ação. Acho essa detecção de erro muito útil. É muito bom para localizar problemas em programas - com boa localidade para o programa ofensivo. Os programas são muito mais claros e corretos (considere a evolução da sua base de código) e não queimam ciclos em funções que não fazem nada. O código é menor / mais limpo dessa maneira, e as verificações geralmente são enviadas para os locais onde o problema pode ser introduzido.