我正在开发 4gl,我是一名新手程序员。我正在处理一种情况,其中有五个彼此不相关的过程(.p 文件),共享一个过程(.p 文件)。
我的问题是我需要修改共享过程,这应该只对一个调用过程产生影响,而不对其他四个产生影响。我可以同时链接这两个程序的方法是什么,以防止对其他四个程序产生影响。
请帮我解决这个问题。如果不清楚,对不起
我正在开发 4gl,我是一名新手程序员。我正在处理一种情况,其中有五个彼此不相关的过程(.p 文件),共享一个过程(.p 文件)。
我的问题是我需要修改共享过程,这应该只对一个调用过程产生影响,而不对其他四个产生影响。我可以同时链接这两个程序的方法是什么,以防止对其他四个程序产生影响。
请帮我解决这个问题。如果不清楚,对不起
简单但在架构上令人反感的解决方案是使用全局共享变量。
许多人会告诉你,这是一种糟糕的编码技术。他们是对的。但是您并不是在寻求有关最佳实践的建议。
只需在调用者和被调用者中创建这样一个变量。不需要它的程序不会错过它。
您的“正常”程序之一:
/* p1.p */
message "p1, I'm normal.".
run common.p.
您的“特殊”计划:
/* p2.p */
define new global shared variable special as character no-undo.
message "p2, I'm special!".
run common.p.
message "special = " special.
通用程序:
/* common.p */
define new global shared variable special as character no-undo.
message "common stuff...".
if program-name(2) = "p2.p" then special = "special value".
return.
您可以根据需要多次定义 NEW GLOBAL SHARED 变量,并且您只会获得一份副本。“新”不会覆盖任何现有变量(如果您忽略 GLOBAL,它的行为会有所不同)。
您没有要求它,也许您不需要它,但程序名称(2)检查会查看调用堆栈以查看 common.p 是否被 p2.p 调用。
还有其他更复杂的方法可以做到这一点,但它们都归结为同一个问题——你正在为你的“特殊”程序和现在不再通用的“通用”程序之间的一些非常丑陋的耦合创建基础。
最好的方法是在共享过程中添加一个“标志”,然后在您需要不同的行为时传递一个标志。您不想更改共享过程,因此它需要知道哪个程序正在调用它。
可选的
根据您的 OpenEdge 版本,您可以将逻辑移动到类而不是过程。在课堂上你可以使用重载