我已经读到过像Erlang这样的语言编程失败的程序如何比大多数其他语言中的防御风格更短的程序。这对所有类型的程序都是正确的,这是什么原因?
答案 0 :(得分:10)
快速失败的计划不一定比防御式计划更短:它取决于实施以及使您的防御性密码安全所需的措施。
对于Erlang,由于声明式样式以及VM如何确保为您生成错误案例,故障快速程序通常会更短。例如,在函数中:
day(1) -> sunday;
day(2) -> monday;
day(3) -> tuesday;
day(4) -> wednesday;
day(5) -> thursday;
day(6) -> friday;
day(7) -> saturday;
传递给函数的任何意外值都将导致错误,可由另一个进程(即:主管)捕获和处理。这样的错误也永远不会危及整个系统,并且不需要将代码添加到函数本身 - 它们都是通过预定的行为在正常执行路径之外完成的。
在动态语言中,快速失败不是常态,您必须手动检查边界并自行抛出异常。那么你必须在本地捕获异常(顶级尝试...包括cat)如果你不希望整个系统崩溃。通常必须在整个正常执行路径中插入错误处理代码。
在一种静态语言中,快速失败不是常态,那么代码的长度将在很大程度上取决于您拥有的类型系统。如果语言允许定义边缘情况最终由编译器检查的类型,那么在非确定性事件(文件不工作,意外用户输入等)之外,您通常不必在代码内处理此类型。使用这种类型系统的语言,许多错误将在运行时被捕获,因此您将没有那么多的防御案例。
当无法避免错误处理时,支持快速成语(如Erlang)的语言将允许比不使用(静态或非静态)语言更清晰的代码,主要是因为特殊情况的代码不是与理想执行路径的代码混合在一起。
答案 1 :(得分:5)
参见Joe Armstrong thesis的第4.3和4.4节。
答案 2 :(得分:-4)
快速失败的编程风格专注于更好的代码可读性和调试。用户体验是次要目标:用户可能会遇到奇怪的错误消息或程序失败,但更高质量的代码允许程序员轻松找到错误并纠正问题。
相反,防御式编程侧重于来自用户和代码的其他部分的验证输入。代码更冗长,因为程序员必须仔细验证输入并在出错时优雅地失败。这导致更多代码(从程序员的角度来看)和更强大的应用程序(从用户的角度来看)。