对象和数据结构

  这两个概念还是比较抽象的,幸好最近看了一些相关的书,怕忘了,索性记下来。。。

  主要说说两者的差异:对象把数据隐藏于抽象之后,曝露操作数据的函数。数据结构曝露其数据,不提供有意义的函数。可以看出,两者是截然对立的,这说明了对象与数据结构之间的二分原理:过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数,面向对象代码便于在不改动既有函数的前提下添加新类型。所以,对于面向对象较难的事,对于过程式代码较容易,反之亦然。曾听老练的程序员说过:一切都是,对象只是一个传说(够拉风的。。。)。

  代码说事:

string FilePath = A.GetB().GetC().GetAbsolutePath();

  针对上面一行代码分析,显然,这句代码不是很好,可以参考一下OO设计原则——最少知识原则(这个原则也有另一种说法-德墨忒耳律:模块不应了解它所操作对象的内部情形,这意味着对象不应该通过存取器曝露其内部结构,因为这更像是曝露而非隐藏其内部结构)。

  仔细分析一下,先将其拆分一下:

B b = A.GetB();

C c = b.GetC();

string FilePath = c.GetAbsolutePath();

  假使A,B,C是拥有真实行为的对象,由于对象应该隐藏其内部结构,我们就不该能够看到内部结构,这样一来,如何取得文件的绝对路径?

方案一:string FilePath = a.GetAbsolutePath();

方案二:string FilePath = a.GetB().GetAbsolutePath();

  方案一可能导致A对象中方法的曝露;方案二是在假设GetB()返回一个数据结构而非对象。这两种方案都还行,但都不是特别好。

  如果A是一个对象,就应该要求它做点什么,而不该要求它给出内部情形,上面的两个方案都是要求从对象A中获取内部东西。

  假设,该方法的初衷是为了创建指定名称的临时文件(虽有点牵强,但要表达的意思就是对象应该是做事的,而不是曝露内部东西的)。所以接下来,直接让A对象来做这件事(创建指定名称的临时文件)。

  File file = a.CreateFile(FilePath);

  这样看起来就像是对象做的事了。。。

  若果我就想要获取路径呢,可以参考下数据结构(上面方案一中,如果a是一个数据结构的话,还是可以的。。。)

原文地址:https://www.cnblogs.com/hachun/p/3599223.html