You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

导入第三方模块是否为纯操作?有无语言无关的纯实现方式?

关于纯操作的两个问题解答

一、导入模块是否属于非纯操作?

得看具体场景和语言的导入机制,但绝大多数情况下,导入模块都算不上纯操作,原因很直接:

  • 很多语言的导入过程会执行模块的顶层代码,比如Python、JavaScript里,导入时会运行模块里的全局代码,如果这些代码包含文件读写、网络请求、修改全局变量、打印输出这类操作,就会产生副作用,直接打破纯操作“无副作用”的要求;
  • 就算模块顶层没写显式的副作用代码,导入也可能依赖外部可变状态:比如模块版本更新、系统环境变量变动、依赖库出现新改动,都可能让同一导入操作在不同环境下拿到的结果(比如模块提供的函数行为)不一样,违反纯操作“相同输入必出相同输出”的原则。

当然也有例外:比如在Haskell这类纯函数式语言里,如果导入的是只包含纯函数、没有任何IO操作或可变状态的模块,而且导入过程只做符号绑定、不执行任何带副作用的代码,这种导入可以算纯操作,但这类场景在实际开发里占比很低。

二、是否存在与编程语言无关的纯实现方式?

有,核心思路就是彻底隔离外部可变依赖,把所有需要的依赖都显式摆出来,具体可以这么做:

  • 放弃隐式的模块导入,改用显式依赖注入:不管用什么语言,把需要用到的功能(函数、数据结构)直接作为参数传给当前操作,而不是通过导入模块隐式获取。这样一来,操作的输入完全可控,不会受外部模块版本、环境变化的影响;
  • 严格卡准操作的边界:所有操作只依赖自身定义的纯逻辑,不读取任何外部环境(文件、网络、系统状态),也不修改外部状态。只要满足这两点,不管用什么语言实现,这个操作都是纯的。

举个简单例子:不用导入数学库的sqrt函数,而是把sqrt作为参数传给你的计算函数,这样你的计算函数不需要依赖外部模块,只要传入的sqrt是纯函数,整个计算过程就是纯的——这就是和语言无关的纯实现思路。

内容的提问来源于stack exchange,提问作者L Duran

火山引擎 最新活动