文档章节

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

loveczp
 loveczp
发布于 2013/09/20 12:18
字数 1101
阅读 489
收藏 17
点赞 0
评论 11

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

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

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

有过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

loveczp

粉丝 13
博文 11
码字总数 10294
作品 1
武汉
程序员
加载中

评论(11)

x
xz2001

引用来自“loveczp”的评论

引用来自“xz2001”的评论

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

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

你的文章标题就具有片面性!
p
peterzhai
只能说你接触的都是小项目……没有体现出作用……存在即合理……
loveczp
loveczp

引用来自“lfl”的评论

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

说的有道理。

但貌似我说的跟您说的不是一回事。
lfl
lfl
接口配合配置文件才能体现其强大,更改配置就能动态更换实现,不用重新编译原有程序,实现热插把啊
淡茗
淡茗

引用来自“loveczp”的评论

引用来自“淡茗”的评论

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

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

跨包引用必须是public,这样方法就暴露了。rpc是将接口提供给远程调用者,这样的场景是必须用接口的,接口并不是像你说的一无是处,只是凡事都有个度,别滥用
loveczp
loveczp

引用来自“淡茗”的评论

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

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

引用来自“ForJustice”的评论

同感!

知音啊
loveczp
loveczp

引用来自“xz2001”的评论

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

我没有总认为自己是对的,但我起码我觉得这件事情我还是对的,如果不对请用强大的逻辑和充足的证据来说服我。
对不对这事,不是人多说了就算数的。
淡茗
淡茗
Service定义成接口还是有必要的,跨包引用时就不能用访问域修饰符来限定了。还有现在是本地实现,说不定哪天改成RPC了,这时接口的作用就体现出来了。
x
xz2001
你不是爱因斯坦,不要总以为自己才是对的。你不喜欢可以换种方式。既然你自己都说接了几个项目都是这种结构,难道还说明不了优点么?
嵌入式系统定制开发的分层与专业的分类

嵌入式系统这个名词还是比较难以准确定义的,一般把“用于控制、监视或者辅助操作机器和设备的装置”称为嵌入式系统,系统包括一系列软硬件设施等,比如:手机的系统开发(Android、IOS等),...

gunser
05/31
0
0
[翻译]使用PHPUnit进行测试驱动开发

发表在我的博客:http://starlight36.com/post/tdd-with-phpunit 翻译自PHPUnit官方文档 单元测试在软件开发过程中举足轻重,测试先行编程(Test-First Programming),极限编程(XP)和测试...

烫烫烫烫烫烫
2013/08/04
0
0
一个基于可重用构件的软件开发过程模型

摘要:基于构件的开发(CBD)观念已广泛应用于软件开发中,便于构件的重用。众所周知的CBD体系结构有 ActiveX, CORBA, RMI以及 SOAP 等。文章主要通过与传统软件开发方法的比较研究支持基于C...

青夜之衫
2017/12/05
0
0
区块链又有新题材了 这次是"车载区块链"

  【IT168 评论】面对比特币的疯狂,面对区块链技术的快速崛起,大多数人都抱着怀疑和观望的态度,比如国内虽然禁止比特币交易和流通,但是对于区块链技术确实鼓励和欢迎的,就如同刚开始出...

it168网站
01/29
0
0
gRPC & Protocol Buffer 构建高性能接口实践

介绍如何使用 gRPC 和 ProtoBuf,快速了解 gRPC 可以参考这篇文章第一段:gRPC quick Start。 接口开发是软件开发占据举足轻重的地位,是现代软件开发之基石。体现在无论是前后端分离的 Web ...

hww_面条酱
2017/10/28
0
0
基于嵌入式系统的机器视觉技术简析

空间有限且要求功耗较低的应用,通常是嵌入式计算机系统发挥作用的舞台。典型的例子是移动设备,从工厂中的移动测试设备到牙科扫描仪,其中运行的都是嵌入式计算机系统。嵌入式视觉也是机器人...

gunser
04/28
0
0
嵌入式视觉与传统的通用机器视觉系统的优势

空间有限且要求功耗较低的应用,通常是嵌入式计算机系统发挥作用的舞台。典型的例子是移动设备,从工厂中的移动测试设备到牙科扫描仪,其中运行的都是嵌入式计算机系统。嵌入式视觉也是机器人...

gunser
04/28
0
0
NDK学习笔记(三)SWIG:自动生成JNI代码

编写JNI封装器的代码,还有处理数据类型的转换耗时且费力,所以要用到 SWIG。 SWIG 的全称是 Simplified Wrapper and Interface Generator,它是一个开发工具,在Android Native开发中可被用...

LeoXu
2016/01/02
277
0
Java 程序员的错

编者注:可以喷语言,但不要搞人身攻击! BTW:我也是一名 Java 程序员,哈哈! Java程序员是有问题的。我使用Java编程已经有10多年的历史。同时,我还有过大量的使用其它语言开发的经历,比...

oschina
2014/07/29
7.8K
92
OOAD理论知识小结

软件工程基本概念 软件工程三要素: 方法:完成软件开发的各项任务的技术方法,为软件开发提供 “如何做” 的技术 工具:为运用方法而提供的自动的或半自动的软件工程的支撑环境 过程:为了获...

陈嘻嘻哈哈
2015/07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
4
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
165
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部