【问题标题】:Progress 4gl - shared proceduresProgress 4gl - 共享程序
【发布时间】:2012-04-23 15:09:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: progress-4gl


    【解决方案1】:

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

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

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

    你的“正常”程序之一:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我能理解你的意思。我的疑问是 如何将标志值从调用过程传递给共享过程
      • 向过程的 API 添加另一个变量。
      【解决方案3】:
      • 将过程的所有逻辑移至具有输入的新逻辑 参数。
      • 从原始 .p 调用该过程
      • 从需要额外参数的过程中调用新过程。

      可选

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 2021-02-20
        相关资源
        最近更新 更多