广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >为什么Service层不需要接口
  • 220
分享到

为什么Service层不需要接口

2024-04-02 19:04:59 220人浏览 八月长安
摘要

这篇文章主要讲解了“为什么Service层不需要接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么Service层不需要接口”吧!不需要接口的理由我整

这篇文章主要讲解了“为什么Service层不需要接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么Service层不需要接口”吧!

不需要接口的理由

我整理了支持 Service 层和 Dao 层需要加上接口的理由,总结下来就这么三个:

  • 可以在尚未实现具体 Service 逻辑的情况下编写上层代码,如 Controller 对 Service 的调用。

  • spring 默认是基于动态代理实现 aop 的,动态代理需要接口。

  • 可以对 Service 进行多实现。

实际上,这三个理由都站不住脚!

先说说第一个理由:上层可以在下层逻辑没有实现的情况下进行编码!很典型的面向接口编程,对层与层之间进行了解耦,看起来好像没有问题。

这种开发方式适合不同模块之间是由不同的人或项目组开发的,因为沟通的成本比较大。同时避免由于项目组之间开发进度的差异而相互影响。

不过让我们回想一下,在一般项目开发里面,有多少项目组是按层来切分开发任务的呢?实际上,大部分的项目都是按照功能划分的。

即使是现在前后端分离的情况,单纯的后端开发也是按照功能模块进行任务划分,即一个人负责从 Controller 层到 DAO 层的完整逻辑处理。

在这种情况下,每一层都先定义一个接口,再去实现逻辑,除了增加了开发人员的工作量(当然,如果代码量计入工作量的话,那开发人员应该也不是太排斥接口的),实际没有任何用处。

如果开发人员想在下层逻辑没有完成的情况下,先开发上层逻辑,可以先编写下层类的空方法来先完成上层的逻辑。

这里推荐一个个人比较喜欢的开发流程,自上向下的编码流程:

  • 先在 Controller 层编写逻辑,遇到需要委托 Service 调用的地方,直接先写出调用代码。优先完成 Controller 层的流程。

  • 然后使用 IDE 的自动补全,对刚才调用下层的代码生成对应的类和方法,在里面添加 TODO。

  • 等所有的类和方法都补全了,再基于 TODO,按照上面的流程去一个个的完善逻辑。

此方法可以使你对业务流程有比较好的理解。

对于第二个理由,就完全不成立了。Spring 默认是基于动态代理的,不过通过配置是可以使用 CGLib 来实现 AOP。CGLib  是不需要接口的。

最后一个理由是可以对 Service  进行多实现。这个理由不充分,或者说没有考虑场景。实际上在大多数情况下是不需要多实现,或者说可以使用其他方式替代基于接口的多实现。

另外,对于很多使用了接口的项目,项目结构也是有待商榷的!下面,我们结合项目结构来说明。

项目结构与接口实现

一般项目结构都是按层来划分的,如下所示:

  • Controller

  • Service

  • Dao

对于不需要多实现的情况,也就不需要接口了。上面的项目结构即可满足要求。

对于需要多实现的情况,无论是现在需要,还是后面需要。这种情况下,看起来好像是需要接口。

此时的项目结构看起来像这样:

  • Controller

  • Service

----接口在一个包中

impl ---实现在另一个包里

  • Dao

对于上面的结构,我们来考虑多实现的情况下,该怎么处理?

第一种方式,是在 Service 中新增一个包,在里面编写新的逻辑,然后修改配置文件,将新实现作为注入对象。

如下所示:

  • Controller

  • Service

---- 接口在一个包中

impl ---实现在另一个包里

impl2 ---新实现在另一个包里

  • Dao

第二种方式,是新增一个 Service 模块,在里面编写新的逻辑(注意这里的包和原来 Service  的包不能相同,或者包相同,但是类名不同,否则无法创建类。因为在加载时需要同时加载两个 Service  模块,如果包名和类名都相同,两个模块的类全限定名就是一样的了),然后修改配置文件,将新逻辑作为注入对象。

如下所示:

  • Controller

  • Service

---- 接口在一个包中

impl ---实现在另一个包里

  • Service2

impl2 ---新实现在另一个包里

  • Dao

相对而言,实际第一种方式相对更简单一点,只需要关注包层面。而第二种方式需要关注模块和包两个层面。

另外,实际这两种方式都导致了项目中包含了不需要的逻辑代码。因为老逻辑都会被打进包里。

不过,从结构上来看,实际方式二的结构要比方式一的结构更清晰,因为从模块上能区分逻辑。

那有没有办法来结合两者的优点呢?答案是肯定的,而且操作起来也不复杂!

首先将接口和实现独立开,作为一个独立的模块:

  • Controller

  • Service --- 接口模块

  • ServiceImpl

impl ---实现在另一个包里

  • ServiceImpl2

impl2 ---新实现在另一个包里

  • Dao

其次,调整打包配置,ServiceImpl 和 ServiceImpl2 二选一。既然 ServiceImpl 和 ServiceImpl2 是二选一,那  ServiceImpl 和 ServiceImpl2 的包结构就可以相同。

包结构相同了,那调整了依赖以后,依赖注入相关的配置就不需要调整了。

调整后,项目结构看起来像这样:

  • Controller

  • Service --- 接口模块

  • ServiceImpl

impl ---实现在另一个包

  • ServiceImpl2

impl ---新实现和老实现在相同的包中

  • Dao

现在,ServiceImpl 和 ServiceImpl2 模块中的包结构、类名都是一样的。那我们还需要接口模块吗?

假设,我们把 Service 接口模块去掉,结构变成了如下所示:

  • Controller

  • Service1 --- 老实现

  • Service2 --- 新实现

  • Dao

单纯的通过调整模块依赖,是否能实现 Service 的多实现?答案显而易见吧?

不使用接口的缺点

上面给出了不使用接口的理由。不过不使用接口并不是完全没有缺点的,主要问题就是在进行多实现的时候,没有一个强接口规范。

即不能通过实现接口,借助 IDE 快速生成框架代码。对于没有实现的接口,IDE 也能给出错误提醒。

一个不太优雅的解决是,将原来的模块里的代码拷贝一份到新模块中,基于老代码来实现新的逻辑。

所以,如果一个项目需要多实现、且多实现数量较多(不过一般项目不会有多个实现的),则推荐使用接口。否则不需要使用接口。

感谢各位的阅读,以上就是“为什么Service层不需要接口”的内容了,经过本文的学习后,相信大家对为什么Service层不需要接口这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 为什么Service层不需要接口

本文链接: https://www.lsjlt.com/news/84307.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么Service层不需要接口
    这篇文章主要讲解了“为什么Service层不需要接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么Service层不需要接口”吧!不需要接口的理由我整...
    99+
    2022-10-19
  • PHP 接口编程算法:是什么?为什么需要 IDE?
    随着互联网的发展,各种服务之间的交互越来越频繁,而接口编程成为了最常见的一种交互方式之一。在 PHP 中,接口编程是一种非常重要的编程方式。那么,什么是 PHP 接口编程算法?为什么需要使用 IDE 来进行接口编程呢?下面,本文将为大家详...
    99+
    2023-06-14
    接口 编程算法 ide
  • Windows需要碎片整理,为什么Linux不需要
    如果你是一个linux用户,你可能会听说Linux的文件系统不需要碎片整理。你也可能会注意到Linux的发行版本也都没有磁盘碎片整理的功能。这是为什么呢?要理解为什么L 什么是磁盘碎片? 很多Windows的用户,甚至...
    99+
    2023-06-03
    Windows碎片整理 Windows 碎片
  • SharePlex删除为什么不需要队列
    这篇文章主要讲解了“SharePlex删除为什么不需要队列”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SharePlex删除为什么不需要队列”吧!Shar...
    99+
    2022-10-18
  • 为什么Linux不需要碎片整理
    本篇内容主要讲解“为什么Linux不需要碎片整理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么Linux不需要碎片整理”吧!什么是碎片许多Windows用户,即使没有太多经验,我相信他们也...
    99+
    2023-06-16
  • 为什么不要在PHP接口的URL中添加后缀
    随着互联网的飞速发展,越来越多的网站和应用程序都已经转向了Web API(应用程序接口),其目的是为了提高系统的扩展性和可用性。同时,随着PHP的使用不断地增加,很多PHP程序员也开始使用PHP来开发Web API。然而,在使用PHP开发W...
    99+
    2023-05-14
    php
  • api数据接口为什么要加密
    api数据接口需要进行加密的原因以下几点防止伪装攻击在公共网络环境中,防止第三方有意或恶意的调用api数据接口。防止篡改攻击在公共网络环境中,防止请求头、查询字符串、内容在传输过程中被修改。防止重放攻击在公共网络环境中,防止请求被截获后被重...
    99+
    2022-10-23
  • 不需要备案的vps价格为什么不同
    不需要备案vps价格不同的原因有:1、受服务商优惠活动影响,一般有优惠活动时,租用vps的价格相对比平时要低;2、受vps配置影响,选择的配置质量越高,价格更贵;3、受数据中心环境影响,专业可靠、等级越高的数据中心,租用价格更高;4、受vp...
    99+
    2022-10-11
  • 怎么在PHP中隐藏不需要的数据库接口
    这篇文章主要讲解了“怎么在PHP中隐藏不需要的数据库接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在PHP中隐藏不需要的数据库接口”吧!第一步:删除不必要的数据库接口首先,我们需要找...
    99+
    2023-07-05
  • 为什么Linux不需要磁盘碎片整理
    如果你是个Linux用户,你可能听说过不需要去对你的linux文件系统进行磁盘碎片整理。也许你注意到了,在Liunx安装发布包里没有磁盘碎片整理的工具。为什么会这样? 为了理解为什么Linux文件系统不需要磁盘碎片...
    99+
    2022-06-03
    ext4 FAT Linux NTFS Ubuntu Windows 原理 固态硬盘 性能 文件系统 磁盘 磁盘碎片
  • 为什么不需要在JavaScript使用switch 语句!
    本篇文章为大家展示了为什么不需要在JavaScript使用switch 语句!,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。没有 switch 就没有复杂的代码块s...
    99+
    2022-10-19
  • 香港服务器为什么不需要备案
    香港服务器不需要备案的原因有以下几点香港港的法律制度与国内制度不同,网站可以不经备案直接登记。香港服务器使用的是国际航线,电信和网通之间可以快速进行连接。对香港服务器进行备案时,至少要一个二级域名,并要求有一定的访问量。...
    99+
    2022-10-07
  • 为什么数字化转型不仅需要技术,也需要人的改变?
    事实证明,在一个大型企业中,数字化转型是不可能的。因为传统的中层管理人员会尽其所能地抵制任何对现状的改变。缺乏文化变革通常不会带来有意义的进展。根据Gartner的说法,积极主动和适应性文化是一项关键资产,一些CIO可能会在其企业内建立正确...
    99+
    2023-06-03
  • 不需要备案的vps速度为什么变慢
    不需要备案vps速度变慢的原因有:1、本地网络出现故障,导致vps速度变慢;2、vps资源被占用或者中毒,从而使vps系统资源不足导致速度变慢;3、过多使用vps的防火墙功能,多余的功能造成vps空间资源浪费,从而使vps速度变慢;4、vp...
    99+
    2022-10-04
  • 为什么 Python 接口 api 并发是如此重要?
    Python 接口 API 并发是如此重要? 在当今数字化的时代,许多公司和企业都依赖于 API 接口来提供服务和数据。并发是指同时处理多个请求的能力,而在 API 开发中,这变得越来越重要。Python 作为一种高级编程语言,具有许多并发...
    99+
    2023-07-19
    接口 api 并发
  • java中为什么要实现Serializable序列化接口
    我们在学习JavaSE的时候学习过ObjectInputStream和ObjectOutputStream,当时是觉得只要一个对象要写入文件就必须要实现Serializable接口。其实这样理解完全没有问题。一、问题引入Java中为什么要实...
    99+
    2019-01-18
    java教程 java 实现 Serializable 序列化 接口
  • 为什么linux中不需要磁盘碎片整理呢
    这篇文章将为大家详细讲解有关为什么linux中不需要磁盘碎片整理呢,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。绝大多数的电脑用户都是在使用windows系统,我们都知道当电脑用起来很慢的时候,其中的一个...
    99+
    2023-06-13
  • 不需要备案的服务器租用价格为什么不同
    不需要备案的服务器租用价格不同的原因有:1、机房网络接入线路不同,如机房接入的是国际带宽,CN2专线等,不同的线路,价格会有一定的差距;2、服务器硬件不同,硬件配置越高,租用服务器的价格越高;3、带宽大小选择不同,带宽分为共享带宽和专用带宽...
    99+
    2022-10-17
  • 为什么 Python 同步接口在 leetcode 中如此重要?
    Python是一种高级编程语言,被广泛应用于数据科学、机器学习、Web开发等领域。在编写Python程序时,同步接口是一个非常重要的概念,尤其是在LeetCode这样的在线编程平台上。 同步接口是指程序在等待某些操作完成时,会被阻塞,直到操...
    99+
    2023-10-23
    同步 接口 leetcode
  • 浅谈python为什么不需要三目运算符和switch
    对于三目运算符(ternary operator),python可以用conditional expressions来替代 如对于x<5?1:0可以用下面的方式来实现 1if x<5...
    99+
    2022-06-04
    不需要 浅谈 运算符
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作