读Clean Code - 数据结构和对象

简介:

     最近在上下班挤公交的时间细阅Clean Code(代码整洁之道),再次佩服Bob大叔幽默的文笔,独到的观点和理解视角。最让我耳目一新的是Bob大叔对数据结构和对象的解释。

     总的说来数据结构指的就是数据的载体,暴露数据,而几乎没有有意义的行为,你应该在尖叫这不是贫血类?的确这和我们的贫血类很相似。最常见的应用在分布式服务,以wcf,webservice,reset之类的分布式服务中不可或缺的数据传输对象(DTO)模式,DTO(Request/Response)就是一个很典型的数据载体,只存在简单的get,set属性,并且更倾向于作为值对象存在。而对象则刚好相反作为面向对象的产物,必须封装隐藏数据,而暴露出行为接口,DDD中领域模型倾向于对象不仅在数据更多暴露行为操作自己或者关联状态。

     虽然数据结构和对象之间看是细微的差别却导致了不同的本质区别:使用数据结构的代码便于在不改动现在数据结构的前提下添加新的行为(函数),面向对象代码则便于不改动现 有函数的前提下添加新的类。换句话说就是数据结构难以添加新的的数据类型,因为需要改动所有函数,面向对象的代码则难以添加新的函数,因为需要修改所有的类。在任何一个复杂的系统都会同时存在数据结构和对象,我们需要判断的是我们需要的是需要添加的新的数据类型还是新的行为函数。

在则就是迪米特法则,或被译为最小知识原则,不和陌生人说话:模块不应该了解他所操作的对象的内部情形,关于对象的隐藏,更细致的理解为一个对象A的方法f,应该也只能调用对象为下列范围内:

  1. 对象A的属性字段
  2. 对象A持有的对象
  3. 方法参数传入的对象
  4. 在方法f中定义的临时对象

     方法不应和任何调用方法返回的对象操作,换句话之和朋友说话,不和陌生人说话。比如:ctxt.getOptions().getSearchDir().getAbsolutePath(),就是迪米特法则的反例模式。

     但当前迪米特法则的前提是对象,如果是数据结构,没有什么行为,则他们自然会暴露其内部数据结构,迪米特法则也失效了。

     隐藏作为面向对象主要特性中的最重要特性,封装隐藏是面向对象中最重要的特性,一个好的面向对象代码肯定是对对象的内部细节做到很好的隐藏封装,封装过后才有是多态,委派之类的。一个好的面向对象的代码一定是具有很好的隐藏封装,易于测试,不稳定因素往往集中在一处很小或者固定的位置,不稳定因素的变更不会导致更大面积的修改扩散。

     最后推荐下一本书籍,值得在空闲时间看看,不能保证看完代码就一定写出整洁的代码,做到童子军军规“每次签入的代码比签出的更整洁”,更不会像优美的散文,这需要在项目实践中不断练习发现,但对代码质量意思有着引导作用。

     总感觉自己的技术还差得很远,所以我总是约束自己抽出可用的时间看些书籍,从不同的视角,不同的领域或者一些思想的提升和沉淀。

关于面向对象原则随笔还有:

  1.  面向设计原则理解
  2. (转载)一些软件设计的原则
  3. 软件架构设计箴言理解


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2012/07/12/2588896.html


相关文章
|
5月前
|
存储 缓存 Java
java如何实现一个LRU(最近最少使用)缓存? 要求:设计一个LRU缓存,支持get和put操作。当缓存满时,需要淘汰最近最少使用的元素。要求使用双向链表+哈希表的数据结构来实现,并保证get和put操作的时间复杂度为O(1)。
java如何实现一个LRU(最近最少使用)缓存? 要求:设计一个LRU缓存,支持get和put操作。当缓存满时,需要淘汰最近最少使用的元素。要求使用双向链表+哈希表的数据结构来实现,并保证get和put操作的时间复杂度为O(1)。
29 1
|
9月前
|
存储
ES6中新增的Set、Map两种数据结构怎么理解以及操作方法
Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构
|
11月前
|
C++
数据结构--栈相关操作的代码:
数据结构--栈相关操作的代码:
53 0
|
12月前
关于GreenDao更改数据结构,导致报错
关于GreenDao更改数据结构,导致报错
数据结构55-append方法实现代码
数据结构55-append方法实现代码
26 0
数据结构71-双向链表remove方法实现代码
数据结构71-双向链表remove方法实现代码
43 0
数据结构33-链表_append方法实现代码
数据结构33-链表_append方法实现代码
48 0
数据结构33-链表_append方法实现代码
数据结构105-插入和修改操作封装代码
数据结构105-插入和修改操作封装代码
64 0
数据结构44-链表update方法实现
数据结构44-链表update方法实现
40 0
数据结构43-链表update方法实现
数据结构43-链表update方法实现
41 0
数据结构43-链表update方法实现