我考虑这个问题已有一段时间了,我很想征询其他开发人员的意见。
我倾向于具有非常防御性的编程风格。我典型的块或方法如下所示:
T foo(par1, par2, par3, ...)
{
// Check that all parameters are correct, return undefined (null)
// or throw exception if this is not the case.
// Compute and (possibly) return result.
}
另外,在计算过程中,我在取消引用所有指针之前先检查它们。我的想法是,如果存在某些错误,并且某些地方应该出现一些NULL指针,则我的程序应该很好地处理此问题,并且只是拒绝继续进行计算。当然,它可以通过日志或其他机制中的错误消息来通知问题。
换句话说,我的方法是
if all input is OK --> compute result
else --> do not compute result, notify problem
其他开发人员(其中包括我的一些同事)使用另一种策略。例如,它们不检查指针。他们认为应该为一段代码提供正确的输入,并且如果输入错误,则不应对发生的任何事情负责。另外,如果NULL指针异常使程序崩溃,则在测试过程中更容易发现错误,并且更有可能被修复。
我对这个问题的回答通常是:但是,如果在测试过程中未发现该错误,而该错误已在客户已经使用该产品时出现,该怎么办?bug表现出来的首选方式是什么?它应该是没有执行特定操作但仍可以继续工作的程序,还是崩溃并需要重新启动的程序?
总结
您会建议使用以下两种方法处理错误输入吗?
Inconsistent input --> no action + notification
要么
Inconsistent input --> undefined behaviour or crash
编辑
感谢您的回答和建议。我也很喜欢合同设计。但是,即使我相信写过调用我的方法的代码的人(也许是我自己),仍然可能存在错误,导致输入错误。所以我的方法是永远不要假设方法传递了正确的输入。
另外,我将使用一种机制来捕获问题并进行通知。在开发系统上,它将例如打开一个对话框来通知用户。在生产系统中,它只会将一些信息写入日志。我认为额外的检查不会导致性能问题。我不确定断言是否足够,是否在生产系统中将其关闭:也许生产中会发生某些情况,而这种情况在测试期间没有发生。
无论如何,令我感到非常惊讶的是,许多人采用了相反的方法:他们让应用程序“故意”崩溃,因为他们坚持认为这将使测试过程中更容易发现错误。