阅读721 返回首页    go 阿里云 go 技术社区[云栖]


C++编程规范之22:尽量减少定义性依赖。避免循环依赖

</pre><p></p><p><span >摘要:     </span></p><p><span >不要过分依赖:人如果用前向盛名能够实现,那么就不要用包含(#include)定义。</span></p><p><span >     不要互相依赖:循环依赖是指两个模块直接或者间接地互相依赖。所谓模块就是一个紧凑的发布单元。互相依赖的多个模块并不是真正的独立模块,而是紧紧胶着在一起的一个更大的模块,一个更大的发布单元。因此,循环依赖有碍于模块性,是大型项目的祸根。请避免循环依赖。</span></p><p><span >    除非确实需要类型定义,否则应该优先使用前向声明。一般而言,应该在模块层次上考虑依赖性及其循环。模块是一同发布的类和函数的紧凑几何。</span></p><p><span >   </span></p><pre code_snippet_ snippet_file_name="blog_20131218_2_5409518" name="code" >class Child;

class Parent
{
	Child* mychild;
};

class Child
{
	Parent* myParent;
};

在上面的代码中Parent和Child存在互相依赖。代码能够通过编译,但是有一个根本性的问题:两个类不再是独立的,而是相互依赖的。这种情况只有这两个类同属于一个模块(有同一个人或者小组开发,作为一个整体进行测试和发布)的时候。

为了打破循环,可以使用“依赖倒置原理”:不要让高层模块依赖于底层模块;相反,应该让两者都依赖于抽象。如果能为parent或child定义独立的抽象类,那么就能够打破循环了。

依赖有一种特殊的形式,一些设计颇受其害:派生类的依赖传递,即积累依赖于所有的派生类,包括直接的和间接的。对于这种情况,就要注意的设计程序的时候,要多用组合少用继承,这点和设计模式中的策略模式有相同点。

过度依赖的一个症状就是当局部发生变化时需要进行增量构建,不得不重新编译项目中的很大一部分代码。


    

最后更新:2017-04-03 12:53:51

  上一篇:go html中input标签的tabindex属性
  下一篇:go 图片移动并进行边界判断