由面向接口思想想到的“泛接口(非泛型接口)”思想
面向接口思想
自从我们开始接触面向对象编程,随着不断的学习,都会逐渐了解接口的含义,面向接口编程强调“定义”与“实现”的分离,我认为其本质就是“解耦两个对象的依赖关系”,最常听别人说起的想必就是“依赖倒置原则”的那两句经典的话:
- 高层模块不应该依赖于底层模块,两者都应该依赖于抽象
- 抽象不依赖于细节,细节依赖于抽象
不知道你们什么感受,反正只要提到接口这两句话我是经常听。虽然简短两句话,但都是实践总结出来的,是软件设计必须遵守的原则之一,否则一旦需求变化你的系统可能就要面临大规模重写,若要碰上不断变化的需求,恐怕你就要崩溃了。关于面向接口的详细知识,自己百度之,此处就不再赘述。
"泛接口"思想
话说前段时间某公司一直在说泛安全,说不能仅把安全局限于杀毒软件方面,要推广到整个行业。我觉得这个概念挺有想法的,突破传统安全升华到了更高的层次。那么什么是“泛接口”呢,我认为它不同于一般意义上的接口偏重于具体实现,而是上升到设计层面的一种思想,与一般接口的本质相同,“泛接口”的核心是“解耦”或者“自由互通”,体现在代码实现层面就比如各种设计模式、Spring等,解耦对象之间的依赖关系,否则会严重降低系统的维护性与扩展性;体现在数据库层面就比如用中间表(或者叫映射表)来解耦表与表的多对多关系,否则表信息与表关系严重糅合在一起,造成大量数据冗余;体现在ORM上就比如用配置文件来解耦对象与数据库表的对应关系(也可以用注解的方式)。还有MVC中URL与Action之间的路由机制,等等等等,类似这样的应用场景还有很多就不一一举例了,我们发现,以上场景中涉及到的两个“对象”之间是互不依赖的,因为都采用了某种手段将一方灵活的转换为另一方,正因为这种“解耦”或者“自由互通”的在各个地方都有使用,因此将其进行抽象,就得出了“泛接口”思想。说到这里恐怕你还是云里雾里,尼玛它到底是什么啊,好吧,上图(这张图不一定合理,自己瞎画的,各位就凑合着看吧,哈哈):
总之,“泛接口”好比一个方法论,或者指导思想,当面临互相依赖的两个“对象”的时候通过某种手段进行互相解耦或连通,这里的“对象”不仅仅是类,还可以是模块或其他任何事物。在具体应用中,“泛接口”要结合具体业务场景落地为具体实现手段,以达到两个“对象”的自由互通。拿上面那些例子来说,“路由机制”实现了URL对象与Action对象的互通;“配置文件+相应算法”实现了类对象与表对象的互通,等等,这里“路由机制”和“配置文件+相应算法”就是“泛接口”思想落地后的具体方法。也许你会觉得这种“具体处理方法”才是最重要的,它才是实现对象互通的关键,对于具体业务场景来说的确如此,但是这种“具体方法”总是局限在一定范围内的,当你将其抽象到一定高度之后,你会发现这种思想也许可以不仅仅应用在软件开发方面,放到生活、社会甚至政治中都是可以的,就好比大陆和台湾不也在相应政策框架下实现了互通吗。
“泛接口”的实际意义,其实它只是一种解决问题的抽象思想,就犹如哲学中的方法论,你学习了方法论就一定能在面对问题时将其转换为具体处理方法吗,真不一定,还要在实践中多锻炼自己,通过经历使自己真正领悟其精华才能更好的来指导自己做事。
“泛接口”思想的一个具体应用
下面拿一个具体应用来说明“泛接口”的落地过程,既然“泛接口”要解耦,就要弄清楚哪里有耦合,针对具体问题具体处理,在这个应用模块中,我们要将多种文件的元数据格式进行相互转换,面临的问题主要是源格式与目标格式复杂的复杂对应关系,如下图左所示,为了解耦引入中间格式,使各种格式都依赖于中间格式,降低繁多的对应关系,如下图右所以:
通过这种方式可以将N方级别降低到N的线性级别,但此时耦合依然存在,源与目标都依赖于中间格式,由于特殊需求需要将中间格式存放在数据库中,那么一旦遇到表信息的更改或者数据库迁移问题,整个模块就无法运行了,必须重新修改。为了解除这种依赖,我们引入映射关系,通过映射文件描述各种格式和中间格式的映射关系,然后实现每种格式的转换算法,通过调用“映射处理模块”获取不同格式与中间格式的元数据对应关系,传入具体算法中进行格式转换处理。这样的话,前面的那种依赖关系被完全转移到了“映射文件”中,如果添加新的格式,只需要在映射文件中添加相应的映射关系,并编写该格式对应的转换算法,完全不影响以前的代码。具体应用时还可以将映射关系加载到缓存中,降低IO操作,提高程序的灵活性与扩展性。这样就形成了一个通用的格式转换模块,整体结构图如下所示:
上图这种做法可以自由的将不同格式进行互相转换,图片的上半部分相当于“泛接口”思想落地后的具体策略,源格式通过该策略转换为目标格式。该策略思想还可以应用于数据迁移中,只不过可能要设置复杂的映射关系来描述各个对象。
总结
"泛接口"是从多个应用中抽象出来的一种“解耦或互通”思想,在遇到具体问题时还需具体分析,然后落地为具体方法。所以最重要的还是需要我们在实践中不断锻炼,通过自己的努力将抽象理论转换为具体方法,然后运用到实际应用中。通过反复的理论指导与实践求证,将领悟到的东西转换为自己的思想。