C++信徒的摩西十戒
简单设计的重要性怎么强调也不过分。
·使一个正确的程序变快,比使一个快速的程序正确要容易的多。 ·避免使用程序设计语言的冷僻特性,应该使用最简单的有效技术。 ·不要毫无节制地重载运算符。 ·不要滥用匿名变量,合理使用命名变量。当然,这不是说连vector().swap(other)这样的惯用法也要排斥。 ·重构技术是改善代码可读性的有效手段。 第7条:编程中应知道何时和如何考虑可伸缩性 从字面上来看,这差不多等于外交辞令。答案无非是“适当的”时候“适当地”考虑可伸缩性。这非常依赖于软件工程师的经验和知识。所以,本条目也“适当地”回避了那种缺乏营养的教导,着重讨论算法复杂度的选择问题。 基本上,线性复杂度可以作为一个算法是否可选的分界点。值得花费精力避免选择差于线性复杂度的算法,而不差于线性复杂度的算法则可以接受。所以,把性能放在嘴边的兄弟们注意了,你的精力可别放错了地方,高德纳言犹在耳:不成熟的优化是程序设计中的万恶之源。必要时,先努力优化复杂度(选择好的算法----算法无用论者,去面壁!)。 顺便提一句排序算法,通用排序算法的复杂度最好是O(NlgN),但是特定领域完全可以有更好复杂度的算法。 第8条:不要进行不成熟的优化 “不成熟的优化是程序设计中的万恶之源” ----高德纳引用的这句话这本书中出现了若干次,高德纳在他的不朽名著《计算机程序设计艺术》中也一再强调了这一点,还说他以前程序中的许多错误都是关于不成熟优化的。看来,唯一在诱惑面前没有堕落的,只有耶稣,即使是大师也无法抗拒。既然如此,建议把下面的话放在电脑桌面上: 让一个正确的程序更快速, 比让一个快速的程序正确,要容易的太多太多。 第9条:不要进行不成熟的劣化 什么是不成熟的劣化呢?典型的有: ·在可以通过引用传递的时候,却定义了通过值传递参数。 ·在使用前缀++操作符很适合的场合,却使用后缀版本。 ·在构造函数中使用赋值操作而不是初始化列表。 关于第一条有一些例外,一般而言,不建议传递原生类型的引用(讨论前提是传值的程序语义没有问题)。关于第二条,一些很老的C语言的书上有过后缀版本可能比前缀版本更快----当然,这只可能针对原生类型--的说法,忘记它吧,现代编译器会轻而易举的优化掉这之间的差异。而对于用户定义类型,实现后缀形式的++和--操作符都意味着效率上的损失。习惯的力量是巨大的,养成使用前缀版本的习惯吧。 然而,要区别不成熟的优化和不成熟的劣化之间,需要足够的训练和基础知识,这些知识可以从《Effective C++》,《More Effective C++》《Exceptional C++》《More Exceptional C++》中获得。 第10条:尽量减少全局和共享数据 全局数据是应该努力避免的,它导致两个问题:名字污染和远程耦合。类的公有静态变量只是解决了名字污染问题,并没有解决远程数据耦合问题。同样,Singleton模式也存在远程耦合问题。 全局数据通常就意味着共享,共享数据则意味着关系,意味着复杂性。再多线程中,对共享数据的访问通常都需要串行化。 关于变量,一个比较深刻的看法是:一个算法使用的变量(命名的和匿名的)越少,就越好。这个变量包括局部变量。 第11条:信息隐藏 对于一个类,决不要将数据公开(数值聚合的struct 例外),也不要返回指向内部数据成员的指针或引用供外部代码修改。通过提供抽象,我们将获得插入不变式检查的能力。 第12条:懂得何时和如何进行并发性编程 这个问题主要是考虑多线程和多进程的编程,我期待着并行程序设计进入C++的领域。要编写正确、安全的多线程代码并不简单,特别是考虑到可移植性时,更是如此。 不过,本条目的题目太大了 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |