Deterministic Core, Non-Deterministic Shell
4 hours ago
- 函数式核心,命令式外壳将纯粹的业务逻辑(核心)与IO和副作用(外壳)分离,提高了可测试性。
- 核心是确定性的:相同的输入总是产生相同的输出,这使得无需模拟即可轻松测试。
- 确定性核心,非确定性外壳通过关注确定性而非仅仅是纯粹性来扩展这一原则,允许命令式代码如果是确定性的。
- 非确定性行为(例如,随机数生成器、异步、网络、数据库、日期)应隔离在外壳中,而不是核心中。
- 通过“去碎片化确定性”可以改进现有代码库:即使没有完全重构,也要找到并分组确定性部分。
- 每个混乱的代码库可能隐藏着确定性的状态机,这些状态机可以被提取出来,以便更容易地测试和修改。
- 使用实用策略:拆分函数,提升非确定性,并将结果作为参数注入。