写点什么

深度思考:到底什么是面向接口编程?

作者:Barry Yan
  • 2022 年 10 月 07 日
    北京
  • 本文字数:2192 字

    阅读完需:约 7 分钟

深度思考:到底什么是面向接口编程?

在以往的编程学习中,我们听说过很多编程概念,比如面向对象编程(OOP)、面向方面编程(AOP)、面向过程编程(POP),以及还有今天要进行深入思考的面向接口编程(IOP)。计算机的发展已经足足七十多年,编程语言的发展也有了六七十年的历史,而近二三十年随着互联网和高级编程语言的不断崛起,整个程序设计行业发展的越来越快,沉淀的也越来越多,因而诞生了诸如以上的很多不同的编程思想。


首先,第一个问题。

1 什么是接口?

接口一词听起来更像是一个物理学电学上的东西,比如 USB 接口、Type-C 接口等等,当然在计算机科学中也十分的常见,主要分为硬件和软件两个层面:


  • 硬件层的接口:两个硬件设备之间的连接方式和媒介

  • 软件层的接口:软件设计和应用服务不同功能层之间的通信规则


当然,在编程语言中接口还可以再细化,比如在 Java 语言中,接口是一个抽象的类,而在 Go 语言中,接口则是一种类型。


接下来,第二个问题。

2 什么是面向接口编程?

什么是面向接口编程?为什么要面向接口编程?


简单的讲,面向接口编程是一种编程规范,一种设计规范,可以更好的进行需求的定义和业务的扩展,我们可以从以下三个方面来探讨为什么要面向接口编程:


  • 开闭原则:对扩展开放,对修改关闭,接口正是如此,定义接口后不再修改,只扩展其对应的实现。

  • 依赖倒置原则:高层模块不应该依赖于低层模块,他们应该共同依赖于抽象,而这个抽象就是接口。

  • 增加抽象层、解耦:接口显然是对抽象的一个封装,能够达到解耦的目的。

2.1 业务需求分析

假设我们有一个产品经理想要与开发工程师对接需求,有的需求在数据库层面,属于数据需求,有的在业务层面,属于功能需求,这样就导致了在产品经理和工程师沟通时存在一些复杂的程度,比如产品经理要先了解每个工程师都对应的哪方面的业务需求,再与其进行需求的对接等等。



上述情况,如果是工程师数量少的话影响并不大,但是当工程师多了以后问题就会非常繁琐,因此我们需要定义一个规范,由工程师统一的回答,可以理解成为问题的提问与解释的模板,当换了工程师或换了业务之后,接口并没有换,实现依然可以扩展,这就是面向接口编程的魅力!


对于以上的需求分析,我们作出一个代码实例,因为 Java、Go 都是可以面向接口编程,因此我们对两个语言的面向接口编程都作出简单的示例:


  • 定义接口为工程师抽象,分别有 coding 和 play 抽象方法

  • 针对该抽象作出两个实现,分别是 DB 工程师和 Sys(系统)工程师

  • main 函数和 test 可以想象为产品经理对接口的实现进行查验

2.2 Java 面向接口编程实现

@Testvoid test() {    Programmer programmer = new DBProgrammer("zs");    programmer.coding("SQL");}
//接口 -> 规范interface Programmer { void coding(String code); void play(String ball);}
//DB程序员class DBProgrammer implements Programmer {
private String name;
public DBProgrammer(String name) { this.name = name; }
@Override public void coding(String code) { System.out.println("I am DB Programmer " + this.name + " and coding " + code + "."); }
@Override public void play(String ball) { System.out.println("I am DB Programmer " + this.name + " and playing " + ball + "."); }}
//系统程序员class SysProgrammer implements Programmer {
private String name;
public SysProgrammer(String name) { this.name = name; }
@Override public void coding(String code) { System.out.println("I am Sys Programmer " + this.name + " and coding " + code + "."); }
@Override public void play(String ball) { System.out.println("I am Sys Programmer " + this.name + " and playing " + ball + "."); }}
复制代码

2.3 Go 面向接口编程实现

接口


type Programmer interface {   Coding(code string)   Play(ball string)}
复制代码


ProgrammerDB 实现


type ProgrammerDB struct {   Name   string   Age    int   DBName string}
func (db ProgrammerDB) Coding(code string) { fmt.Println("I am DB Programmer", db.Name, "and I am coding", code, ".")}
func (db ProgrammerDB) Play(ball string) { fmt.Println("I am DB Programmer", db.Name, "and I am playing", ball, ".")}
复制代码


ProgrammerSys 实现


type ProgrammerSys struct {   Name    string   Age     int   SysName string}
func (sys ProgrammerSys) Coding(code string) { fmt.Println("I am Sys Programmer", sys.Name, "and I am coding", code, ".")}
func (sys ProgrammerSys) Play(ball string) { fmt.Println("I am Sys Programmer ", sys.Name, " and I am playing ", ball, ".")}
复制代码


测试


func main() {   sys := ProgrammerSys{Name: "zs"}   sys.Coding("Java")   db := ProgrammerDB{Name: "ls"}   db.Coding("SQL")}
复制代码

3 思考

到这里,讲了这么多,其实最终的总结很简单:接口的本质就是抽象和规范,接口是抽象的产物,应用于规范



使用接口可以更好的将我们的系统进行解耦,不管是多系统之间(如 RPC 框架),还是同一系统多模块之间,接口所扮演的抽象的角色都是不可替代的。


今天的分享就到这里,如有哪里理解的不够深入,请读者朋友不吝赐教哈~

发布于: 刚刚阅读数: 3
用户头像

Barry Yan

关注

做兴趣使然的Hero 2021.01.14 加入

Just do it.

评论

发布
暂无评论
深度思考:到底什么是面向接口编程?_10月月更_Barry Yan_InfoQ写作社区