有没有办法在其内部过程(.p 文件)中使用过程(.p 文件)的变量?
3 回答
像这样?
define variable i as integer no-undo. /* a variable in the main procedure */
procedure internalProcedure:
message "Internal Procedure (a):" i.
i = 13.
message "Internal Procedure (b):" i.
end.
/* main block
*/
i = 1.
message "Main procedure (a):" i.
run internalProcedure.
message "Main procedure (b):" i.
更困难的问题可能是:“是否有办法阻止在内部过程中使用全局范围的变量”?
实际问题似乎是:“我有许多调用公共过程的过程。在一种特殊情况下,我需要让公共过程在调用过程中设置一个特殊值,但我不能修改所有其他过程。”
简单但在架构上令人反感的解决方案是使用全局共享变量。
许多人会告诉你,这是一种糟糕的编码技术。他们是对的。但是您并不是在寻求有关最佳实践的建议。
只需在调用者和被调用者中创建这样一个变量。不需要它的程序不会错过它。
您的“正常”程序之一:
/* 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 调用。
还有其他更复杂的方法可以做到这一点,但它们都归结为同一个问题——你正在为你的“特殊”程序和现在不再通用的“通用”程序之间的一些非常丑陋的耦合创建基础。
你是这个意思吗?
在这里,我们有一个名为 ShowTime.p 的通用 .p 文件,其他 .p 文件将运行该文件。您希望它对其中一个 .p 文件以某种方式运行,而对其他文件则以不同的方式运行。为此,我们定义了一个参数。在此示例中,它是一个 LOGICAL 参数,因此该值可以是 YES 或 NO。如您所见,如果 lShowDate 参数为 NO,ShowTime 过程将显示 TIME,如果 lShowDate 参数为 YES,它将显示 DATE。
/* ShowTime.p */
DEFINE INPUT PARAMETER lShowDate AS LOGICAL.
IF lShowDate = NO THEN
MESSAGE STRING(TIME,"HH:MM:SS").
ELSE
MESSAGE STRING(TODAY,"9999/99/99").
这是您的五个不相关的 .p 文件之一。它运行 ShowTime.p 过程,向它传递一个 NO 参数,因此 ShowTime 将显示 TIME。
/* p1.p */
MESSAGE "P File 1".
RUN ShowTime(INPUT NO) NO-ERROR.
另一个,为什么不呢?
/* p2.p */
MESSAGE "P File 2".
RUN ShowTime(INPUT NO) NO-ERROR.
此 .p 文件正在运行 ShowTime,并将 lShowDate 参数设置为 YES,这意味着 ShowTime 过程在此过程中的行为将有所不同,通过显示 DATE 而不是 TIME。
/* p5.p */
MESSAGE "P File 5".
RUN ShowTime(INPUT YES) NO-ERROR.
所以基本上你所拥有的是一个程序,ShowTime,它可以做两件事之一。运行这个过程的不相关过程可以通过传递一个参数来告诉它它想要什么。
就您的问题而言:有五个彼此不相关的程序(p1.p,p2.p ... p5.p),共享一个程序(ShowTime.p文件)。共享过程用一个参数进行了修改,因此它只能对一个调用过程(带有 YES 参数的那个)产生影响,而不影响其他四个(带有 NO 参数的那个)。
但是如果你不能改变五个不相关的过程运行共享过程的方式,如果你只能改变共享过程,你就必须对参数以外的东西做出决定。那这个呢:
/* DoThing.p */
IF SOURCE-PROCEDURE:NAME = "p5.p" THEN
MESSAGE "Do one thing".
ELSE
MESSAGE "Do something else".
这将对五个过程之一做一件事,而对其他四个做另一件事。