multithreading - 什么是回调“难以阅读且难以推理”
解决方案
(这可能是基于意见的,但是......):
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。但是任何正式的系统都会坚持管理状态机,因此您的程序将完全作为一组在实现转换时调用的标注而存在。
推荐阅读
- matlab - 如何在 Matlab 中过滤特定阈值内的数据?
- sql - SQL Server - 远程 Oracle 查询在日期子句上非常慢
- swift - UITableviewcell 没有出队并被不同部分中相同索引的单元格复制
- r - 无法使用 read_excel
- objective-c - 在 Xcode 11.1 中编译时的照片框架错误
- spring-cloud - 关于开发spring-cloud-sdk,汇聚所有开发依赖的问题
- r - 调用函数没有被执行
- spring-boot - 需要 LoggersMvcEndpoint 的匹配类。在 spring-boot 2.1.9 版本中
- r - 调整条形图中点的位置
- apache - Apache 服务器不会在 MAMP 上启动