博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程小知识之 循环依赖
阅读量:4224 次
发布时间:2019-05-26

本文共 1433 字,大约阅读时间需要 4 分钟。

本文简述了一些循环依赖的知识~

之前工作中遇到了循环依赖的问题,在此简单记录一些相关的知识~

拿 Lua(5.3) 举例,如果我们循环 require 模块,就会触发堆栈溢出错误:

-- module_1.luarequire("module_2")return {}
-- module_2.luarequire("module_1")return {}
-- test.lua-- cause stack overflow here ...require("module_1")

使用 Lua require 的模块只有两种状态: 未加载已加载,并没有所谓的 部分加载 的概念,这也导致了 Lua require 不能处理循环依赖问题,类似的,我们也可以看看 C# 中涉及循环依赖的表现:

我们都知道 C# 中类的静态构造函数在创建第一个类型实例或者引用类型任一静态成员之前会被调用,据此,我们可以编写两个相互引用的静态构造函数来进行循环依赖的测试:

class ClassA{    public static int s_value;    static ClassA()    {        s_value = ClassB.s_value;    }}class ClassB{    public static int s_value;    static ClassB()    {        s_value = ClassA.s_value;    }}static void Main(string[] args){    Console.WriteLine(ClassA.s_value);    Console.WriteLine(ClassB.s_value);}

也许你会猜测上述代码也会产生堆栈溢出之类的问题,但实际上,程序会正常输出 0 0,原因在于 C# 并不会重复执行类的静态构造函数,哪怕类的静态构造函数还没有执行完成(正在执行),简单来说, C# 中类的静态构造函数可以处理循环依赖的问题,只是执行结果可能并不直观:

(有兴趣的朋友可以考虑看看下面这个测试程序的输出结果)

class ClassA{    public static int s_value = 1;    static ClassA()    {        s_value = ClassB.s_value;    }}class ClassB{    public static int s_value = 2;    static ClassB()    {        s_value = ClassA.s_value;    }}static void Main(string[] args){    Console.WriteLine(ClassA.s_value);    Console.WriteLine(ClassB.s_value);}

解决循环依赖的一个通用方法就是抽取公用模块,让循环依赖的模块解耦,转而共同依赖于这个公用模块,举例来说:

譬如 模块 A 依赖于 模块 B(需要使用 B.Func), 模块 B 也依赖于 模块 A(需要使用 A.Func),则我们抽取出 模块 C(其具有 A.Func 和 B.Func 的功能),然后让 模块 A 和 模块 B 去除相互依赖,转而都去依赖 模块 C.

更多资料

转载地址:http://hjzqi.baihongyu.com/

你可能感兴趣的文章
手把手教你上手python库pydbgen(附代码、安装地址)
查看>>
解析广泛应用于NLP的自注意力机制(附论文、源码)
查看>>
一文读懂深度学习模型近年来重要进展(附梳理图)
查看>>
ML:教你聚类并构建学习模型处理数据(附数据集)
查看>>
带你入门Python数据挖掘与机器学习(附代码、实例)
查看>>
资源 | UC Berkeley CS 294深度强化学习课程(附视频、学习资料)
查看>>
李飞飞团队最新论文:如何对图像中的实体精准“配对”?(附代码&论文)
查看>>
资源 | 25个深度学习开源数据集,have fun !
查看>>
数据蒋堂 | 存储和计算技术的选择
查看>>
白硕:区块链技术与数据隐私(附视频)
查看>>
手把手教你用Python进行回归(附代码、学习资料)
查看>>
9款超赞的AI开源项目!| 本周Github精选
查看>>
一文掌握机器学习必备数学知识(附学习资源)
查看>>
教你用R语言分析招聘数据,求职/转行不求人~(附代码、数据集)
查看>>
干货 | 20多门AI网络课程资源(附链接)
查看>>
从零开始用Python实现k近邻算法(附代码、数据集)
查看>>
手把手教你用Python进行回归(附代码、学习资料)
查看>>
干货 | 20多门AI网络课程资源(附链接)
查看>>
数据蒋堂 | 存储和计算技术的选择
查看>>
白硕:区块链技术与数据隐私(附视频)
查看>>