【发布时间】:2012-04-23 15:09:14
【问题描述】:
我正在开发 4gl,我是一名新手程序员。我正在处理一种情况,其中有 五个程序(.p 文件),它们彼此不相关,共享一个 单个程序(.p 文件)。 p 文件).
我的问题是我需要修改共享过程,这应该只影响一个调用过程,而不是其他四个。有什么方法可以同时链接这两个程序,防止影响其他四个程序。
请帮我解决这个问题。如果不清楚,对不起
【问题讨论】:
标签: progress-4gl
我正在开发 4gl,我是一名新手程序员。我正在处理一种情况,其中有 五个程序(.p 文件),它们彼此不相关,共享一个 单个程序(.p 文件)。 p 文件).
我的问题是我需要修改共享过程,这应该只影响一个调用过程,而不是其他四个。有什么方法可以同时链接这两个程序,防止影响其他四个程序。
请帮我解决这个问题。如果不清楚,对不起
【问题讨论】:
标签: progress-4gl
简单但架构上令人反感的解决方案是使用全局共享变量。
很多人会告诉你这是一种糟糕的编码技术。他们是对的。但是您并不是在寻求有关最佳实践的建议。
只需在调用者和被调用者中创建这样一个变量。不需要的程序不会错过。
你的“正常”程序之一:
/* 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 版本,您可以将逻辑移动到类而不是过程。在类中你可以使用重载
【讨论】: