今天与大家分享的套用odoo底层框架,开发自己的业务系统时的一种设计思路,这个说起来有点抽象,所有文章标题看起来有点奇怪。但不影响后面的阅读理解。
所谓开局一张图,内容全靠编。我们就先来看看一张手绘图:
这个图的意思,就是说我们开发的业务代码全部直接继承自odoo的底层源码。这样的设计会带来很多问题或者说是不便利。最直观的感受就是自已的代码难以跟着Odoo的底层版本升级,你看在odoo8之前定义数据模型是继承的osv.osv,后面版本改为了models.Model,底层框架的不断变化严重影响周边二开的源码及时同步更新。
在面向对象的程序设计中,有一个原则是”低耦合、高内聚“。解耦就是要降低两个对象之间的耦合度,避免一个对象发生变化后,会影响到其他对象的使用。所以为了在odoo开发中减少这样的事情发生,我们有必要增加一层代码,还是来看下图:
这里增加一个”My底层框架“,就是说我们自己的源码中要分成两部分,一部分是继承自odoo底层,提供给后续业务开发的公共对象;另一个部分才是真正的业务代码。在业务代码中不直接继承odoo底层对象,而是只继承My底层框架的对象。
还是举个例子来说明一下,在Odoo8之前,定义数据模块是继承osv.osv,然后我们自己开发了几百个数据模型了,都是继承自osv.osv的。好啦,现在要升级了,新的定义改为了继承models.Model,那之前开发的几百个业务数据模型是不是都要去改一次?还有可能改错。
如果按照我们新的设计方法,我们继承osv.osv后,创建了一个自己的对象,比如 myosv = osv.osv,并且原来开发的几百个数据模型都是继承自myosv,这样版本升级以后,我只要把myosv = models.Model即可,后面的业务模型都不用动了。
当然建立这一个My底层框架的好处并不只是这一个,在这个框架中,我们可以封装一些属于自己业务的公用方法,公用装饰器等。这就相当于属于公司自己的开发工具库。
多了这一层缓冲的核心架构,会让你的系统变得更加灵活,不会与其它外象有一个高耦合。而且在这一层也相当一个通信拦截的中间人,只要你敢想,就可以实现无限可能。