设计中 横向切割 和 纵向切割

本贴最后更新于 1823 天前,其中的信息可能已经时异事殊

自己学习一段时间 java 代码了,发现现在后端的模式大多都是三层架构,自顶向下的横向切割,而且基本都是 controller、service、dao 这种结构。

其实很多时候会发现一个问题,在某些小应用中,对于 service 来说,都是直接的一句话返回而已,但是却依旧贯彻 三层 分层,即使只有一句话都固执的去使用。为什么不舍得舍去呢?只用两层难道不行嘛?在某些实践中,我就舍掉了 service,减少了很多类不说,思路都会清晰横多,因为不用去维护更多的数据和逻辑了。

而且除了横向切割以外,为什么不能够纵向切割呢?例如以前我们的结构是这样的

+ src
|--- main
  |--- java
    |--- controller
      |--- UserController
    |--- service
      |--- UserService
    |--- entity
      |--- User
    |--- filter
      |--- UserFilter
    |--- dao
      |--- UserDao

那我们可以不可以这样恩

|--- main
  |--- java
    |--- user
      |--- UserController
      |--- UserService (个人觉得可以省掉)
      |--- UserDao
    |--- entity
      |--- User

这样的话个人觉得可以有几个好处:

  1. 专注于某个模块的实现
  2. 全栈工程师更加方便的 “一捅到底”
  3. 问题定位十分方便
  4. 将功能分模块细化

这样的设计我觉得也很棒啊,但是后端却很少见人实践,后面的项目就打算自己实践一下。

  • 设计
    112 引用 • 797 回帖 • 1 关注
  • MVC
    7 引用 • 119 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • xflash

    这让我想起了好多年前大家都热衷于讨论领域模型,什么是贫血、充血、涨血等等。其实没什么意义,好的设计是大家都能理解的设计,好的设计是打开 IDE 就能找到写代码地方的设计。对于一个普通 CRUD 业务的项目,要为其写一堆“架构”文档才能让开发人员理解,那么做设计的人非傻即坏。

  • 其他回帖
  • 88250

    这个时候 AuthDao 其实就是 AuthService。Dao 一般只操作单表,Service 组合操作 Dao。

  • lizhongyue248

    是的,各有所长各有所短,怎么平衡还是看需求来 ~

  • lizhongyue248

    最后总结到了一点

    不能太简,因为可能会为后来留下许多难以完成的事。

    不能太复杂,因为可能前期会花一些无用功。

    所以折中最为理想。

    但是如果换一个思路,横向切割保留了包的内聚,那么纵向切割是不是保留了模块的内聚呢?那么也就是提高了这个模块的设计质量。特别现在前端也是模块化/组件化,那么这样其实对应过来反而会好许多。

    而且,如果这些模块的操作不是与实体类对应的呢?而是与功能进行对应的呢?来考虑这种模块结构

    |--- main
      |--- java
        |--- auth
          |--- AuthController 授权的处理,登录/注册/找回密码等
          |--- AuthDao 授权操作数据库
        |--- entity
          |--- User
          |--- Role
    
    

    AuthDao 不一定只操作 User 表,他也要操作 Role 表,但是他可以选择是否调用 User 、Role 的 Dao,或者就是直接对这两张表进行操作,那么模块之间其实并没有太多的耦合了,而都是各个模块之间完成自己的事情,并不需要去调来调去。

    这样的设计完全颠覆了以前的横向切割的设计,是不是可取性更高呢?

    1 回复
  • 查看全部回帖
lizhongyue248
一个天真的小孩儿......https://echocow.cn 贵阳

推荐标签 标签

  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 56 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    174 引用 • 990 回帖 • 2 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 346 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 622 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    20 引用 • 74 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6603 引用 • 29629 回帖 • 251 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 30 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 428 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 395 关注
  • 笔记

    好记性不如烂笔头。

    305 引用 • 780 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 237 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 2 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 461 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖 • 1 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 2 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 640 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 2 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 494 关注
  • V2Ray
    1 引用 • 15 回帖
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖 • 2 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    77 引用 • 1741 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖