抽象(ADT)
抽象数据类型: 是指一些数据,以及对这些数据进行操作的集合.
这些操作既向程序描述了数据是怎么样的,也允许程序的其余部分改变数据
0.为什么使用抽象
假设在不存在抽象的情况下, 我们进行编程
例子: 对平面给出的 四个点的八个坐标(x,y) (m,n) (j ,k ) (d,b),来得到矩形(这里特指的是周长和面积的计算)
你可能会这么写,
x = 1 ;
y = 3 ;
j = 3 ;
k = 3 ;
d = 1 ;
b = 1 ;
m = 3 ;
n = 1 ;
// 矩形的长
length = ( j - x ) + ( k - y ) ;
如果要计算的是面积的话,你会得到这样的一堆数据集合
acrg = (( j - x ) + ( k - y )) * (( x - d ) + ( y - b ));
这样是无法做复杂的运算的
使用了抽象的情况
例子和上述相同
我们的想法,首先是想通过4个坐标的8个值,描述4条边(举这个例子并不是非常的实际,只是简单描述了一下)
topBorder = ( j - x ) + ( k - y ) ;
bottomBorder = ( m - d ) + ( n - b ) ;
leftBorder = ( x - d ) + ( y - b ) ;
rightBorder = ( j - m ) + ( k - n ) ;
// 然后你就能轻松描述出 周长和面积了
length = topBorder;
width = leftBorder;
perimeter = 2*(length+width);
acrg = length * width ;
相同, 面向对象和函数式 都是建立在这一种思想上.
1.使用抽象的好处
我们还是那上面举的那个例子来描述
隐藏实现的细节
我需要知道上面的矩形的面积, 我只要拿到 acrg 即可, 我不需要知道它是通过什么计算得来的.改动不会影响到整个程序
我修改了 x和 j 的坐标点 , 但是计算 周长 和 面试的过程还是那个过程, 只不过输出不一样了让程序的正确性显而易见
只要我保证从线到 面的每一次计算 的 正确性,那么正个程序的计算就是对的程序更具有自我说明性
我们使用了 length 和 width 去表示了 长和 宽 , 而不是一堆数值.你可以像现实世界中那样操纵实体,而不用再底层上操作它
操纵的是概念,而不用关心底层实现,当我要用长 和 宽去 计算矩形面积的时候, 我们不需要知道如何去构造 长 和 宽让接口提供更多的信息,避免混淆
m ,n 这样的数字放在别的环境中会有不同的含义,你不知道那究竟是要表达什么更容易提高性能
当然上面个计算的过程你想要再加速,
例如:
你可以将计算的周长的方法写成
perimeter = topBorder + bottomBorder + leftBorder + rightBorder ;
(计算机中 直接加法比 乘法快)
这样并不会影响到计算别的式的值.无须在程序内到处传递数据
我不需要计算面积时多次使用到 同一个 i 的值.
// 原先
acrg = (( j - x ) + ( k - y )) * (( x - d ) + ( y - b ));
// 之后
acrg = length * width ;
把常见的底层数据类型创建为抽象(一组数组的描述) 并使用这些抽象,而不再使用底层的数据类型
我们是使用 length 和 width 去计算 面积 和 周长可以在数据结构的抽象层次上在构建一个现实的抽象层次
首先我们得到了 四条边的抽象
其次 我们得到长 和 宽的 抽象
最后 我们得到了 面积 和 周长的抽象
最后
再仔细想想,将上面的表述用于程序的话, 你能得到什么?