热门问题
时间线
聊天
视角

抽象倒置

来自维基百科,自由的百科全书

Remove ads

抽象倒置(abstraction inversion)是程序設計裡的反面模式,是指使用者需要的功能在某一物件中,但未在介面中開放,結果是使用者需要用介面重新實現此功能,而不是直接使用內部的功能。這會造成用高階的介面為基礎,實現較低階功能的問題,因此稱為抽象倒置。

可能的缺點有:

  • 重新實現功能的使用者可能會嚴重低估其運行成本。
  • 使用者被迫用複雜的機械細節來掩蓋其實現。
  • 許多使用者試圖解決同一個問題,增加錯誤的風險。

範例

專業程式圈內抽象倒置的範例如下:

  • Applesoft BASICLua(針對桌上電腦組態的版本)其基礎數值型態是浮點數[1][2]。Applesoft有實現整數運算,但是是在浮點數運算的基礎上實現的,而且沒有位操作(Lua在Lua 5.2加入了)[3]。Applesoft也不支援位圖blit英語Bit blit,因此用Applesoft運行的遊戲和其他程式會比較慢。
  • 在像JavaC++面向對象程序設計語言中,要產生代表函式的物件很麻煩(特別在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

相關條目

參考資料

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads