基于接口而非实现编程---推己及人

前言

上篇我们讲了抽象类和接口,也说了他们的使用场景,这里我们通过实战感受下他们的使用。引出今天的主题:基于接口而非实现编程。这个原则非常重要,是一种非常有效的提高代码质量的手段,在平时的开发中经常被用到。

首先这里的接口不是指Java的Interface,他是一种抽象的概念,比如服务端提供给前端的接口,只是一种协议和约定,包含Java抽象类和接口。面向接口编程远早于Java的面世,所以他是一种普适的编程思想。

一般来说越抽象越能涵盖更多的场景和变化,抽象的最高境界就是“无象”,正因为无象所以能包罗万象。抽象的使用总结就一句话,将接口和实现相分离,封装不稳定的实现,暴露稳定的接口。(将确定性留给别人,将不确定性留给自己)。
看下面的例子:
我们要实现一个文件存储的功能,需要将文件存储到磁盘中,代码实现如下:

public class FileSave {
   public void initDisk(){
     System.out.println("初始化磁盘!");
   }
   public String saveFileToDisk( File file, String name ){
     System.out.println("存储文件到磁盘!");
   }
   public String readFileFromDisk( String name ){
     System.out.println("从磁盘读取文件!");
   }
}

好了,上面的类实现了所需要的功能,咋一看没有问题。但是突然有一天,需求变了,要求所有的文件都要保存在Oss上,这个时候来看这段代码,他的修改会有巨大的工作量和风险,怎么修改呢。

存在的问题
1、修改方法中代码的实现,这个不是问题。
2、需要修改方法名,因为目前这个方法名太过具体,不适用于保存到Oss的场景,所以需要修改。可是工程中有几百上千次的调用,一一改动就有巨大的风险和工作量。
3、这个initDisk方法本来应该对别人无感,但是你暴漏了这个方法,没有做好封装,其他人可能也调用了,这时候也要修改。有了额外的工作量和风险,回归的时候还存在文件内部初始化,外部初始化等多种场景,回归工作量很大。

上面所有问题的根因就是他忽略了抽象,代码具体化到了磁盘,使其失去了扩展性。

如果我们在实现的时候考虑和以后的扩展性,就可以完美解决这个问题。代码如下:

public interface FileSaveI {
   String saveFile( File file, String name );
   String readFile( String name );
}


public class FileSave implements FileSaveI {
  
  public void init(){
    System.out.pintln("初始化");
  }
  public String saveFile( File file, String name ){
    System.out.pintln("保存文件");
  }
  public String readFile( String name ){
    System.out.pintln("读取文件");
  }
}

如果一开始我们就用了上面的实现,进行了抽象,再修改到Oss就没有任何问题了,只需要重新写一个实现了FileSaveI的类即可。其他的地方都不用改动,大大降低了工作量和风险。这就是面向接口编程的好处。

还是那句话:接口是确定的,所以留给其他人调用,而接口的实现是不确定的,所以留给自己实现。

总结

1、实现要抽象,保留以后的扩展性。
2、方法名只暴漏功能,不要带细节,因为细节会变。(有人说方法也可能会变,但是方法变化的频率远第一实现,而且方法变化之后我们可以重载实现)
3、实现细节一定要封装好,比如上面的init,这根本不需要外部调用就不要开出去,否则别人误用会造成不可预见的风险。

提醒

有句话说过犹不及,我们也不能为了追求抽象就将所有的类都实现接口,这样也会导致代码复杂可读性差,要在两者之间取得平衡。

将接口和实现相分离,封装不稳定的实现,暴露稳定的接口。上游系统面向接口而非实现编程,不依赖不稳定的实现细节,这样当实现发生变化的时候,上游系统的代码基本上不需要做改动,以此来降低代码间的耦合性,提高代码的扩展性。

从这个设计初衷上来看,如果在我们的业务场景中,某个功能只有一种实现方式,未来也不可能被其他实现方式替换,那我们就没有必要为其设计接口,也没有必要基于接口编程,直接使用实现类就可以了。

除此之外,越是不稳定的系统,我们越是要在代码的扩展性、维护性上下功夫。相反,如果某个系统特别稳定,在开发完之后,基本上不需要做维护,那我们就没有必要为其扩展性,投入不必要的开发时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值