热门问题
时间线
聊天
视角
抽象倒置
来自维基百科,自由的百科全书
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