C++中为expression等解析函数添加Token_stream&引用参数的目的是什么
改动的核心作用与意义
这个修改本质是把解析函数对全局Token_stream对象ts的隐式依赖,替换为显式的引用参数传递,是典型的代码规范优化,解决了全局变量带来的诸多问题,具体收益如下:
- 代码逻辑更透明易读
未修改前的函数签名是double term(),仅看签名完全无法得知函数依赖了全局的ts对象,更不知道它会修改ts的读取状态。添加引用参数后,从double term(Token_stream& ts)的签名就能直观知道函数需要操作一个Token_stream实例,后续维护代码时不需要额外梳理隐藏的全局依赖,理解成本大幅降低。 - 复用性更强,适配更多场景
全局变量同一进程内只能存在一份实例,如果你需要同时解析多个输入流(比如同时处理两份表达式文件、并行计算多组用户输入的公式),全局版本的代码完全无法实现,要么多个流的解析逻辑互相干扰,要么需要反复重置全局状态,复杂度极高。改成参数传递后,每个输入流可以对应独立的Token_stream实例,分别传给解析函数即可,不需要修改函数内部的任何逻辑就能适配多流解析的需求。 - 消除全局变量的副作用风险
全局变量的状态可以被任意位置的代码修改,一旦其他业务逻辑不小心改动了ts的内部状态,解析函数的运行结果就会出错,这类由全局变量导致的bug定位难度非常高。改成显式传参后,只有主动传入的Token_stream实例会被函数修改,状态完全可控,出现问题很容易溯源。 - 单元测试更简单可靠
测试全局版本的解析函数时,每跑一个测试用例都需要先给全局ts赋值,跑完还要手动重置ts状态,很容易出现测试用例互相污染的情况,测试结果可信度低。改成参数传递后,每个测试用例直接构造专属的Token_stream实例传入即可,测试逻辑简单清晰,不会出现用例污染的问题。
内容的提问来源于stack exchange,提问作者jaylse2
相关产品推荐
相关产品推荐

