热门问题
时间线
聊天
视角
抽象倒置
来自维基百科,自由的百科全书
Remove ads
抽象倒置(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資料型態當迴圈變數,而不使用更直接的整數。
Remove ads
相關條目
參考資料
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads