吾爱光设

 找回密码
 注册
会员须知
会员须知
实用帮助
实用帮助
查看: 5510|回复: 0

RP 系列 | 命名空间:避免名称冲突的一种好方法

[复制链接]
  • TA的每日心情
    奋斗
    2022-4-11 09:15
  • 签到天数: 38 天

    [LV.5]常住居民I

    542

    主题

    140

    回帖

    6

    积分

    小白

    积分
    6
    发表于 2021-6-9 17:00 | 显示全部楼层 |阅读模式
    在某些情况下,脚本中的名称冲突会导致一些尴尬的问题,而命名空间的理论可以为这些问题提供强大的解决方案。意识到这一点,我们为我们的软件产品RP Fiber Power,RP Resonator,RP Coating RP ProPulse完善了命名空间的解决方案。
    在本文中,我们将以一个典型示例向您展示问题所在以及使用命名空间的解决方案的工作原理。因此,即使对于使用其他提供命名空间的编程语言的人来说,它也可能是令人感兴趣的。例如 C ++; 尽管语法略有不同,但总体思路是相同的。您知道,这些概念通常以非常抽象的方式进行解释。现实生活中的一个很好的例子可能会很有帮助。
    问题是什么呢?
    想象一下,我们为一个光纤放大器生成了一个计算机模型,该模型具有基于两个不同光纤的两个放大器级。例如,前置放大器可能有单模光纤,功率放大器可能有双包层光纤。
    我们的RP Fiber Power软件带有大量光纤数据文件,主要用于市售光纤,每个文件定义变量,如r_co(纤芯半径),并定义函数,如s_abs_Yb(l)(吸收截面)。问题很明显:如果仅包含两个光纤的数据文件,第一个将定义例如 变量r_co,第二个变量将使用其自己的值覆盖该变量,这就是典型的名称冲突。
    原则上,有一个简单的解决方案:在其中您重命名的所有变量和函数中,为第二根光纤创建数据文件的副本。例如,从r_co到r_co2。但是,显然,这并不是很方便。原则上,我们可以提供所有带有包含某些产品代码的变量和函数名称的数据文件,但是使用起来又比较麻烦。谁想要像r_co_CorActive_DCF_10_128这样的变量名呢?
    如何使用命名空间?
    命名空间提供了一种恰当的解决方案。本质上,您在第一个放大器级使用一个名为stage1的名称空间,在第二级使用另一个名为stage2的名称空间。在读取数据文件之前,只需声明定义的名称空间,如下:
    calc
    namespace: define stage1:
    begin
      include "Yb-Liekki Yb1200-6-125.inc"
    end
    namespace: define stage2:
    begin
      include "Yb-CorActive DCF-YB-10-128.inc"
    end
    结果,第一个数据文件中定义的变量和函数为“ stage1”。添加到他们的名字。例如,芯半径将存储在stage1.r_co中,而不是简单地存储在r_co中。
    原则上,问题已经解决了。第二个功能在以后使用定义的数量时非常方便。例如,在定义两个放大器级时,可以使用以下代码:
    calc
      begin
        namespace: use stage1:
        begin
          set_device(1);
          set_ns('stage1');
          set_fiber(L_f, No_z_steps, 'Yb');
          add_ring(r_co, N_Yb);
          pump1 := addinputchannel(P_pump_in, l_p, 'I_p', loss_p, dir_p);
          signal1 := addinputchannel(P_signal_in, l_s, 'I_s', loss_s, forward);
          finish_fiber();
        end;
        namespace: use stage2:
        begin
          set_device(2);
          set_ns('stage2');
          set_fiber(L_f, No_z_steps, 'Yb');
          add_ring(r_co, N_Yb);
          pump2 := addinputchannel(P_pump_in, l_p, 'I_p', loss_p, dir_p);
          signal2 := addinputchannel(P_signal_in, l_s, 'I_s', loss_s, forward);
          finish_fiber();
        end;
      end
    在这里,我们在表达式中声明了将使用特定的命名空间stage1和更高的stage2。结果,我们不必在每个名字前面放置“ stage1”或“ stage2”,现在它会自动完成。
    当我们在名称空间语句中编写“ use”而不是“ define”时,这意味着该名称空间仅适用于那些可以在该名称空间中找到的项目。在此未定义的其他变量则不受影响。例如,我们确实获得了定义的通道指数pump1,而不是stage1.pump1。
    进一步的细节:通过调用函数set_ns(),我们可以区分光纤模型哪个名称空间与之关联。这很重要,因为软件会从某些变量和函数中检索某些光纤数据。例如,它通常会占用变量tau_Yb的上限状态寿命,并且上述函数调用会将其更改为stage1.tau_Yb或stage2.tau_Yb。
    我们在这里仅举一些例子,如下:
    • 始终可以在名字前面,通过放置“ std”来强制使用全局名称空间。
    • 可以从名称空间的应用程序中排除某些项(或仅所有常量)。示例:“命名空间:定义stage1,全局常量:”将免除所有全局常量。



    点击公众号链接,查看更多专业信息:https://mp.weixin.qq.com/s/hnUjA-b2ZZJ_8_RCbuEySg

    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    联系我们|本论坛只支持PC端注册|手机版|小黑屋|吾爱光设 ( 粤ICP备15067533号 )

    GMT+8, 2024-11-23 08:22 , Processed in 0.109375 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表