我读过有关像Erlang这样的语言中快速失败编程风格的文章,发现它们的程序比大多数其他语言中的防御式编程风格的程序要短得多。那么所有类型的程序都是如此吗?这样做的理由是什么?
我读过有关像Erlang这样的语言中快速失败编程风格的文章,发现它们的程序比大多数其他语言中的防御式编程风格的程序要短得多。那么所有类型的程序都是如此吗?这样做的理由是什么?
Fail-fast程序不一定比防御性编程风格的程序更短:这取决于实现和需要采取的措施来确保你的防御性代码的安全性。
对于Erlang,在声明式风格和虚拟机如何确保为您生成错误情况的情况下,故障快速的程序通常较短。例如在以下函数中:
day(1) -> sunday;
day(2) -> monday;
day(3) -> tuesday;
day(4) -> wednesday;
day(5) -> thursday;
day(6) -> friday;
day(7) -> saturday.
任何传递给该函数的意外值都会导致错误,可以由另一个进程(即:监督进程)捕获和处理。这些错误也永远不会危及整个系统,并且不需要将代码添加到函数本身中 - 它是通过预定行为在正常执行路径之外完成的。
在动态语言中,快速失败不是常规操作,您必须手动检查边界并自行抛出异常。然后,如果您不想使整个系统崩溃,就必须在本地捕获异常(包括顶层 try ... catch)。错误处理代码通常必须插入整个正常执行路径中。
在静态语言中,快速失败不是常规操作,您的代码长度将高度取决于您的类型系统。如果语言允许定义类型,其中边界情况最终由编译器检查,则通常无需在代码内部处理此问题,除了非确定性事件(文件不起作用,意外用户输入等)外。在具有此类类型系统的语言中,许多错误将在运行时之前被捕获,因此您不必进行太多的防御性编程。
当无法避免错误处理时,支持快速失败惯用语的语言(例如Erlang)将允许比不支持的语言(静态或动态)更清晰的代码,主要是因为特殊情况的代码与理想执行路径的代码不混合。快速失败编程风格注重代码可读性和调试。用户体验是次要目标:用户可能会遇到奇怪的错误消息或程序故障,但更高质量的代码使程序员能够轻松找到错误并纠正问题。
相反,防御式编程侧重于验证来自用户和其他代码部分的输入。代码更冗长,因为程序员必须仔细验证输入,并在出现错误时优雅地失败。这导致了更多的代码(从程序员的角度)和更强大的应用程序(从用户的角度)。