隐藏的数据依赖是个坏主意。程序员将“纯函数”视为一件好事是有原因的。也许不是在所有情况下,也不是不惜一切代价,但当其他因素不受影响时,最好是这样。
https://en.wikipedia.org/wiki/Pure_function
所以,Mark 是正确的,如果有什么东西会影响您的过程逻辑 - 那么最好通过成为显式函数参数来显式记录它。 除非你的明确目标是创建一个隐藏的后门。
然而,这意味着该过程的所有“客户端”,所有可以调用它的位置,也应该更改,并且应该在开发期间和客户端升级期间协同完成部署站点。这可能很复杂。
所以我宁愿建议创建一个新过程并将所有实际逻辑移入其中。
https://en.wikipedia.org/wiki/Adapter_pattern
假设你有一些
create procedure old_proc(param1 type1, param2 type2, param3 type3) as
begin
....some real work and logic here....
end;
把它变成类似的东西
create procedure new_proc(param1 type1, param2 type2, param3 type3,
new_param smallint not null = 0) as
begin
....some real work and logic here....
....using new parameter for behavior fine-tuning...
end;
create procedure old_proc(param1 type1, param2 type2, param3 type3) as
begin
execute procedure new_proc(param1, param2, param3)
end;
...然后您明确地进行“一个特定过程”调用new_proc(...., 1)。然后逐渐地,一个接一个地,您会将所有程序从调用old_proc 转移到调用new_proc,最终当所有依赖项都转移到新的API 时,您将停用old_proc。
还有一个选项可以传递“隐藏的后门参数”——即上下文变量,在 Firebird 2.0 中引入
https://www.firebirdsql.org/rlsnotesh/rlsnotes20.html#dml-dsql-context
然后你的被调用者会这样检查
.....normal execution
if ( rdb$get_context('USER_TRANSACTION','my_caller') is not null) THEN BEGIN
....new behavior...
end;
但是,您必须在调用之前进行“一个特定的过程”以正确设置此变量(这很乏味但并不难)并在调用后正确删除它(这应该被正确地框起来,即使在任何错误/异常的情况下,这也很乏味且不容易)。