Service中包含哪些代码
1、简介
Service层中 = 核心功能(几十行 上百代码) + 额外功能(附加功能)
- 核心功能
业务运算
DAO调用 - 额外功能
- 不属于业务
- 可有可无
- 代码量很小
以及:事务、日志、性能…
Service层,作为程序的业务层面,其中最重要的必然是程序的业务流程,只有对程序的业务流程有足够的了解,才能写出优秀的Service层代码。
不冗余,是一个程序员代码水平的一个体现。
2、接口
为什么要先写接口?
接口的作用是什么?
这里我引用一句话:
1 | 接口主要用于描述类具有什么功能,而并不给出每个功能的具体实现。一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。——《Java核心技术卷一》 |
这句话所描述的是接口的扩展性。简而言就是:接口是一个统一的插座,如果有需要我们就可以直接进行调用,实现了即插即用。
例如:有一个登录功能需要我们去实现,而该系统又有多种登陆方式,我们不可能每种接口都写一个Service代码给Controller进行调用,这样是十分繁琐的。而我们将多种登陆的方式统一成一个接口,然后根据用户的需求来分配最后实际的实现类。此时对于使用者来说,他们只需要关注的是登陆这个方法,整个登陆操作变得十分灵活,根据不同的场景使用不同的方式登陆。
对于开发者来说,接口中清晰地列出了所有地方法,对于后期的维护以及修改也是有极大的方便。
3、Service之间的互相调用
Service层之间可以相互调用吗?
这个问题相信很多人都有过思考,理论上来讲是不应该相互进行调用的,因为Service层的存在的一个很重要的目的就是 解耦 。
将业务层的每一个业务独立出来,以至于他们之间不相互影响,能够实现代码的优化,否则多种业务的代码混在一起,长久之后谁都看不出来代码的逻辑。所以说Service层就实现了这一个很重要的功能。
所以如果Service层之间的代码相互调用,是不是会是一种倒退呢?
有些人可能会问,有些业务中确实是会使用到其他业务中的代码,那这部分代码怎么办?重新写?那是不可能的,这又犯了冗余这个错误。所以我们该怎么解决呢?
首先,我们要清楚,这个情况是出于Service间有通用的逻辑,而不是通用的业务,每个Service对应一个业务,业务之间应该有明确的分界,不然会出现业务间的耦合,这是设计的不合理。
既然是通用的逻辑,我们是不是又可以把他们抽象出来,独立成一个工具类,当我们需要的时候直接进行调用这个工具类就可以了呢?
所以我个人认为Service层之间是不建议相互调用的。
4、需要向Conrtroller层展示业务吗?
当我们实现一个登录功能的时候,Controller层,调用Service层,往往我以前的写法是,Service返回登录成功或者失败的代码,然后Controller进行一个判断,判断是否成功登录,然后再向前端返回信息。这样子的写法有个问题,Controller判断的一个过程,算不算是业务?如果算,是不是Controller层又接触到了业务?
又回到了之前的问题,为什么要有Service层?
所以说,我们应该让Controller层尽可能少的接触到业务,所以我们的写法可以优化为,再Service层做完所有业务相关的工作,最后返回给Controller层的是一个开箱即用的接口,这样子是不是可以避免Controller层接触到业务相关的代码呢?
这就又符合了我们使用Service层的初衷了。
5、最后
在看了一些文章之后,个人的一些小小观点。