2007年8月3日星期五

《C++沉思录》阅读笔记(5)

1.在一个具有继承关系的类群中使用容器会遇到许多在使用内在类型(元类型)时所不会遇到的问题,因为机器是不了解它要处理的问题的规模是多大。它像一个满脸青春痘的少年面对制定一个跨国企业下年度财务预算报表时一样茫然无措。这并不是说少年不够聪明,而是他没有多少经验。即便对于一个经过多年磨炼的人来说,面对一个无法预测边界的工作时,他多少也会紧张。
2.将继承与容器共用,迫使我们要处理两个问题:控制内存分配和把不同类型的对象放入同一个容器中。这其实是一个RTTI问题。在C++中的语言层次,并没有提供一个完善的RTTI解决方案,但其确提供了解决该问题的工具。可惜地是,该问题是OOP中最常见也是最难于理解的问题,故后来的Delphi、Java、C#等都将RTTI作为语言级机制内化起来。这固然为新手入门带来很多好处,并能大幅提高软件工业的生产效率。但软件生产是一个如此特殊的产业,了解RTTI等底层技术的人的产能可能是一般新手的几百倍。或许其只是在产生了形式上的"效率提高"的繁华,而实际整体并没有太多增长。
3.在容器中应该使用代理对象而不是对象本身。
4.在编辑器中手工编写一下代码,有时不需要编译就可以理解作者意图,而单纯阅读总像"雾里看花"。
5.不应该接受对象,而应该接受对象指针或者引用。这虽然带来显而易见的效率优势,也带来棘手的问题,因为使用对象指针比直接使用对象要困难,未初始化的指针是非常危险而且没有什么简单办法可以防范。所以要在其间增加一个代理类,将指针管理封装起来,这样就有效隔绝了指针问题的蔓延。
6.Handle类的实现越看越和COM机制相似,或许COM的实现就是采用这样的技术。
7.Copy on write技术能有效提高效率,在编写完成代码后,应该用该技术优化既有代码。

《C++沉思录》阅读笔记(4)

1.OOP->使用继承和动态绑定的编程方式;
2.检查表不是任务清单,它的用途是帮助你回忆起可能会忘掉的事情,而不是来约束你;
(1)构造函数
(2)私有数据成员
(3)带参数的构造函数
(4)是否每个构造函数都初始化所有的数据成员
(5)析构函数
(6)虚析构函数
(7)需要复制构造函数
(8)赋值操作符
(9)赋值操作符能正确地将对象赋值给对象吗?
(10)定义关系操作符
(11)删除数组时采用delete[]
(12)在复制构造函数与赋值操作符参数中使用const
(13)如果函数有引用参数,其应该是const吗?
(14)适当声明成员函数为const
3.C++更适合于那些喜欢思考的程序员;

《C++沉思录》阅读笔记(3)

1.Murphy's Law 墨菲法则,一件事只要有可能变糟,就一定会变糟。
2.通常我们不可能为特定的工具挑选合适的问题;而应该为特定的问题挑选合适的工具,但目前我们常常会在没有分析问题前就决定了工具,这常常是因为商业意义或其它原因。有时我会在第一次技术讨论会上,在一段5分钟的简短需求说明后,听到项目经理斩钉截铁地提出要采用J2EE+***或者ASP.NET+***等方案,然后兴致勃勃地讲述该技术平台的优越性,宛然他是某家技术提供商所雇用的推销员。
3.C++主要设计目的是可移植性和可并存性,其可移植性与跨平台不是一个概念。在Java以前就有许多包裹着不同层次系统的语言,很显然Java是其中最成功的一个,而其由于商业推广目的,并不会强调移植性与跨平台间的概念差异。虽然从计算机科学家的角度来看,这样的差异是如此之大,以至于许多专家认同"Java不是跨平台,Java自己就是平台"。但对于程序工人来说,这样的差异是细小的。而对于商人来说,这样的差异是产生"现金流"的风道。
4.C++的目的不是安全,而是自由。我想随着软件工业的发展,C++与Java会不断分化,科学家使用C++,而商业系统中的技术工人则采用Java(或者与之类似的C#等)。

《C++沉思录》阅读笔记(2)

1.很多最成功、最有名的软件最初都是由少数人开发的;
2.软件业中,软件制造的规模和经济效益不成正比;
3.抽象是机器所不易而是人所擅长的工作,不同层次的抽象产生不同层次的系统,要厘清不同语言能赋予人不同的层次的抽象能力。有些抽象不是语言的一部分。
4.在某处很显然的约定在另一写地方会成为"隐讳"的细节而不为自己和他人所觉察、最终成为最难于Debug的Bug。
5.人应该成为工具的主人而不是依附工具的奴仆。

2007年8月2日星期四

C++沉思录阅读笔记(1)

实用和抽象是C++的本质特性。不要陷入教条主义的泥潭,但要尊重编程手册与智慧。在面对代码时要始终保持实用主义原则,而在确保程序正常工作的基础上,敢于挑战自我,用眼光考察代码的未来,用头脑抽象问题的本质。对于一个优秀的C++科学家来说。编程应是(1)集中考量问题的本质(2)定义一个类来抓住本质,确保其能工作(3)将其逐步抽象建立一个更一般问题的解决方案(4)在遇到符合这个本质的问题就采用该类。
思索是C++程序员的特权,因为从语言角度C++给于程序员最大的自由度。