热门问题
时间线
聊天
视角

抽象倒置

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

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