跳轉到內容

面向物件程式設計/抽象屏障

來自華夏公益教科書,開放世界開放書籍

抽象屏障

[編輯 | 編輯原始碼]

資料抽象

[編輯 | 編輯原始碼]

資料抽象背後的理念是識別資料表達和操作的特定方式或操作。完成此操作後,目標是僅在操作資料時使用這些操作。限制操作的使用,可以更容易地更改抽象資料的表示,而不會更改程式的行為。 [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]]

同樣錯誤,因為它做了額外的假設,即有理數表示為雙元素列表。這將被視為兩次抽象屏障違規。

簡而言之,抽象屏障使程式更容易維護和修改,因為使用盡可能少的函式來表示操作,因此需要對程式碼進行的更改更少,以更改其表示。記住,簡單比複雜更好,尤其是在抽象屏障方面。

資料的屬性

[編輯 | 編輯原始碼]

參考文獻

[編輯 | 編輯原始碼]
  1. [1], 資料抽象
華夏公益教科書