1、数据抽象
我们平时在写实体类的时候通常会把类的成员变量定义成private的,然后提供相应的get和set方法供外部调用来实现对该对象的属性修改,而不是直接的操作成员变量。这种做法体现了java的封装性,不想暴露内部结构(实际上还是暴露了)。这种想法个人觉的和对外提供接口的想法有点类似,不需要暴露具体实现,只需要提供必要的参数,我就返回相应的结果。
隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象!类并不简单地用取值器和赋值器将其变量推向外间,而是暴露抽象接口,以便用户无需了解数据的实现就能操作数据本体。
理解:模块不应该了解它所操作对象的内部情形。对象应该暴露行为,而不是数据。
2、数据、对象的反对称性
对象把数据隐藏于抽象之后,暴露操作数据的函数;数据结构暴露其数据,没有提供有意义的函数。
过程式代码便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类。
反过来说:
过程式代码难以添加新数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类。
所以,对于面向对象较难的事,对于过程式代码却比较容易,反之亦然!
3、得墨忒耳律
规则:对象 O 的 M 方法,可以访问/调用如下的:
1. 对象 O 本身
2. M 方法的传入参数
3. M 方法中创建或实例化的任意对象
4. 对象 O 直接的组件对象
5. 在M范围内,可被O访问的全局变量
好处:
• 我们可以更改一个类,而无需因连锁反应再去改许多其他的(类)。
• 我们可以改变调用的方法,而无需改变其他任何东西。
• 遵从LOD,让测试更容易被构建。我们不必为了模拟而写很多的’when’和各种return。
• 提高了封装和抽象。
• 基本上,我们隐藏了“xx是如何工作的”。
• 让代码更少的耦合。主叫方法只耦合一个对象,而并非所有的内部依赖。
• 它通常会更好地模拟现实世界。想想钱包与付款的那个比喻。
(ImportNew:http://www.importnew.com/10501.html)
law of demeter, LKP最少知道原则:一个对象应当对其他对象又尽可能少的了解,不和陌生人说话。也即是方法不应该调用由任何函数返回对象的方法。
4、数据传送对象
最为精炼的数据结构,是一个只有公共变量、没有函数的类。这种数据结构有时被称为数据传送对象,或DTO。