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

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

class Parent
{
	Child* mychild;
};

class Child
{
	Parent* myParent;
};

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

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

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

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

    

时间: 2024-10-30 07:15:10

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

C++编程规范之10:尽量减少全局和共享数据

摘要:       共享会导致冲突,避免共享数据,尤其是全局数据.共享数据会增加耦合度,从而降低可维护性,通常还会降低性能. 全局变量和静态变量会使程序的逻辑变得更加复杂,使程序不同的部分耦合的更加紧密.共享数据对单元测试会产生不良影响,因为使用共享数据的代码片段的正确性不进取决于数据变化的过程,更取决于以后会使用该数据的未知代码区域的机能. 全局名字空间中的对象名称还会污染全局名字空间. 在必须使用全局的.名字空间作用域的或者静态的类对象,一定要仔细地对其进行初始化.在不同编译单位中这种对象的

《C++编程规范:101条规则、准则与最佳实践》——2.6尽量减少全局和共享数据

2.6尽量减少全局和共享数据 摘要共享会导致冲突:避免共享数据,尤其是全局数据.共享数据会增加耦合度,从而降低可维护性,通常还会降低性能. 讨论这里的论述比第18条的具体讨论更加通用. 避免使用名字空间作用域中具有外部连接的数据或者作为静态类成员的数据.这些数据会使程序逻辑变得更加复杂,使程序不同的(而且可能更糟,距离较远的)部分耦合得更加紧密.共享数据对单元测试会产生不良影响,因为使用共享数据的代码片断的正确性不仅取决于数据变化的过程,更取决于以后会使用该数据的未知代码区域的机能. 全局名字空

IDesign C#编程规范(二)

编程|规范 续之一,小鸡射手接着翻译了IDesign编码规范的第二章前部. 2 编码惯例 Coding Practices 1. 避免在一个文件中放多个类. Avoid putting multiple classes in a single file. 2. 一个文件应该只对一个命名空间提供类型.避免在同一文件中有多个命名空间. A single file should only contribute types to a single namespace. Avoid having mult

JAVA 编程规范

编程|规范 1. 应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JAVABEAN,EJB)均应遵守这个规范.同时,也可作为其它项目的参考. 2. 设计类和方法 2.1 创建具有很强内聚力的类 方法的重要性往往比类的重要性更容易理解,方法是指执行一个统一函数的一段代码.类常被错误的视为是一个仅仅用于存放方法的容器.有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有方法放入单个类之中. 之所以不能正确的认识类的功能,原因之一是类的实现实际上

Visual Basic编程规范

visual|编程|规范 Visual Basic编程规范 1.      Visual Basic IDE(集成开发环境)设置        必须打开设置选项的"要求变量声明","对齐控件到网格","自动缩进"开关.        Tab的宽度统一为4个空格,网格单位一律设为:width 60 height 60. 2.     命名约定        (注意:在任何时候,不能使用中文及全角字符,只允许使用英文字母.下划线和数字) 2.1   

《C++编程规范:101条规则、准则与最佳实践》——第2章设计风格设计风格 C++编程规范:101条规则、准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累。 有些人避而远之。惟智者能够善加消除。 ——Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程

第2章设计风格 C++编程规范:101条规则.准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累. 有些人避而远之.惟智者能够善加消除. --Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程序设计中的万恶之源. --Donald Knuth[1] The Errors of TeX[Knuth89] 完全区分设计风格与编码风格是非常困难的.我们将一般在实际编写代码时才用得到的条款留到下一部分介绍. 本部分集中讨论适用面比一个特定的类或者函数更广的原则和

《C++编程规范:101条规则、准则与最佳实践》——导读

前言 C++编程规范:101条规则.准则与最佳实践尽早进入正轨:以同样的方式实施同样的过程.不断积累惯用法.将其标准化.如此,你与莎士比亚之间的唯一区别将只是掌握惯用法的多少,而非词汇的多少. --Alan Perlis[1]} 标准最大的优点在于,它提供了如此多样的选择. --出处尚无定论 我们之所以编写本书,作为各开发团队编程规范的基础,有下面两个主要原因. 编程规范应该反映业界最久经考验的经验.它应该包含凝聚了经验和对语言的深刻理解的公认的惯用法.具体而言,编程规范应该牢固地建立在大量丰富

实现高效Java编程规范的十一条基础规则

编程|规范 本文介绍的Java规则的说明分为5个级别,级别1是最基本也是最重要的级别,在今后将陆续写出其他的规则.遵守了这些规则可以提高程序的效率.使代码有更好的可读性等. (1) 避免使用NEW关键字来创建String对象 把一个String常量copy到String 对象中通常是多余.浪费时间的. Public class test{ Public void method(){ System.out.print (str); } private String str = new String

C# 编程规范

编程|规范 C# 编码规则 一.命名 1.用pascal规则来命名方法和类型. public class TextBox { public void DataBind() { } } 2.用camel规则来命名局部变量和方法的参数. string userName; public AddUser(string userId, byte[] password); 3.所有的成员变量前加前缀 _ public class Database { private string _connectionSt