fhjxp同学在看完我的Struts2.0+Spring+Hibernate的在线音乐系统的代码时:
fhjxp 写道
引用
看了一下源码,问一下,dao,service定义每个都定一个接口有什么用啊?有什么好处?
基于接口而不是类编程,这样Service层依赖于dao层的接口而不是实现,可以方便的替换dao的实现。基于接口 编程提供了可插拔的松耦合的编程方式。Spring倡导基于接口编程的方式,这是一种良好的编程习惯,在Spring中使 用接口是自然的,被鼓励的。
fhjxp 写道:
引用
你的回答里面我只看到一个理由:方便替换实现。为什么要松耦合、面向接口、好习惯还是为了这个。
真的方便了么?
1,首先说90%以上的项目,都不存在另外作多套Dao,Service需要进行切换,我接触过到的项目(开发时间近三年)都没有遇到过这个情况,偏偏每个项目都要搞了接口,不管开发还是维护都没有得到什么好处。
2,如果某个service方法要修改具体实现,不管有接口还是没有接口都需要同样的修改代码。如果还需要修改方法的名称或参数,同时还得修改接口类,得改两处,反而麻烦了。
1、我曾经参加过一个项目,原来使用Hibernate,从这个项目派生出一个项目要用JPA,有了DAO接口就可以方便替换了,否则,你在每个Service中找使用的HibernateDAO,然后改成现在的JPA实现的DAO,这是一个烦琐而易出错的事情,这就是依赖于具体实现的害处。
接口作为一种契约,其他使用你代码的人只需要知道你接口中提供的方法,就可以使用你的代码了,而接口通常是方法的最小子集(要暴露给用户使用的部分)。如果你只有实现类,往往会让使用你代码的人陷于细节,自己查找你到底暴露那些方法给我用。维护方面,如果你的实现需要很大改动的时候,有了接口别人在修改你代码的时候,就会知道我只要实现了你定义的接口的功能就ok了,其他的细节和我无关。
2、你所说的得改两处,是因为接口没有定义好,改动两处当然是不可避免的。如果你没有接口,别人要修改的话,他都不知道他的改动对其他部分的影响有多大,因为他很可能不知道,你要暴露什么,其他部分依赖于哪些方法。
3、基于实现类违反了面向对象的设计原则:OCP、LSP、DIP
在ThisWorld的帖子中:
ThisWorld写道:
引用
就为了OO倡导的接口跟实现分离就用IoC?不稳定的接口怎么解决?为什么不等到重构的时候再用?
接口基本上应该是稳定的,当然随着对需求的进一步理解,可能开始抽象的不够,引起接口的变动。不过这种情况下,一般只是在接口中添加内容,对其他部分影响不大。如果是在需要合并接口或其他的方式引起的接口变动,这样可能影响的范围会很大,所以开始就应该仔细设计接口。
但如果不使用IoC,接口和实现分离也是应该倡导的一个好的编程方式,如果你开始所有的都是基于类编程的,等你对需求了解深入了,项目完成大半了,再试图重构出接口,困难会非常大(本来能重构的一个等级的,而这些方法的命名因为不一致而使重构变得困难甚至不可能),除非你在设计每个类的时候就考虑,将来要和某某类抽象出接口(如果你是遇到能抽象出接口的几个类就重构出接口,那么将和开始就使用接口类似,产生不稳定的接口,甚至更糟,你看的可能太局部了,而开始就仔细设计接口,许多时候会设计出高质量的接口)。
其实接口作为一种协议、规范,大家在写代码的时候就会遵循这个规范去写实现类,如果开始没有了这个规范,就会乱做一团。
所以我感觉关键是在开始就要仔细的设计接口。
分享到:
相关推荐
而面向接口编程则是实现这些原则的一种手段,特别是它强调了多态性的应用,从而帮助开发者构建更加解耦和灵活的系统。 3. **编程实例**:以一个简单的“移动存储设备模拟”为例。假设我们需要创建一个系统来管理...
面向接口编程是一种重要的软件设计原则,它强调程序之间的交互应当基于接口而非具体的实现类。这一概念在面向对象编程(OOP)中占据了核心地位,尤其是对于构建可扩展、灵活和可维护的系统至关重要。以下是对面向...
"基于FPGA的PS2接口编程" 本资源主要讨论了基于FPGA的PS2接口编程,涉及到PS2键盘接口的设计、Verilog编程和数字信号处理等方面。 1. PS2键盘接口设计 PS2键盘接口是一种双向同步串行通信协议,使用时钟信号和...
#### 非接口编程 vs. 面向接口编程 非接口编程通常指的是面向过程的编程思想或者是那些没有明确区分接口与实现的编程方式。在非接口编程中,开发者往往直接操作具体的类和方法,而不会特意去定义一个接口。这种方式...
基于SOCKET编程接口的局域网即时通信系统的开发实现基于SOCKET编程接口的局域网即时通信系统的开发实现基于SOCKET编程接口的局域网即时通信系统的开发实现基于SOCKET编程接口的局域网即时通信系统的开发实现
面向接口编程是一种编程范式,它基于面向对象编程的思想,但更强调通过接口来定义对象的行为,而不是具体实现。接口在这里扮演着规范和契约的角色,定义了一组方法签名,但不包含任何实现代码。这种编程方式允许代码...
面向接口编程是一种软件设计策略,它强调程序组件之间的交互应基于接口而非具体实现。在C#、ASP.NET和Visual Studio的开发环境中,这种编程范式是构建可扩展、灵活和可维护的应用程序的关键。以下是对这个主题的详细...
MyBatis 3.x版本开始引入了接口编程模型,这是对传统基于XML配置的SQL映射方式的一种改进。接口编程模型允许我们将SQL语句与Java代码分离,通过定义接口并在其中声明方法,来代表数据库的操作。这样,我们的业务逻辑...
在"基于COM组件的VB与MATLAB接口编程"中,我们将探讨如何通过COM组件将VB和MATLAB结合,使得VB能够调用MATLAB的计算功能,从而增强VB应用程序的计算能力。以下是一些关键知识点: 1. **MATLAB Engine for COM**:这...
面向接口编程是一种编程范式,它强调程序的组件应该通过接口进行交互,而不是直接依赖具体的实现类。在C#中,接口(Interface)是定义行为规范的类型,它不包含任何实现,只定义了方法、属性、事件和索引器的签名。...
基于Matlab接口编程的天体视位置解算.pdf
基于Winpcap编程实现抓包实验 本文主要介绍基于Winpcap编程实现抓包实验的设计目标、实现步骤、系统流程图和所需函数等。Winpcap是Windows平台上的一种网络嗅探器,通过编程可以实现对网络数据的捕获和分析。 一、...
“phoenix”是基于http接口,支持拓展实现监控其它编程语言编写的程序,主要用于监控应用程序、服务器、数据库、网络、tcp端口和http接口,在发现异常时实时推送告警信息,并且提供了可视化系统进行配置、管理、查看...
WinSock 是Windows 操作系统下的Socket 编程接口,通过WinSock 函数库可以实现基于TCP/IP 协议的进程之间通信。Wireshark 是一个网络分析工具,可以利用该工具捕获本机网络出口处的网络流量(网络包)。 实验要求: ...
在本文中,我们将深入探讨如何在STM32F103ZET微控制器上移植LWIP(Lightweight IP)协议栈,并利用sequential编程接口来实现一个TCP服务器。STM32F103ZET是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M3...
### 基于Python的混合语言编程及其实现 #### 概述 本文旨在探讨如何在Visual C++(简称VC)平台上实现混合语言编程,特别是Python与其他编程语言(如C++)之间的集成与交互。混合语言编程是指在一个项目中同时使用...
基于SPI的串行接口编程器设计.kdh spi的经典 易学spi 接口
《DSP2812基于MATLAB模块化编程的SPWM调制实现》 该文档讲述了如何使用MATLAB的Simulink模块化编程方法,结合TI公司的TMS320F2812 DSP,实现SPWM(Sine Pulse Width Modulation)调制。DSP2812是一款32位定点DSP...
总的来说,基于Visual C++的计算机接口通讯编程是一个涵盖广泛主题的领域,包括硬件接口的理解、Windows API的使用、C++编程技巧以及调试和优化策略。通过深入学习和实践,开发者能够创建高效、可靠的接口通信解决...
本程序基于Socket API编程接口实现的作为TCP并发服务器使用 ,能够同时接受多个客户端的连接,连接后不断的给客户端发送字符串。固件程序为TCP服务器,默认IP为192.168.1.30,端口19。通过修改MEMP_NUM_NETCONN的值...