0

我正在开发 4gl,我是一名新手程序员。我正在处理一种情况,其中有五个彼此不相关的过程(.p 文件),共享一个过程(.p 文件)

我的问题是我需要修改共享过程,这应该只对一个调用过程产生影响,而不对其他四个产生影响。我可以同时链接这两个程序的方法是什么,以防止对其他四个程序产生影响。

请帮我解决这个问题。如果不清楚,对不起

4

3 回答 3

2

简单但在架构上令人反感的解决方案是使用全局共享变量。

许多人会告诉你,这是一种糟糕的编码技术。他们是对的。但是您并不是在寻求有关最佳实践的建议。

只需在调用者和被调用者中创建这样一个变量。不需要它的程序不会错过它。

您的“正常”程序之一:

/* 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 调用。

还有其他更复杂的方法可以做到这一点,但它们都归结为同一个问题——你正在为你的“特殊”程序和现在不再通用的“通用”程序之间的一些非常丑陋的耦合创建基础。

于 2012-04-24T11:27:12.683 回答
0

最好的方法是在共享过程中添加一个“标志”,然后在您需要不同的行为时传递一个标志。您不想更改共享过程,因此它需要知道哪个程序正在调用它。

于 2012-04-23T17:16:43.717 回答
0
  • 将过程的所有逻辑移至具有输入参数的新逻辑。
  • 从原始 .p 调用该过程
  • 从需要额外参数的过程中调用新过程。

可选的

  • 逐渐将 original.p 的所有运行替换为 new.p
  • 一旦您确定所有运行都已更改,请删除 original.p。

根据您的 OpenEdge 版本,您可以将逻辑移动到类而不是过程。在课堂上你可以使用重载

于 2013-08-21T05:52:06.533 回答