面向物件程式設計/抽象屏障
外觀
< 面向物件程式設計
資料抽象背後的理念是識別資料表達和操作的特定方式或操作。完成此操作後,目標是僅在操作資料時使用這些操作。限制操作的使用,可以更容易地更改抽象資料的表示,而不會更改程式的行為。 [1]
在這個來自composingprograms.com的表格中可以找到一些抽象屏障的示例,它演示了不同型別的抽象屏障如何處理有理數。
| 程式的組成部分... | 將有理數視為... | 僅使用 |
|---|---|---|
| 使用有理數執行計算 | 完整的資料值 | add_rational, mul_rational, rationals_are_equal, print_rational |
| 建立有理數或實現有理數操作 | 分子和分母 | rational, numer, denom |
| 實現有理數的選擇器和建構函式 | 雙元素列表 | 列表文字和元素選擇 |
最後一列“僅使用”演示了強制執行的提取屏障。然後,從更高層呼叫這些函式,並透過更低層的抽象實現。
當一個能夠使用更高層函式的程式反而使用更低層函式時,就會發生違規。例如,在程式碼中直接引用分子和分母,而不是僅僅使用 mul_rational 函式,該函式不假設有理數的實現方式。
composingprograms.com 示例 -
>>> def square_rational(x):
return mul_rational(x, x)
正確:程式碼很簡單,不依賴於有理數的實現。
>>> def square_rational_violating_once(x):
return rational(numer(x) * numer(x), denom(x) * denom(x))
錯誤:違反了一個抽象屏障,透過直接引用分子和分母,使程式碼比需要更復雜。
>>> def square_rational_violating_twice(x):
return [x[0] * x[0], x[1] * x[1]]
同樣錯誤,因為它做了額外的假設,即有理數表示為雙元素列表。這將被視為兩次抽象屏障違規。
簡而言之,抽象屏障使程式更容易維護和修改,因為使用盡可能少的函式來表示操作,因此需要對程式碼進行的更改更少,以更改其表示。記住,簡單比複雜更好,尤其是在抽象屏障方面。