请再看看前述的Game例子,虽然低阶抽象给予了充分的控制权,但是很多时候,我们希望写出的游戏是同时具备重绘和更新功能的。 这实现起来也不难,只需把某些部分作为参数使用:![]() startGame抽象实现了在初始化时把两个函数作为参数使用。Update函数进行状态刷新,draw函数使用DrawingContext重绘状态。这样一来,我们的例子可变为4行代码: ![]() 因此只要仔细阅读startGame的代码,按需对其进行改动,便可实现全权控制。对比于建基于一个脆弱库之上的程序,这种方式难道不更稳定可靠吗?
对于库来说,可组合属性是我们选择它而不是框架的原因之一。例如FsLab,这是一个用于F#的数据科学库(包括Deedle,Math.Net Numerics等),以单个脚本的方式链接呢其他的库(源代码)。 两个简单的例子是矩阵和框架的互转Matrix.toFrame,Frame.toMatrix。![]() 该转换操作起来是很简单的,因为Deedle框架和Math.Net矩阵都能转化为一个2维数组,所以通过数组可方便地实现两者的互转。因此,即使是很复杂的库,我们都应该为用户保留足够的库合成权以实现更强大的功能(或者改写)。 写在最后 本文着重从可组合和避免回调方面对库和框架进行比较。进一步说,框架模式不仅存在于软件,在日常生活也是经常遇到的。例如参团游,从一开始,交通、住宿、游玩行程等都已经被固定了;而自由行则类似于库的组合,任何细节都需要亲力亲为,从而实现全权控制。虽然参团游很方便,但是对于我,特别是软件开发,我还是更倾向于我的地盘我做主! |