1. 程式人生 > >SICP-2.2-數據的抽象

SICP-2.2-數據的抽象

implement 通過 兩個 誤差 gcd 功能 組合 whole 模塊

數據的抽象

生活中有許多的事物具有復合結構,例如地理位置所用的經緯度,便是通過一個復合結構來代表位置,在我們的程序當中,我們設法將經度緯度組合成一對,我們既可以把他們當做一個整體單元來進行操作,而且也可以將他們視為獨立的兩個部分。這樣便提高了我們程序的抽象化和模塊化程度,我們便可以對於數據的各個部分進行隔離處理。使得程序更易於設計,維護,和修改。

數據的抽象化和函數的抽象化一樣,可以使具體的實現細節封裝起來。

數據的抽象化後有兩部分:

  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-數據的抽象