首页 > 代码库 > SICP-2.2-数据的抽象

SICP-2.2-数据的抽象

数据的抽象

生活中有许多的事物具有复合结构,例如地理位置所用的经纬度,便是通过一个复合结构来代表位置,在我们的程序当中,我们设法将经度纬度组合成一对,我们既可以把他们当做一个整体单元来进行操作,而且也可以将他们视为独立的两个部分。这样便提高了我们程序的抽象化和模块化程度,我们便可以对于数据的各个部分进行隔离处理。使得程序更易于设计,维护,和修改。

数据的抽象化和函数的抽象化一样,可以使具体的实现细节封装起来。

数据的抽象化后有两部分:

  1. 对于抽象化数据的操作
  2. 抽象化数据的具体实现细节

例子——有理数:

    • 有理数是任意整数的比值
    • 但由于浮点逼近的存在,会使存在误差
  • 有理数复合结构的构建:
    1. 假设有理数的复合结构已经构建完成
      • 我们可以精确表示有理数
      • 任意一个有理数,我们有办法选择他的分子和分母
    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)
    3. 复合结构的构建
      • 使用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-数据的抽象