SICP-2.2-數據的抽象
阿新 • • 發佈:2017-06-24
implement 通過 兩個 誤差 gcd 功能 組合 whole 模塊
數據的抽象
生活中有許多的事物具有復合結構,例如地理位置所用的經緯度,便是通過一個復合結構來代表位置,在我們的程序當中,我們設法將經度緯度組合成一對,我們既可以把他們當做一個整體單元來進行操作,而且也可以將他們視為獨立的兩個部分。這樣便提高了我們程序的抽象化和模塊化程度,我們便可以對於數據的各個部分進行隔離處理。使得程序更易於設計,維護,和修改。
數據的抽象化和函數的抽象化一樣,可以使具體的實現細節封裝起來。
數據的抽象化後有兩部分:
- 對於抽象化數據的操作
- 抽象化數據的具體實現細節
例子——有理數:
-
- 有理數是任意整數的比值
- 但由於浮點逼近的存在,會使存在誤差
- 有理數復合結構的構建:
- 假設有理數的復合結構已經構建完成
- 我們可以精確表示有理數
- 任意一個有理數,我們有辦法選擇他的分子和分母
- 有理數加,減,乘,除的實現
-
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):
-
- 復合結構的構建
- 使用list結構
- list的兩種訪問方式
- 多重分配法
-
>>> pair [10, 20] >>> x, y = pair >>> x 10 >>> y 20
-
- 多重分配法
-
-
- 下標訪問法
-
>>> pair[0] 10 >>> pair[1]
-
- 下標訪問法
-
>>> 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-數據的抽象