P68 Programming into a Language
注意,这里是 into 而不是 in 。书这里用了一个 vb 的例子来说明,恰好我也有个例子。我们现在用 C++ 构建系统,C++ 里有个相当麻烦的东西,就是单件的生存期问题。一个 singleton 到底什么时候创建出来,什么是否析构,相信很多 C++ 程序员在构建大系统的时候都头痛过。据我所知,我们公司别的项目的同事到现在还在头痛这个问题。这次我做了一个约定,禁止任何模块的代码构造静态对象,也就是说,任何在 main 函数前自动的对象构造过程和 main 函数之后的自动析构过程都是不允许的。然后我们有一整套管理单件的方法供使用,这个问题被很好的解决了。我们再也没有为某个单件什么时候构造出来的,或是为什么他提前析构了的问题烦恼过。
P78 管理复杂度的重要性
我们做软件,就是在和问题的复杂度做斗争。有三个问题需要注意:用复杂的方法解决简单的问题;用简单但错误的方法解决复杂的问题;用不恰当的复杂方法解决复杂的问题。
P80 high fan-in 和 high fan-out
高内聚,低耦合很容易被重视。但是高扇入低扇出有时候会被忽略。这里是说,我们应该尽量的大量的使用某个低层次上给定的类(high fan-in) 而每个类都应该尽量少使用其他的类(控制在7个之下)。
P83 子系统间尽量减少联系
书里的例子很贴切。一个通用的规则是,如果 A 系统用到 B ,B 又用到 C ,那么 C 就不要再用到 A 了。系统层的设计图应该是无环图。
P91 封装不仅仅是有简化过的模型看到复杂的概念,而且同时还不能让你看到复杂概念的任何细节
隐藏信息的重要性毋庸质疑。所以我们现在不仅用 C++ 的 private 隐藏信息。还用接口的方法,不在头文件暴露任何设计细节。另外,任何一个不满足现状的程序员,对自己以前的代码一定不会满意。但是复用老的不满意的代码并非坏事。我们需要做的是,重用的时候,把老的东西隐藏起来。
P99 预料不同程度的变化
好的设计人员应该对以后可能变化的部分很敏感。这点很有体会,我自己就是这样一步步过来的。做一个决定之前,想想如果他做错了的后果。估计未来改变的成本,以作出合适的设计,非常的重要。系统为了适应每种变化而做过度设计又是不合适的。到底怎样设计,需要良好的感觉。
P101 耦合的种类
松散耦合是每个系统设计人员所追求的东西。但是其标准往往把握不准。举个简单的例子,不一定恰当。在我最早的设计里,系统把坐标这个东西封装成一个叫做 point ,以后参数传递都传 point * ,而不是 x,y 。这看使很合理。但是,这的确增加了耦合度。因为每个类都需要知道 point 的细节。很多情况下,用简单类型做参数传递反而更合适。(到底传 point * 还是 x,y 依旧要根据实际情况靠量) 参数过多也会导致耦合度的增加,从这个角度看,x,y 是两个参数, point * 是一个参数。关于耦合程度的问题,没有绝对唯一的标准。书里的阐述和总结非常值得一看。
P103 查阅常用的设计模式
设计模式这个东西,给程序员带来的最大的好处就是增加了交流的便捷。一个人可以思考的深度取决于他用于思考的语言掌握的词汇量。设计模式也可以给程序员带来这种便捷。其实常用的设计模式,即使你没有看过《设计模式》这本书,只要你是一个经验丰富的程序员,这些估计大多考虑过。但是,给设计模式起个名字,却可以加快伙伴间的交流。不过必须警惕一个陷阱,那就是为模式而模式。强迫代码去使用某个模式是很危险的。
P106 避免失误
失败的经验比成功的经验重要。如今网游开发尤甚。我们的游戏能成功,是因为我们在失败后吸取教训,小心谨慎。我们的代码未必质量高很多,但是很多业内同仁做出的东西吸取了许多人家成功的经验却失败了,正是因为他们缺少对失败教训的学习。
P111 自上而下和自下而上的设计方法
很多人都赞同自上而下的设计方法,把问题逐步分解,再分而治之。而我喜欢至下而上的设计方法。先把绝对要做的模块做了,再考虑怎么把他们搭起来。但是我在实际操作的时候往往是,自下而上的做,自上而下的思考。书这里对两种方法的优缺点的总结非常精辟。我特别同意最后的结论,这两种方法并不是互相排斥的——你会受益于二者的相互协作。
注意,这里是 into 而不是 in 。书这里用了一个 vb 的例子来说明,恰好我也有个例子。我们现在用 C++ 构建系统,C++ 里有个相当麻烦的东西,就是单件的生存期问题。一个 singleton 到底什么时候创建出来,什么是否析构,相信很多 C++ 程序员在构建大系统的时候都头痛过。据我所知,我们公司别的项目的同事到现在还在头痛这个问题。这次我做了一个约定,禁止任何模块的代码构造静态对象,也就是说,任何在 main 函数前自动的对象构造过程和 main 函数之后的自动析构过程都是不允许的。然后我们有一整套管理单件的方法供使用,这个问题被很好的解决了。我们再也没有为某个单件什么时候构造出来的,或是为什么他提前析构了的问题烦恼过。
P78 管理复杂度的重要性
我们做软件,就是在和问题的复杂度做斗争。有三个问题需要注意:用复杂的方法解决简单的问题;用简单但错误的方法解决复杂的问题;用不恰当的复杂方法解决复杂的问题。
P80 high fan-in 和 high fan-out
高内聚,低耦合很容易被重视。但是高扇入低扇出有时候会被忽略。这里是说,我们应该尽量的大量的使用某个低层次上给定的类(high fan-in) 而每个类都应该尽量少使用其他的类(控制在7个之下)。
P83 子系统间尽量减少联系
书里的例子很贴切。一个通用的规则是,如果 A 系统用到 B ,B 又用到 C ,那么 C 就不要再用到 A 了。系统层的设计图应该是无环图。
P91 封装不仅仅是有简化过的模型看到复杂的概念,而且同时还不能让你看到复杂概念的任何细节
隐藏信息的重要性毋庸质疑。所以我们现在不仅用 C++ 的 private 隐藏信息。还用接口的方法,不在头文件暴露任何设计细节。另外,任何一个不满足现状的程序员,对自己以前的代码一定不会满意。但是复用老的不满意的代码并非坏事。我们需要做的是,重用的时候,把老的东西隐藏起来。
P99 预料不同程度的变化
好的设计人员应该对以后可能变化的部分很敏感。这点很有体会,我自己就是这样一步步过来的。做一个决定之前,想想如果他做错了的后果。估计未来改变的成本,以作出合适的设计,非常的重要。系统为了适应每种变化而做过度设计又是不合适的。到底怎样设计,需要良好的感觉。
P101 耦合的种类
松散耦合是每个系统设计人员所追求的东西。但是其标准往往把握不准。举个简单的例子,不一定恰当。在我最早的设计里,系统把坐标这个东西封装成一个叫做 point ,以后参数传递都传 point * ,而不是 x,y 。这看使很合理。但是,这的确增加了耦合度。因为每个类都需要知道 point 的细节。很多情况下,用简单类型做参数传递反而更合适。(到底传 point * 还是 x,y 依旧要根据实际情况靠量) 参数过多也会导致耦合度的增加,从这个角度看,x,y 是两个参数, point * 是一个参数。关于耦合程度的问题,没有绝对唯一的标准。书里的阐述和总结非常值得一看。
P103 查阅常用的设计模式
设计模式这个东西,给程序员带来的最大的好处就是增加了交流的便捷。一个人可以思考的深度取决于他用于思考的语言掌握的词汇量。设计模式也可以给程序员带来这种便捷。其实常用的设计模式,即使你没有看过《设计模式》这本书,只要你是一个经验丰富的程序员,这些估计大多考虑过。但是,给设计模式起个名字,却可以加快伙伴间的交流。不过必须警惕一个陷阱,那就是为模式而模式。强迫代码去使用某个模式是很危险的。
P106 避免失误
失败的经验比成功的经验重要。如今网游开发尤甚。我们的游戏能成功,是因为我们在失败后吸取教训,小心谨慎。我们的代码未必质量高很多,但是很多业内同仁做出的东西吸取了许多人家成功的经验却失败了,正是因为他们缺少对失败教训的学习。
P111 自上而下和自下而上的设计方法
很多人都赞同自上而下的设计方法,把问题逐步分解,再分而治之。而我喜欢至下而上的设计方法。先把绝对要做的模块做了,再考虑怎么把他们搭起来。但是我在实际操作的时候往往是,自下而上的做,自上而下的思考。书这里对两种方法的优缺点的总结非常精辟。我特别同意最后的结论,这两种方法并不是互相排斥的——你会受益于二者的相互协作。