- ·上一篇文章:ASP连接数据库错误解决办法新法
- ·下一篇文章:新手入门 ASP.NET2.0缓存技术
《C++编程规范》笔记(设计风格)
第5条:不要进行不成熟的劣化
什么是不成熟的劣化呢?典型的有:
在可以通过引用传递的时候,却定义了通过值传递参数。
在使用前缀++操作符很适合的场合,却使用后缀版本。
在构造函数中使用赋值操作而不是初始化列表。
关于第一条有一些例外,一般而言,不建议传递原生类型的引用(讨论前提是传值的程序语义没有问题)。关于第二条,一些很老的C语言的书上有过后缀版本可能比前缀版本更快----当然,这只可能针对原生类型--的说法,忘记它吧,现代编译器会轻而易举的优化掉这之间的差异。而对于用户定义类型,实现后缀形式的++和--操作符都意味着效率上的损失。习惯的力量是巨大的,养成使用前缀版本的习惯吧。
然而,要区别不成熟的优化和不成熟的劣化之间,需要足够的训练和基础知识,这些知识可以从《Effective C++》,《More Effective C++》《Exceptional C++》《More Exceptional C++》中获得。
第6条:尽量减少全局和共享数据
全局数据是应该努力避免的,它导致两个问题:名字污染和远程耦合。类的公有静态变量只是解决了名字污染问题,并没有解决远程数据耦合问题。同样,Singleton模式也存在远程耦合问题。
全局数据通常就意味着共享,共享数据则意味着关系,意味着复杂性。再多线程中,对共享数据的访问通常都需要串行化。
关于变量,一个比较深刻的看法是:一个算法使用的变量(命名的和匿名的)越少,就越好。这个变量包括局部变量。
第7条:信息隐藏
对于一个类,决不要将数据公开(数值聚合的struct 例外),也不要返回指向内部数据成员的指针或引用供外部代码修改。通过提供抽象,我们将获得插入不变式检查的能力。
第8条:懂得何时和如何进行并发性编程
这个问题主要是考虑多线程和多进程的编程,我期待着并行程序设计进入C++的领域。要编写正确、安全的多线程代码并不简单,特别是考虑到可移植性时,更是如此。
不过,本条目的题目太大了,很难在一个条目中描述完整,只能概述几个要点:
参考目标平台文档,了解该平台的同步化原语。
最好将平台原语用自己设计的抽象包装起来
确保正在使用的类型在多线程程序中使用是安全的
第9条:确保资源为对象所拥有。使用显式的RAII和智能指针
好像是在《Imperfact C++》中说过:仅仅因为有RAII就值得使用C++。C++/CLI也强调引入确定性析构,确定性析构正式RAII得以实现的基础之一。通过RAII我们能够得到的远远超出一般程序员的想象,在讨论异常安全代码时,将进一步见识RAII的威力。
在实现RAII时,需要小心复制构造和赋值,编译器的版本可能并不正确。另外,需要确保资源为对象所有,不要在一行分配一个以上的资源。下面的代码是不安全的:
Fun(shared_ptr(new Widget), shared_ptr(new Widget));
取而代之的正确方法是:
shared_ptr sp1(new Widget), sp2(new Widget);
Fun(sp1, sp2);
什么是不成熟的劣化呢?典型的有:
在可以通过引用传递的时候,却定义了通过值传递参数。
在使用前缀++操作符很适合的场合,却使用后缀版本。
在构造函数中使用赋值操作而不是初始化列表。
关于第一条有一些例外,一般而言,不建议传递原生类型的引用(讨论前提是传值的程序语义没有问题)。关于第二条,一些很老的C语言的书上有过后缀版本可能比前缀版本更快----当然,这只可能针对原生类型--的说法,忘记它吧,现代编译器会轻而易举的优化掉这之间的差异。而对于用户定义类型,实现后缀形式的++和--操作符都意味着效率上的损失。习惯的力量是巨大的,养成使用前缀版本的习惯吧。
然而,要区别不成熟的优化和不成熟的劣化之间,需要足够的训练和基础知识,这些知识可以从《Effective C++》,《More Effective C++》《Exceptional C++》《More Exceptional C++》中获得。
第6条:尽量减少全局和共享数据
全局数据是应该努力避免的,它导致两个问题:名字污染和远程耦合。类的公有静态变量只是解决了名字污染问题,并没有解决远程数据耦合问题。同样,Singleton模式也存在远程耦合问题。
全局数据通常就意味着共享,共享数据则意味着关系,意味着复杂性。再多线程中,对共享数据的访问通常都需要串行化。
关于变量,一个比较深刻的看法是:一个算法使用的变量(命名的和匿名的)越少,就越好。这个变量包括局部变量。
第7条:信息隐藏
对于一个类,决不要将数据公开(数值聚合的struct 例外),也不要返回指向内部数据成员的指针或引用供外部代码修改。通过提供抽象,我们将获得插入不变式检查的能力。
第8条:懂得何时和如何进行并发性编程
这个问题主要是考虑多线程和多进程的编程,我期待着并行程序设计进入C++的领域。要编写正确、安全的多线程代码并不简单,特别是考虑到可移植性时,更是如此。
不过,本条目的题目太大了,很难在一个条目中描述完整,只能概述几个要点:
参考目标平台文档,了解该平台的同步化原语。
最好将平台原语用自己设计的抽象包装起来
确保正在使用的类型在多线程程序中使用是安全的
第9条:确保资源为对象所拥有。使用显式的RAII和智能指针
好像是在《Imperfact C++》中说过:仅仅因为有RAII就值得使用C++。C++/CLI也强调引入确定性析构,确定性析构正式RAII得以实现的基础之一。通过RAII我们能够得到的远远超出一般程序员的想象,在讨论异常安全代码时,将进一步见识RAII的威力。
在实现RAII时,需要小心复制构造和赋值,编译器的版本可能并不正确。另外,需要确保资源为对象所有,不要在一行分配一个以上的资源。下面的代码是不安全的:
Fun(shared_ptr
取而代之的正确方法是:
shared_ptr
Fun(sp1, sp2);


