首页 > 解决方案 > 什么是回调“难以阅读且难以推理”

问题描述

在文章“多线程和回调部分是什么意思?

大量使用回调的代码会变得难以阅读和推理。

多线程和回调入门

标签: multithreadingcallback

解决方案


(这可能是基于意见的,但是......):

1) 难以阅读:人们通常按顺序阅读,无论是散文、校样还是代码。重新安排故事的实验并没有提高阅读理解能力。在代码中,这是:

while condition is not true
    wait for event
perform condition handling

on event do event_handler
....
event_handler:
    if condition is true
        perform condition handling

尽管后一个习语的历史包括 FORTRAN、PL/1、BASIC 和 UNIX 信号。我敢肯定,如果你问得好,谷歌会提供无数关于认知的理论。

2) 更难推理:在这里,推理假设机械工具。在上面的前一个示例中,条件的处理是在等待它的参与者(线程、进程……)的上下文中执行的。该参与者可能携带用于处理条件的重要上下文,例如锁和异常处理程序。例如,假设处理条件的代码可能引发异常。设置处理程序的同一演员是否一定是处理它的演员?在像 libdispatch 这样的系统中,情况并非如此,但有时确实如此。您的测试是否涵盖了这两种可能性?

如果不对调度事件的机制和事件处理代码进行深入的反思,就很难确定哪些依赖关系流过该调度边界。如果无法访问所有应用程序、框架、操作系统甚至编译器源,这可能是不可能的。也许这是一个很好的开源广告。

但是......这些适用于传统的顺序程序(FORTRAN 的 1000 行)。如果您构建的程序符合形式结构,例如状态机或下推自动机,您可以在形式语言(例如 yacc)中指定您的程序。这使得它更容易理解和推理。

我不会从字面上建议 yacc。但是任何正式的系统都会坚持管理状态机,因此您的程序将完全作为一组在实现转换时调用的标注而存在。


推荐阅读