抽象倒置
外观
抽象倒置(abstraction inversion)是程序设计裡的反面模式,是指使用者需要的功能在某一物件中,但未在介面中開放,結果是使用者需要用介面重新實現此功能,而不是直接使用內部的功能。這會造成用高階的介面為基礎,實現較低階功能的問題,因此稱為抽象倒置。
可能的缺點有:
- 重新實現功能的使用者可能會嚴重低估其運行成本。
- 使用者被迫用複雜的機械細節來掩蓋其實現。
- 許多使用者試圖解決同一個問題,增加錯誤的風險。
範例
[编辑]專業程式圈內抽象倒置的範例如下:
- Applesoft BASIC和Lua(針對桌上電腦組態的版本)其基礎數值型態是浮點數[1][2]。Applesoft有實現整数運算,但是是在浮点数运算的基礎上實現的,而且沒有位操作(Lua在Lua 5.2加入了)[3]。Applesoft也不支援位图的 blit,因此用Applesoft運行的遊戲和其他程式會比較慢。
- 在像Java或C++等面向对象程序设计語言中,要產生代表函式的物件很麻煩(特別在C++11之前,Java 8之前的版本),因為其函式不是頭等物件。C++可以在物件中多載
()
運算子,讓此物件像函式一樣可以呼叫。但多半還是需要實現新的類別,像是STL裡的Functors[4](C++11的lambda函式讓創建物件來代表函式變簡單了)。 - Tom Lord提到Subversion版本控制系統為了抽象倒置付出代價,其只寫的資料庫是建立在可讀寫的資料庫,因此性能不佳[5]。
- 在關聯資料庫中用存储程序來處理資料,而不是給程式設計者權限,在關聯資料庫中布署程式,因此需要在資料庫外重新實現查詢功能。例如,讀取大量的資料(極端的例子,整個表),再在應用程式中進行篩選。
- 微軟的WinUI 3會系統性的將其創建視窗的標題列改為客製版本,不會考慮終端使用者的顏色設定。若要在Windows 11中讓標題列使用終端使用者的顏色設定,需要再加入客製化程式,將其標題列改為Windows 10的客製版本[6]。
專業程式圈以外的例子有:
- 用試算表的lookup函數來複製資料庫的功能。
- 在Microsoft Visual Basic中用variant資料型態當迴圈變數,而不使用更直接的整數。
相關條目
[编辑]參考資料
[编辑]- ^ lua-users c2: Floating Point Accessed 2009-10-12.
- ^ Programming in Lua : 2.3 - Numbers Accessed 2009-10-12.
- ^ lua-users c2: Bitwise Operators Accessed 2013-01-15.
- ^ Functors in the STL
- ^ sourcefrog : Tom Lord on Subversion
- ^ Title bar customization - Windows apps | Microsoft Learn
外部連結
[编辑]- Abstraction Inversion at Portland Pattern Repository - extensive discussion, much of it taking "abstraction inversion" in the sense of "concealed complexity"