实现模式,其实也就是规范,前人总结出来写代码的经验和习惯,里面包含了测试驱动开发和重构的概念.
只有学习了这些内容,才能设计出良构的代码,这也是写程序的艺术所在.
实现模式这本书纸张不多,只有200页左右,但里面文字极其精炼,作者是JUnit的设计者 Erich Gamma.译者是InfoQ的版主或编辑,其中的熊节先生尤受清华推崇.
这两天看了很多,差不多已经看完4分之3.昨天刚翻的时候还觉得这本书太薄,应该2,3个小时看完.结果仅仅看10页内容就花了我1个小时.到现在为止看了大概100页左右,算上制造导图的时间加起来居然已经有12,13个小时,这太让我惊讶了.我很少会在1,2天内用大量时间来专攻一种技术.什么是大师作品?这就是大师作品,用精炼的文字来表达自己的想法.不像国内的某些写手,一个示例代码都恨不得写10页.
目前看了4章分别是类,行为,状态和方法.
类的章节主要讲解了什么情况下才需要创建类,类名如何约束,各种类之间的区别(非常详细).中间穿插了大量的设计模式和设计原则概念.
比如策略模式,开闭原则,接口隔离,职责单一等.特别是有版本的interface是为了复合开闭原则才提供的.非常有意思.
类名的约束要分顶层类和子类,顶层类应该尽量单一简练,子类应该用顶层类的名字来扩展前缀~
状态其实也就是对象的属性.访问状态分为直接和间接,直接应该用于类的内部,间接应该使用在对外公开的方法上.
命名方面要注意的是要根据扮演的角色,作用域来命名,比如fCount是字段,lCount是局部.Result表示方法的返回值,Each表示迭代的临时元素等等.
通用状态和可变状态,通用状态就是把一组状态包装在一个新对象里,这个新对象作为该对象的属性存在.可变状态一般用在判断上,当字段改变的时候才会使用到其他某些字段的时候用.比如当四边形有外框的时候才会提供外框的长宽字段.
当多个方法的参数传入同一个内容,应该设置从构造方法里传入该内容.
初始化分为及早初始化和延迟初始化.及早初始化认为初始化应该放在声明的时候,方便阅读.其实放在构造方法里也是OK的.延迟初始化说明只有使用的时候再初始化,通常是在方法内.但我认为若多个方法调用这个变量,那就需要及早初始化,不然过多的逻辑判断是否为null还是会增加消耗.
行为,也就是语句.
第一个比较有意思的概念就是太大的方法体应该重构成大方法里包含多个小方法,这样方便阅读.在大方法中若出现语句也应该把语句包装在小方法内.
第二个就是卫述句,要求在控制流转的时候尽量让重要的判断放在最前面.比如多个嵌套if,应该可以改成多个并列的if.
方法,内容有些重复,比如说组合方法就是大方法体里包含小方法.
关于命名:命名要根据使用者的角度来命名.private只提供给本类用,那就用底层的命名.public应该设置为外部使用者懂的语句,跟我以前想法最大的差别就是get,set方法都必须重写以便外部理解.get和set里暴露里内部属性的名字,确实应该重写.
布尔值的setting方法 这个方法一看就知道对象有两种状态,也就是状态里的可变状态.应该采用valid和invalid两个方法来表示set
安全副本 多个变量引用同一个内存地址就会出现别名问题.所以应该尽量避免这种情况.最好的办法就是赋值的时候不应该赋值引用,而是创建新的内容相同的内存空间,然后把引用给变量.
比如get方法里不应该直接return该属性,而是应该创建一个副本,把副本给他.set方法里也是一样.不应该直接把参数里的引用指向字段,而是应该先把参数做个副本,副本给字段.
只有学习了这些内容,才能设计出良构的代码,这也是写程序的艺术所在.
实现模式这本书纸张不多,只有200页左右,但里面文字极其精炼,作者是JUnit的设计者 Erich Gamma.译者是InfoQ的版主或编辑,其中的熊节先生尤受清华推崇.
这两天看了很多,差不多已经看完4分之3.昨天刚翻的时候还觉得这本书太薄,应该2,3个小时看完.结果仅仅看10页内容就花了我1个小时.到现在为止看了大概100页左右,算上制造导图的时间加起来居然已经有12,13个小时,这太让我惊讶了.我很少会在1,2天内用大量时间来专攻一种技术.什么是大师作品?这就是大师作品,用精炼的文字来表达自己的想法.不像国内的某些写手,一个示例代码都恨不得写10页.
目前看了4章分别是类,行为,状态和方法.
类的章节主要讲解了什么情况下才需要创建类,类名如何约束,各种类之间的区别(非常详细).中间穿插了大量的设计模式和设计原则概念.
比如策略模式,开闭原则,接口隔离,职责单一等.特别是有版本的interface是为了复合开闭原则才提供的.非常有意思.
类名的约束要分顶层类和子类,顶层类应该尽量单一简练,子类应该用顶层类的名字来扩展前缀~
状态其实也就是对象的属性.访问状态分为直接和间接,直接应该用于类的内部,间接应该使用在对外公开的方法上.
命名方面要注意的是要根据扮演的角色,作用域来命名,比如fCount是字段,lCount是局部.Result表示方法的返回值,Each表示迭代的临时元素等等.
通用状态和可变状态,通用状态就是把一组状态包装在一个新对象里,这个新对象作为该对象的属性存在.可变状态一般用在判断上,当字段改变的时候才会使用到其他某些字段的时候用.比如当四边形有外框的时候才会提供外框的长宽字段.
当多个方法的参数传入同一个内容,应该设置从构造方法里传入该内容.
初始化分为及早初始化和延迟初始化.及早初始化认为初始化应该放在声明的时候,方便阅读.其实放在构造方法里也是OK的.延迟初始化说明只有使用的时候再初始化,通常是在方法内.但我认为若多个方法调用这个变量,那就需要及早初始化,不然过多的逻辑判断是否为null还是会增加消耗.
行为,也就是语句.
第一个比较有意思的概念就是太大的方法体应该重构成大方法里包含多个小方法,这样方便阅读.在大方法中若出现语句也应该把语句包装在小方法内.
第二个就是卫述句,要求在控制流转的时候尽量让重要的判断放在最前面.比如多个嵌套if,应该可以改成多个并列的if.
方法,内容有些重复,比如说组合方法就是大方法体里包含小方法.
关于命名:命名要根据使用者的角度来命名.private只提供给本类用,那就用底层的命名.public应该设置为外部使用者懂的语句,跟我以前想法最大的差别就是get,set方法都必须重写以便外部理解.get和set里暴露里内部属性的名字,确实应该重写.
布尔值的setting方法 这个方法一看就知道对象有两种状态,也就是状态里的可变状态.应该采用valid和invalid两个方法来表示set
安全副本 多个变量引用同一个内存地址就会出现别名问题.所以应该尽量避免这种情况.最好的办法就是赋值的时候不应该赋值引用,而是创建新的内容相同的内存空间,然后把引用给变量.
比如get方法里不应该直接return该属性,而是应该创建一个副本,把副本给他.set方法里也是一样.不应该直接把参数里的引用指向字段,而是应该先把参数做个副本,副本给字段.