软件开发中的形式主义--基于接口的编程

形式主义说白了就是徒有其表,或金玉其外败絮其中。用我的话来说就是装逼。

程序猿相对来说是个比较实在的群体,通常都低调朴素踏实可靠。但其实这只是表象,这群人装起逼来也让人不忍直视,这群人装起逼来不易被发现,很少被曝光,但这完全不影响他们装逼的恶心程度。程序猿每天的工作就是写代码,所以他们装的逼通常都与代码有关,显然这种装逼不为行外人理解。

装逼第一弹,面向接口的编程。

有过java编程经验的人,应该没人没听说过这个东西。面向接口的编程是要解决“实现和使用”相分离的问题,比如编写数据库访问的代码时,只需要关心jdbc的接口就完了,至于jdbc接口的mysql或oracle实现我们可以不关心,再比如,我们编写web代码时,我们只需要关心servlet接口就好了,至于servlet的tomcat实现或jetty实现我们可以不关心。还有比如collection接口,输入输出流接口等等。

很显然这样的基于接口的编程有两个好处,

  1. 可以轻松的更换实现。比如写Web代码的时候,本机调试用jetty,这样启动快和IDE能很好集成,而线上运行用jboss,运行快,稳定。

  2. 降低学习成本。比如写web代码是只需要了解servlet接口规则就好,编写数据库访问,只需要了解jdbc接口就好。这样避免学习oracle或mysql特定api的必要,只需要学习jdbc  api就可以了。


------------ but  分割线  --------------

从上面可以看出面向接口编程是一种非常好的实践。但这么好的编程实践到了程序装逼犯那里就被他们糟蹋蹂躏了。他们一听说这么个好东西就到处用,不用就好像不足以显示他们的专业和高深。

一般的项目都会有个数据库访问层也就是DAO层,还有一个业务逻辑层或者叫服务层service层。相关的代码写在dao,service目录里面就好了,但是神奇的是dao,service下面都会有一个名字为impl的目录。实际情况是dao,service目录下只有接口,而实际的实现都在impl下面。

于是会出现下面的目录结构

├─dao
│  │  UserDao.java
│  │
│  └─impl
│          UserDaoImpl.java
│
└─service
    │  UserManageService.java
    │
    └─impl
            UserManageServiceImpl.java

而且更神奇的是我接手过的5、6个项目都是这样的目录结构,换了一家公司之后发现还是这样的目录结构。问了一下项目负责人,为什么必须先定义接口然后把实现放在另外一个类里面。他们给我的答案是

  1. 申明接口,可以让使用方明确知道,哪些方法是给外部用的,哪些是给内部用的。   我去,这件事情不是访问修饰符public  private protected  该干的事吗? 怎么轮到接口去干去了。

  2. 以后的实现类可能会替换或修改,申明了接口可避免上层代码的变动。我待过的这些项目中,没有一个有替换service或dao实现类的需求,通常情况都是实现类和接口一起改,或者是实现类方法内部修改。

但是我想他们真正这样做的原因是,大家都在这么做,所以他们随大流而已,或者只是想实践一下面向接口的编程的方法,为了实践而实践。

其实这么做完全没有必要,这么做只能带来下面的问题,

  1. 增加代码行数,

  2. 增加修改成本(增加一个方法要修改两个类)

  3. 增加目录里的文件数量

求求大家以后别这么不分青红皂白的使用接口,行么。这让我想起了哪些很爱带粗金链子,镶金牙的山西煤老板,本来他们是为达到汤姆克鲁斯的效果,但哪些金链子金牙齿让他们达到的是城乡结合部洗剪吹的效果。

你可能感兴趣的:(软件开发中的形式主义--基于接口的编程)