SICP-2.2-数据的抽象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SICP-2.2-数据的抽象相关的知识,希望对你有一定的参考价值。
数据的抽象
生活中有许多的事物具有复合结构,例如地理位置所用的经纬度,便是通过一个复合结构来代表位置,在我们的程序当中,我们设法将经度纬度组合成一对,我们既可以把他们当做一个整体单元来进行操作,而且也可以将他们视为独立的两个部分。这样便提高了我们程序的抽象化和模块化程度,我们便可以对于数据的各个部分进行隔离处理。使得程序更易于设计,维护,和修改。
数据的抽象化和函数的抽象化一样,可以使具体的实现细节封装起来。
数据的抽象化后有两部分:
- 对于抽象化数据的操作
- 抽象化数据的具体实现细节
例子——有理数:
-
- 有理数是任意整数的比值
- 但由于浮点逼近的存在,会使存在误差
- 有理数复合结构的构建:
- 假设有理数的复合结构已经构建完成
- 我们可以精确表示有理数
- 任意一个有理数,我们有办法选择他的分子和分母
- 有理数加,减,乘,除的实现
-
def add_rationals(x, y): nx, dx = numer(x), denom(x) ny, dy = numer(y), denom(y) return rational(nx * dy + ny * dx, dx * dy) def mul_rationals(x, y): return rational(numer(x) * numer(y), denom(x) * denom(y)) def print_rational(x): print(numer(x), ‘/‘, denom(x)) def rationals_are_equal(x, y): return numer(x) * denom(y) == numer(y) * denom(x)
-
- 复合结构的构建
- 使用list结构
- list的两种访问方式
- 多重分配法
-
>>> pair [10, 20] >>> x, y = pair >>> x 10 >>> y 20
-
- 多重分配法
-
-
- 下标访问法
-
>>> pair[0] 10 >>> pair[1] 20
-
- 下标访问法
-
>>> def rational(n, d): return [n, d] >>> def numer(x): return x[0] >>> def denom(x): return x[1]
约分的实现:
>>> from fractions import gcd >>> def rational(n, d): g = gcd(n, d) return (n//g, d//g)
-
- 假设有理数的复合结构已经构建完成
抽象壁垒:
Parts of the program that... | Treat rationals as... | Using only... |
---|---|---|
Use rational numbers to perform computation | whole data values | add_rational, mul_rational, rationals_are_equal, print_rational |
Create rationals or implement rational operations | numerators and denominators | rational, numer, denom |
Implement selectors and constructor for rationals | two-element lists | list literals and element selection |
在此表格中的每一层中,高一层都通过调用低一层的功能来实现
作用
这样可以使得程序更易于维护,譬如即使我们更改了有理数的表示方法,也不必对相对于其的高级功能进行改动。
总结:
数据抽象化的复合结构:
通过选择器与构造函数来实现有效表示
数据抽象化各层之间存在着壁垒
以上是关于SICP-2.2-数据的抽象的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段