返回顶部
首页 > 资讯 > 后端开发 > Python >java中你的项目应该如何正确分层
  • 389
分享到

java中你的项目应该如何正确分层

2024-04-02 19:04:59 389人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录背景如何进行分层阿里规范优化分层分层领域模型的转换总结背景 说起应用分层,大部分人都会认为这个不是很简单嘛,就 Controller,Service,Mapper 三层。看起来简

背景

说起应用分层,大部分人都会认为这个不是很简单嘛,就 Controller,Service,Mapper 三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,Controller 做的逻辑比 Service 还多,Service 往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。

的确在这些人眼中分层只是一个形式,前辈们的代码这么写的,其他项目代码这么写的,那么我也这么跟着写。

但是在真正的团队开发中每个人的习惯都不同,写出来的代码必然带着自己的标签,有的人习惯 Controller 写大量的业务逻辑,有的人习惯在 Service 中之间调用远程服务。

这样就导致了每个人的开发代码风格完全不同,后续其他人修改的时候,一看,我靠这个人写的代码和我平常的习惯完全不同,修改的时候到底是按着自己以前的习惯改,还是跟着前辈们走。

这又是个艰难的选择,选择一旦有偏差,你的后辈又维护你的代码的时候,恐怕就要骂人了。

所以一个好的应用分层需要具备以下几点:

  • 方便后续代码进行维护扩展
  • 分层的效果需要让整个团队都接受
  • 各个层职责边界清晰

如何进行分层

阿里规范

在阿里的编码规范中约束的分层如下图:

①开放接口层:可直接封装 Service 方法暴露成 rpc 接口;通过 WEB 封装成 Http 接口;进行网关安全控制、流量控制等。

②终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,js 渲染,JSP 渲染,移动端展示等。

③Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。

④Service 层:相对具体的业务逻辑服务层。

⑤Manager 层:通用业务处理层。

它有如下特征:

  • 对第三方平台封装的层,预处理返回结果及转化异常信息。
  • 对 Service 层通用能力的下沉,如缓存方案、中间件通用处理。
  • 与 DAO 层交互,对多个 DAO 的组合复用。

⑥DAO 层:数据访问层,与底层 MysqloracleHBase 进行数据交互。

阿里巴巴规约中的分层比较清晰简单明了,但是描述得还是过于简单了,以及 Service 层和 Manager 层有很多同学还是有点分不清楚之间的关系,就导致了很多项目中根本没有 Manager 层的存在。

下面介绍一下具体业务中应该如何实现分层。

优化分层

从我们的业务开发中总结了一个较为的理想模型,这里要先说明一下由于我们的 RPC 框架选用的是 Thrift 可能会比其他的一些 RPC 框架例如 dubbo 会多出一层,作用和 controller 层类似。

最上层 Controller 和 TService 是我们阿里分层规范里面的第一层:轻业务逻辑,参数校验,异常兜底。

通常这种接口可以轻易更换接口类型,所以业务逻辑必须要轻,甚至不做具体逻辑。

①Service:业务层,复用性较低,这里推荐每一个 Controller 方法都得对应一个 Service,不要把业务编排放在 Controller 中去做,为什么呢?

如果我们把业务编排放在 Controller 层去做的话,如果以后我们要接入 Thrift,我们这里又需要把业务编排在做一次,这样会导致我们每接入一个入口层这个代码都得重新复制一份。

如下图所示:

这样大量的重复工作必定会导致我们开发效率下降,所以我们需要把业务编排逻辑都得放进 Service 中去做:

②Mannager:可复用逻辑层。这里的 Mannager 可以是单个服务的,比如我们的 Cache,MQ 等等,当然也可以是复合的。

当你需要调用多个 Mannager 的时候,这个可以合为一个 Mannager,比如逻辑上的连表查询等。如果是 httpMannager 或 rpcMannager 需要在这一层做一些数据转换。

③DAO:数据库访问层。主要负责“操作数据库的某张表,映射到某个 Java 对象”,DAO 应该只允许自己的 Service 访问,其他 Service 要访问我的数据必须通过对应的 Service。

分层领域模型的转换

在阿里巴巴编码规约中列举了下面几个领域模型规约:

  • DO(Data Object):与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
  • DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
  • BO(Business Object):业务对象。由 Service 层输出的封装业务逻辑的对象。
  • AO(Application Object):应用对象。在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
  • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
  • Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用 Map 类来传输。

层次 领域模型
Controller/TService VO/DTO
Service/Manager AO/BO
DAO DO

每一个层基本都自己对应的领域模型,这样就导致了有些人过于追求每一层都是用自己的领域模型。

这样就导致了一个对象可能会出现 3 次甚至 4 次转换在一次请求中,当返回的时候同样也会出现 3-4 次转换,这样有可能一次完整的请求-返回会出现很多次对象转换。

如果在开发中真的按照这么来,恐怕就别写其他的了,一天就光写这个重复无用的逻辑算了吧。

所以我们得采取一个折中的方案:

  • 允许 Service/Manager 可以操作数据领域模型,对于这个层级来说,本来自己做的工作也是做的是业务逻辑处理和数据组装。
  • Controller/TService 层的领域模型不允许传入 DAO 层,这样就不符合职责划分了。
  • 同理,不允许 DAO 层的数据传入到 Controller/TService。

总结

总的来说业务分层对于代码规范是比较重要,决定着以后的代码是否可复用,是否职责清晰,边界清晰。

当然这种分层其实见仁见智,团队中的所有人的分层习惯也不同,所以很难权衡出一个标准的准则,总的来说只要满足职责逻辑清晰,后续维护容易,就是好的分层。

到此这篇关于java中你的项目应该如何正确分层的文章就介绍到这了,更多相关java 项目分层内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java中你的项目应该如何正确分层

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

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

猜你喜欢
  • java中你的项目应该如何正确分层
    目录背景如何进行分层阿里规范优化分层分层领域模型的转换总结背景 说起应用分层,大部分人都会认为这个不是很简单嘛,就 Controller,Service,Mapper 三层。看起来简...
    99+
    2024-04-02
  • 在Java项目中如何正确的使用LinkedList
    本篇文章给大家分享的是有关在Java项目中如何正确的使用LinkedList,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。LinkedList简介LinkedList 是一个继...
    99+
    2023-05-31
    java linkedlist ava
  • 正则表达式如何正确在Java项目中使用
    这篇文章将为大家详细讲解有关正则表达式如何正确在Java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.匹配验证-验证Email是否正确public static void ma...
    99+
    2023-05-31
    java 正则表达式 ava
  • -classpath及路径如何正确的在Java项目中使用
    这期内容当中小编将会给大家带来有关-classpath及路径如何正确的在Java项目中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。javac -classpath的使用:javac:如果当前你要编译...
    99+
    2023-05-31
    java classpath 路径
  • 缓存存储与Java异步编程:如何在项目中正确应用?
    随着互联网技术的发展,应用程序的性能和响应速度已经成为了用户对软件的基本要求之一。缓存存储和异步编程是提高应用程序性能和响应速度的两个重要技术手段。在本文中,我们将讨论缓存存储和Java异步编程的基本概念及其在项目中的正确应用。 一、缓存...
    99+
    2023-06-28
    异步编程 缓存 存储
  • 如何在Spring项目中正确使用Git?
    Spring是一个非常流行的Java框架,它帮助开发人员更快地构建Java应用程序。Git是一种分布式版本控制系统,它可以帮助开发人员更好地管理代码。在Spring项目中正确使用Git是非常重要的,本文将介绍如何在Spring项目中正确使用...
    99+
    2023-10-11
    apache spring git
  • 如何正确的在C#项目中使用枚举
    本篇文章给大家分享的是有关如何正确的在C#项目中使用枚举,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。枚举基础枚举类型的作用是限制其变量只能从有限的选项中取值,这些选项(枚举类...
    99+
    2023-06-06
  • Java同步框架API:如何在项目中正确使用它?
    在Java项目开发中,多线程编程是非常常见的需求。但是,在多线程并发环境下,线程安全问题是一个十分容易被忽视的问题。如果没有正确地处理线程安全问题,很容易导致数据的不一致性、程序的崩溃等问题。因此,Java提供了一些同步框架API,用于帮...
    99+
    2023-09-05
    同步 框架 api
  • 如何在Spring项目中正确使用Go IDE的路径?
    Spring是一种非常流行的Java开发框架,它提供了丰富的功能和特性,使得开发人员可以快速地构建复杂的Web应用程序。当我们在Spring项目中使用Go IDE时,正确的路径配置是非常关键的。在本文中,我们将探讨如何在Spring项目中正...
    99+
    2023-10-06
    ide spring path
  • lambda表达式如何正确的在Java8项目中使用
    这篇文章给大家介绍lambda表达式如何正确的在Java8项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在Java8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来了函数式编程的思想,我...
    99+
    2023-05-31
    java8 lambda ava
  • SpringBoot项目中使用缓存Cache的正确方法分享
    目录前言启用缓存@EnableCaching自定义缓存管理器@Cacheable@CachePut@CacheEvict@Caching@CacheConfigCondition &...
    99+
    2023-05-15
    SpringBoot使用缓存Cache方法 SpringBoot使用缓存Cache SpringBoot 缓存Cache
  • Python shell和npm:如何在项目中正确使用它们?
    对于许多开发人员而言,Python shell和npm是日常开发中必不可少的工具。然而,有些人对于如何在项目中正确使用它们感到困惑。本文将介绍Python shell和npm的基本概念,以及如何在项目中使用它们。 Python shell...
    99+
    2023-07-31
    shell 关键字 npm
  • 如何正确快速的部署一个TS Node.js项目
    本篇内容主要讲解“如何正确快速的部署一个TS Node.js项目”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何正确快速的部署一个TS Node.js项目”吧...
    99+
    2024-04-02
  • 为什么你应该使用Go和Git来管理你的JavaScript分布式项目?
    在现代软件开发中,JavaScript已经成为了最为流行的编程语言之一。由于JavaScript应用程序越来越大、复杂,因此管理这些项目变得越来越困难。本文将介绍为什么你应该使用Go和Git来管理你的JavaScript分布式项目,并为您提...
    99+
    2023-08-05
    git javascript 分布式
  • Go和npm:如何在项目中正确使用文件路径?
    在现代开发中,文件路径的使用已经成为了一个必不可少的部分。在使用Go和npm这两个流行的编程语言和包管理器时,正确使用文件路径也变得非常重要。本文将帮助你了解如何在项目中正确地使用文件路径。 Go和npm是两种非常流行的编程语言和包管理器。...
    99+
    2023-06-03
    npm path 文件
  • 在Java中如何正确的使用TreeSet
    这期内容当中小编将会给大家带来有关在Java中如何正确的使用TreeSet,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。TreeSet简介TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。...
    99+
    2023-05-31
    java treeset ava
  • HashSet如何正确的在Java中使用
    HashSet如何正确的在Java中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。HashSet 简介HashSet 是一个没有重复元素的集合。它是由HashMap实现...
    99+
    2023-05-31
    java hashset hs
  • Python中如何正确使用Pandas库提升项目的运行速度
    今天就跟大家聊聊有关Python中如何正确使用Pandas库提升项目的运行速度,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。如何正确使用Pandas库提升项目的运行速度如果你从事大数...
    99+
    2023-06-02
  • 如何正确的理解Java中的继承
    本篇文章为大家展示了如何正确的理解Java中的继承,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java作为一面向对象的语言,具备面向对象的三大特征——继承,多态,封装。继承顾名思义,继任,承接,传...
    99+
    2023-05-31
    java ava
  • ASP 日志框架 path:如何在项目中正确地使用它?
    ASP 日志框架 path 是一款非常实用的日志工具,它能够帮助开发人员在项目中记录各种事件,从而更好地理解应用程序在运行过程中的行为。在本文中,我们将介绍如何在项目中正确地使用 ASP 日志框架 path,以及如何在代码中添加日志记录功...
    99+
    2023-09-27
    日志 框架 path
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作