对后端分层的一些疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
waabd727

对后端分层的一些疑问

  •  
  •   waabd727 Nov 1, 2020 4207 views
    This topic created in 2003 days ago, the information mentioned may be changed or developed.

    今天帮老师做一个项目,因为实体类特别多,所以 Controller 、Service 、Mapper 包中对应的类也好多。(°_o)/
    如果我只想修改某个类的各个层,就需要在每个包中找好长时间 orz
    于是就突然想到,为什么不把每个类和它们自己对应的层放在一个包里?这不是更方便查找吗?
    而且在逻辑上没有变化,仍然是分层调用的。

    希望大家能回答我的疑问~蟹蟹φ(*)

    19 replies    2021-07-19 20:51:57 +08:00
    xiangyuecn
        1
    xiangyuecn  
       Nov 1, 2020   1
    先建必须的 Controller 。

    Service Mapper 大部分情况下除了能起到增加复杂性的作用外,都是次要的。

    所以简单的代码塞到 Controller 一个文件里面就好。

    复杂度达到了有多个 Controller 公用的代码,扔到 Service 里面复用。

    Mapper 垃圾,扔掉
    hendyzone
        2
    hendyzone  
       Nov 1, 2020   1
    楼主应该指的是 按功能模块去组织代码
    这边一般认为小项目,功能模块不多的情况下按照 代码类型分包放
    功能模块多的时候 按照功能模块来分包 这样独立一些 多人维护的时候也不容易出问题
    zm8m93Q1e5otOC69
        3
    zm8m93Q1e5otOC69  
       Nov 1, 2020 via Android
    我们的 controller 一般按照实体类分。。
    GBdG6clg2Jy17ua5
        4
    GBdG6clg2Jy17ua5  
       Nov 1, 2020 via iPhone
    完全可以,我就是这样做。比如登录的,就把 controller service mapper bean 都放在 login 包下面
    Hieast
        5
    Hieast  
       Nov 1, 2020   3
    业务复杂度是代码复杂的根本原因,你找的时间长是因为你不熟悉这个类的各个层。
    按照功能来分包、拆封微服务都是为了切割业务,让各个业务之间解耦,这样新人需要熟悉的业务就更少,自然熟悉业务的时间更短。

    假如新人觉得很难上手,没人愿意接,都跑路了,说明该重构了
    rainboat
        6
    rainboat  
       Nov 1, 2020 via Android   1
    一个 mapper 可能被多个 service 调用,一个 service 可能被多个 controller 调用,我觉得按照功能把各个层的类放在一个包里面并不是一个好的选择,复杂的业务下可能会让类更加混乱
    huskyui
        7
    huskyui  
       Nov 1, 2020
    idea 里面 shift 按两次,可以快速找文件。我们公司有些项目的代码是一个类一个包。。。我的猜想这样分层可能为了 aop 的效果更加精确一点???
    bl
        8
    bl  
       Nov 1, 2020
    简单的话完全可以,分层只是为了工程化,其他的没什么。
    DoctorCat
        9
    DoctorCat  
       Nov 2, 2020
    1.缘起 J2EE 时期的设计模式
    2.按照不同包来组织是一种设计哲学,“约定优于配置”,这种写法无时无刻在提醒开发者注意降低业务间的耦合性
    3.你说的可以的,只是没遵守 JavaEE 界的工程约定。副作用也会有,一两个人的小项目倒是无所谓,但经常迭代的话随时间推移不同参与者写着写着代码就变得难以阅读了
    mikulch
        10
    mikulch  
       Nov 2, 2020 via iPhone
    这里有一个群哈,主要是学生交流 java 前端,有兴趣的可以进来大家一起交流,也可以推荐同学哈。里面还是有热心的大牛的
    https://i.loli.net/2020/11/02/rTfPHkw8iuoRc1e.png
    kiracyan
        11
    kiracyan  
       Nov 2, 2020
    框架就是让你按照他的代码约定格式做业务
    wolfie
        12
    wolfie  
       Nov 2, 2020
    简单的 CRUD 还好,不同功能依赖时候还是由这个问题。记得 JEESITE 就是这么设计的。
    熟悉了现有代码以后,IDEA 类搜索很快。
    lix7
        13
    lix7  
       Nov 2, 2020
    我觉得楼主你想法其实是对的,现在这样按层工程分包方式就是不对的。
    从业务上讲,同一领域内的对象应当聚合在一起,这也是为了把领域内的知识都限制在包内,而不是散落在项目的角落里。
    Node.js 在 Github 上 star 最多的 Best Practices 明确表明应当按业务分包。
    为了照顾没有团队规范的多人开发,而抛弃正确的项目结构,我认为是本末倒置了。
    looplj
        14
    looplj  
       Nov 2, 2020
    是的,应该按照业务分包管理的。
    BoarBoar
        15
    BoarBoar  
       Nov 2, 2020
    本来就可以,而且有些地方,比如 go 官方就提倡这么搞
    现在这种分层是加 J2ee 那一套,属于历史遗留问题。当年大量传统企业涉足信息技术(其实就是找外包做一个 ERP 系统),
    BoarBoar
        16
    BoarBoar  
       Nov 2, 2020   1
    本来就可以,而且有些地方,比如 go 官方就提倡这么搞
    现在这种分层是 J2ee 那一套,属于历史遗留问题。
    当年大量传统企业开始搞信息化(其实就是找外包做一个 ERP 系统),一方面当时开源不发达用 C/C++撸 web 比较蛋疼,另一方面传统企业也不愿意出太多钱请不起 C++大佬。所以 javaer 就靠着量足价优承包了几乎所有传统企事业和机关单位的 It 外包,用友金蝶就是代表。把 J2EE 这一套广泛传播出去了,
    然后大家发现这一套也确实好用,不管你再菜,照着一大套条条框框来,总错不到哪里去,应付传统行业的甲方爸爸完全没问题,就这样沿用至今来。
    treblex
        17
    treblex  
       Nov 2, 2020
    django 也是这样的吧
    linbingcheng
        18
    linbingcheng  
       Nov 2, 2020
    这还简单,才三层,出来混才发现,不止,manager 层见过没,一开始简简单单 controller service dao model 就搞定了?
    DO DTO VO,头都大,怀念以前 CRUD 的日子,一去不复返
    NodeSans
        19
    NodeSans  
       Jul 19, 2021
    @BoarBoar 话说 go 官方提倡这么搞有什么依据吗,比较好奇
    About     Help     Advertise     Blog     API     FAQ     Solana     3164 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 65ms UTC 14:37 PVG 22:37 LAX 07:37
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86