软件开发中的形式主义--基于接口的编程
博客专区 > loveczp 的博客 > 博客详情
软件开发中的形式主义--基于接口的编程
loveczp 发表于4年前
软件开发中的形式主义--基于接口的编程
  • 发表于 4年前
  • 阅读 473
  • 收藏 17
  • 点赞 0
  • 评论 11

腾讯云 技术升级10大核心产品年终让利>>>   

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

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

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

有过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. 增加目录里的文件数量

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

共有 人打赏支持
loveczp
粉丝 14
博文 11
码字总数 10294
作品 1
评论 (11)
ForJustice
同感!
xz2001
你不是爱因斯坦,不要总以为自己才是对的。你不喜欢可以换种方式。既然你自己都说接了几个项目都是这种结构,难道还说明不了优点么?
淡茗
Service定义成接口还是有必要的,跨包引用时就不能用访问域修饰符来限定了。还有现在是本地实现,说不定哪天改成RPC了,这时接口的作用就体现出来了。
loveczp

引用来自“xz2001”的评论

你不是爱因斯坦,不要总以为自己才是对的。你不喜欢可以换种方式。既然你自己都说接了几个项目都是这种结构,难道还说明不了优点么?

我没有总认为自己是对的,但我起码我觉得这件事情我还是对的,如果不对请用强大的逻辑和充足的证据来说服我。
对不对这事,不是人多说了就算数的。
loveczp

引用来自“ForJustice”的评论

同感!

知音啊
loveczp

引用来自“淡茗”的评论

Service定义成接口还是有必要的,跨包引用时就不能用访问域修饰符来限定了。还有现在是本地实现,说不定哪天改成RPC了,这时接口的作用就体现出来了。

“跨包引用时就不能用访问域修饰符来限定” 为什么???
就算是改用rpc,直接更换一个实现类就可以了,为什么一定要加个interface在中间插一杠子。
淡茗

引用来自“loveczp”的评论

引用来自“淡茗”的评论

Service定义成接口还是有必要的,跨包引用时就不能用访问域修饰符来限定了。还有现在是本地实现,说不定哪天改成RPC了,这时接口的作用就体现出来了。

“跨包引用时就不能用访问域修饰符来限定” 为什么???
就算是改用rpc,直接更换一个实现类就可以了,为什么一定要加个interface在中间插一杠子。

跨包引用必须是public,这样方法就暴露了。rpc是将接口提供给远程调用者,这样的场景是必须用接口的,接口并不是像你说的一无是处,只是凡事都有个度,别滥用
lfl
接口配合配置文件才能体现其强大,更改配置就能动态更换实现,不用重新编译原有程序,实现热插把啊
loveczp

引用来自“lfl”的评论

接口配合配置文件才能体现其强大,更改配置就能动态更换实现,不用重新编译原有程序,实现热插把啊

说的有道理。

但貌似我说的跟您说的不是一回事。
peterzhai
只能说你接触的都是小项目……没有体现出作用……存在即合理……
xz2001

引用来自“loveczp”的评论

引用来自“xz2001”的评论

你不是爱因斯坦,不要总以为自己才是对的。你不喜欢可以换种方式。既然你自己都说接了几个项目都是这种结构,难道还说明不了优点么?

我没有总认为自己是对的,但我起码我觉得这件事情我还是对的,如果不对请用强大的逻辑和充足的证据来说服我。
对不对这事,不是人多说了就算数的。

你的文章标题就具有片面性!
×
loveczp
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: