0
点赞
收藏
分享

微信扫一扫

代码整洁之道----对象和数据结构


1、将变量设置为私有有一个理由:我们不想其他人依赖这些变量。我们还想在心血来潮时能自由修改其类型或实现。但是还有有很多程序员给对象自动添加赋值器和取值器,将私有变量公之于众、如同他们根本就是公共变量一般。


2、实际上,基本变量都是私有,而且我们也通过变量取值器和赋值器使用变量,其实现仍暴露了。


3、隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象。类并不简单地用取值器和赋值器将其变量推向外间了,而是暴露了抽象接口,以便用户无需了解数据的实现就能操作数据本体。


4、我们不愿暴露数据细节,更愿意以抽象形态表述数据。这并不只是用接口和/或赋值器、取值器就万事大吉。要以最好的方式呈现某个对象包含的数据,需要做严肃的思考。傻乐着乱加取值器和赋值器,是最坏的选择。


5、对象与数据之间的二分原理:过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数,面向对象代码便于在不改动既有函数的前提下添加新类。反过来说也说得通:过程式代码难以添加新数据结构,因为必须修改所有函数,面向对象代码难以添加新函数,因为必须修改所有类。所以,对于面向对象较难的事,对于过程式代码却较容易,反之亦然。


6、在任何一个复杂系统中,都会需要添加新数据类型而不是新函数的时候。这时,对象和面向对象就比较合适。另一方面,也会有想要添加新函数而不是数据类型的时候。在这种情况下,过程式代码和数据结构更合适。


7、著名的得墨忒耳律认为,模块不应了解它所操作对象的内部情形。对象隐藏数据,暴露操作。这意味着对象不应通过存取器暴露其内部结构,因为这样更像是暴露而非隐藏其内部结构。


8、更准确地说,得墨忒耳律认为,类C的方法f只应该调用以下对象的方法:


C、由f创建的对象、作为参数传递给f的对象、由C的实体变量持有的对象。


9、方法不应调用由任何函数返回的对象的方法。换言之,只跟朋友说话,不与陌生人谈话。


10、如果数据结构只简单地拥有公共变量,没有函数,而对象拥有私有变量和公共函数,这个问题就不那么混淆。然而,有些框架和标准甚至要求最简单的数据结构都要有访问器和改值器。


11、最为精炼的数据结构,是一个只有公共变量、没有函数的类。这种数据结构有时被称为数据传送对象,或DTO。DTO是非常有用的结构,尤其是在与数据库通信、或解析套接字传递的消息之类场景中。在应用程序代码里一系列将原始数据转换为数据库的翻译过程中,它们往往是排头兵。


12、豆结构拥有由赋值器和取值器操作的私有变量。对豆结构的半封闭会让某些OO纯化论者觉得舒服些,不过通常没有其他好处。


13、Active Record是一种特殊的DTO形式。它们是拥有公共变量的数据结构,但通常也会拥有类似sava和find这样的可浏览方法。Active Record 一般是对数据库表或其他数据源的直接翻译。


14、对象暴露行为,隐藏数据。便于添加对新对象类型而无需修改既有行为,同时也难以在既有对象中添加新行为。数据结构暴露数据,没有明显的行为。便于向既有数据结构添加新行为,同时也难以向既有函数添加新数据结构。


15、在任何系统中,我们有时会希望能够灵活地添加新数据类型,所以更喜欢在这部分使用对象。另外一些时候,我们希望能够灵活地添加新行为,这是我们更希望使用数据类型和过程。优秀的软件开发者不带成见地了解这种情形,并依据手边工作的性质选择其中一种手段。


* 以上内容是看《代码整洁之道》[美·马丁] 第六章 对象和数据结构 的总结



举报

相关推荐

0 条评论