纯java软件工程师读effective c++体会
纯java程序员读effective c++体会
一,对象的传递
c++在传递对象的时候,很关注到底是对象(即复制对象),还是引用(即传原对象),以及是否const,除了效率之外,还牵涉到是否可修改,也就是语言的严谨性
但是到了java中,因为语言没有强制要求,很容易出现本该复制的对象,本体却到处乱传,特别是愚蠢的自动生成getter,setter,就是万恶之源,
二,封装
先上例子
这代码OK吗?NO!封装要做的是什么?封装就是控制对象field的可见性,所以public field是糟糕的设计.
在例子里,a,b是应该见到i的,所以没错,c没用到i,所以他不应该见到i,应该移出class A
这里有一个面向对象的典型误区,认为一个对象的方法就应该放在对象中,抱着这种想法的话,必然导致对象臃肿
我再次强烈批判愚蠢的自动生成getter,setter,他使得对象毫无封装可言,罪恶直逼public field,而如果getter,setter里做了私活,就违反了最小惊愕原则,所以最好是确实地把该做的活做好,然后换个可读的方法名
三,效率
即使在c++,for循环里选择new对象还是赋值,到底哪个效率高,也是不一定的,要视情况而定.
这本书的内容,与其说是教你怎么写的有效率,不如说其实是教你怎么写的正确,所谓最求效率的写法,实在少有必要,真正重要的是正确的编码和正确的设计
一,对象的传递
c++在传递对象的时候,很关注到底是对象(即复制对象),还是引用(即传原对象),以及是否const,除了效率之外,还牵涉到是否可修改,也就是语言的严谨性
但是到了java中,因为语言没有强制要求,很容易出现本该复制的对象,本体却到处乱传,特别是愚蠢的自动生成getter,setter,就是万恶之源,
二,封装
先上例子
public class A{ private int i = 0; public void a(){ i++; } public void b(){ i--; } public void c(){ a(); b(); } }
这代码OK吗?NO!封装要做的是什么?封装就是控制对象field的可见性,所以public field是糟糕的设计.
在例子里,a,b是应该见到i的,所以没错,c没用到i,所以他不应该见到i,应该移出class A
这里有一个面向对象的典型误区,认为一个对象的方法就应该放在对象中,抱着这种想法的话,必然导致对象臃肿
我再次强烈批判愚蠢的自动生成getter,setter,他使得对象毫无封装可言,罪恶直逼public field,而如果getter,setter里做了私活,就违反了最小惊愕原则,所以最好是确实地把该做的活做好,然后换个可读的方法名
三,效率
即使在c++,for循环里选择new对象还是赋值,到底哪个效率高,也是不一定的,要视情况而定.
这本书的内容,与其说是教你怎么写的有效率,不如说其实是教你怎么写的正确,所谓最求效率的写法,实在少有必要,真正重要的是正确的编码和正确的设计