为什么失败的快速风格节目比防守风格节目更短?

Zub*_*air 6 erlang defensive-programming fail-fast

我已经读过关于像Erlang这样的语言编程失败的程序如何最终使用比大多数其他语言中的防御风格更短的程序.这对所有类型的程序都是正确的,这是什么原因?

I G*_*ICE 10

快速失败的计划不一定比防御型计划短:它取决于实施和确保防御性密码安全所需的措施.

在Erlang的情况下,由于声明式样式以及VM如何确保为您生成错误案例,故障快速程序通常会更短.例如,在函数中:

day(1) -> sunday;
day(2) -> monday;
day(3) -> tuesday;
day(4) -> wednesday;
day(5) -> thursday;
day(6) -> friday;
day(7) -> saturday;
Run Code Online (Sandbox Code Playgroud)

传递给函数的任何意外值都将导致错误,可由另一个进程(即:一个主管)捕获和处理.这样的错误也永远不会危及整个系统,并且不需要将代码添加到函数本身 - 它们都是通过预定的行为在正常执行路径之外完成的.

在快速失败不是常态的动态语言中,您必须手动检查边界并自行抛出异常.那么你必须在本地捕获异常(顶级尝试...包括cat)如果你不希望整个系统崩溃.通常必须在整个正常执行路径中插入错误处理代码.

在一种静态语言中,快速失败不是常态,那么代码的长度将在很大程度上取决于您拥有的类型系统.如果语言允许定义边缘情况最终由编译器检查的类型,那么在非确定性事件(文件不工作,意外用户输入等)之外,您通常不必在代码内处理此类型.使用这种类型系统的语言,许多错误将在运行时被捕获,因此您将没有那么多的防御案例.

当无法避免错误处理时,支持快速成语(如Erlang)的语言将允许比不使用(静态或非静态)语言更清晰的代码,这主要是因为特殊情况的代码没有与理想执行路径的代码.


dsm*_*ith 5

参见Joe Armstrong 论文的第4.3和4.4节.