如何缩短 dao 层命名,selectAllListIdAndUpdateHashAndStateByTaskIdAndUpdateGroupAndStateList - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
dnjat
V2EX    程序员

如何缩短 dao 层命名,electAllListIdAndUpdateHashAndStateByTaskIdAndUpdateGroupAndStateList

  •  
  •   dnjat 2023-11-17 12:37:12 +08:00 9576 次点击
    这是一个创建于 693 天前的主题,其中的信息可能已经有所发展或是发生改变。

    (1)select(2)AllList(3)IdAndUpdateHashAndState By (4)TaskIdAndUpdateGroupAndStateList

    1. 动作

    2. 返回所有匹配. 如果是分页,为 PageList

    3. 返回字段

    4. 条件字段

    各位对 dao 层的命名,有什么好的方案吗.

    59 条回复    2023-11-18 16:06:02 +08:00
    beneo
        1
    beneo  
       2023-11-17 12:41:08 +08:00
    JPA 逆向来一个
    flyqie
        2
    flyqie  
       2023-11-17 12:42:39 +08:00 via Android   1
    总感觉有苹果那味了。。
    securityCoding
        3
    securityCoding  
       2023-11-17 12:44:02 +08:00
    别用 namequery,手写 sql 吧
    ufan0
        4
    ufan0  
       2023-11-17 12:56:59 +08:00
    条件字段没必要的,对于形参列表查看定义的时候一目了然
    dnjat
        5
    dnjat  
    OP
       2023-11-17 12:57:39 +08:00
    要逆出什么来
    dnjat
        6
    dnjat  
    OP
       2023-11-17 12:58:20 +08:00
    @beneo 要逆出什么来
    dnjat
        7
    dnjat  
    OP
       2023-11-17 12:58:50 +08:00
    @flyqie 苹果味是什么样的
    dnjat
        8
    dnjat  
    OP
       2023-11-17 12:59:21 +08:00
    @securityCoding 是手写,mybatis id 名就是这么长.
    dnjat
        9
    dnjat  
    OP
       2023-11-17 13:01:07 +08:00
    @ufan0 传的 do.没有用形参.都是基本类型,容易眼花. 如果是用形参,确实可以条件字段免掉了.
    subframe75361
        10
    subframe75361  
       2023-11-17 13:09:01 +08:00
    4 写注释里?
    lsry
        11
    lsry  
       2023-11-17 13:56:49 +08:00
    jpa 是这样的
    Martens
        12
    Martens  
       2023-11-17 13:58:35 +08:00
    ListBy(a,b,c,d,e)
    LeegoYih
        13
    LeegoYih  
       2023-11-17 14:04:06 +08:00
    findByParams
    动态 SQL
    wanguorui123
        14
    wanguorui123  
       2023-11-17 14:04:28 +08:00   1
    LoadAll
    LoadByXXX
    GetByXX
    DeleteByXXX
    UpdateByXXX

    入参太多直接忽略 By
    ChoateYao
        15
    ChoateYao  
       2023-11-17 14:10:55 +08:00   1
    按场景命名,不要按参数命名。

    比如 会员订单搜索:memberOrderSearch()
    titanhw
        16
    titanhw  
       2023-11-17 14:35:26 +08:00
    将( 4 )封装到一个 Condition 类是不是会好一点?
    KMpAn8Obw1QhPoEP
        17
    KMpAn8Obw1QhPoEP  
       2023-11-17 14:36:40 +08:00 via Android
    我靠太对味了
    dif
        18
    dif  
       2023-11-17 14:38:54 +08:00
    如果你得查询条件就 2-4 个,那就按名字 findXXByxxAndXXX 如果参数长,那就按照业务来 find{{Service}}Data()
    duron600
        19
    duron600  
       2023-11-17 14:42:37 +08:00   7
    要总结一个干了很多事情的方法,得用业务意义上的名词,而不是直接描述底层细节。
    吃饭不要写成“哺乳动物通过蛋白质摄取能量”
    mengdodo
        20
    mengdodo  
       2023-11-17 14:48:46 +08:00
    层层下去,结果发现是个 sum 函数
    cbythe434
        21
    cbythe434  
       2023-11-17 14:52:19 +08:00
    select1
    dnjat
        22
    dnjat  
    OP
       2023-11-17 14:54:25 +08:00
    @subframe75361 是个好想法. 缩短肯定要省去一些信息.转移阵地.
    dnjat
        23
    dnjat  
    OP
       2023-11-17 14:55:47 +08:00
    @lsry 用的 mybatis,可能是看别人的博文,无形中吸取了 jpa 精华.
    dnjat
        24
    dnjat  
    OP
       2023-11-17 15:01:20 +08:00
    @Martens
    @LeegoYih
    @wanguorui123
    @titanhw 如果没有什么别的好的方法,只能这样缩短了.反正是要截掉一部份信息.
    dnjat
        25
    dnjat  
    OP
       2023-11-17 15:04:43 +08:00
    @ChoateYao
    @dif
    @duron600 用业务名也是可以,只是很多参数就固定了.比如状态. 各个状态都要对应的业务名. 对简单的用全名,复杂的用业务名,是一个很好的方法.
    dnjat
        26
    dnjat  
    OP
       2023-11-17 15:07:06 +08:00
    @mengdodo 嘿嘿,是这样,有的逻辑一样,外部装饰,内部自己处理参数,然后丢进机器里面
    dnjat
        27
    dnjat  
    OP
       2023-11-17 15:07:35 +08:00
    @cbythe434 扑通,扑通..
    THESDZ
        28
    THESDZ  
       2023-11-17 15:07:40 +08:00
    长有问题吗?我觉得表意明确才是最重要的
    duron600
        29
    duron600  
    /div>   2023-11-17 15:10:15 +08:00
    那就留着这个方法,在这个方法之上再封装一层,不同的状态用不同的名字。

    比如:

    ```
    def 吃饭
    selectAllListIdAndUpdateHashAndStateByTaskIdAndUpdateGroupAndStateList(状态=1)
    end

    def 睡觉
    selectAllListIdAndUpdateHashAndStateByTaskIdAndUpdateGroupAndStateList(状态=2)
    end

    def 打豆豆
    selectAllListIdAndUpdateHashAndStateByTaskIdAndUpdateGroupAndStateList(状态=3)
    end
    ```

    吃饭、睡觉、打豆豆很容易就能看明白了,这样就不用再纠结 `selectAllListIdAndUpdateHashAndStateByTaskIdAndUpdateGroupAndStateList` 这个方法的名字,不是问题。
    walle1530
        30
    walle1530  
       2023-11-17 15:14:32 +08:00
    selectBy 吧
    looo
        31
    looo  
       2023-11-17 15:28:50 +08:00   2
    我觉得没必要写那么长,建议:findXXXByCondition()

    1. 超过 3 个参数我都是 findXXXByCondition()
    2. 都到 mapper.xml 了,看这个代码的人肯定会去看你的条件是什么而不是看你的方法名称。
    3. 还有 selectAllList 也没必要,因为你的返回类型就知道你是单个还是列表了。
    Akiya
        32
    Akiya  
       2023-11-17 16:40:40 +08:00
    用返回类型和参数类型就可以取代函数名的大部分内容吧
    List<IdAndUpdateHashAndState> select(int taskId, UpdateGroup updateGroup, List<State> states)
    luzemin
        33
    luzemin  
       2023-11-17 16:41:32 +08:00   1
    不要动,这才是正宗的 Java
    Aloento
        34
    Aloento  
       2023-11-17 16:45:43 +08:00
    对味了!
    .NET 路过表示震惊
    28Sv0ngQfIE7Yloe
        35
    28Sv0ngQfIE7Yloe  
       2023-11-17 16:49:40 +08:00
    JPA 味太浓了
    FrankAdler
        36
    FrankAdler  
       2023-11-17 17:13:52 +08:00 via Android
    参数里有的字段没必要写到方法名上,就跟 user 表的主键 id 没必要写 user_id 而是直接用 id 一样
    getUserByXX 这种也是,想知道 by 什么看参数定义,想知道拿到的数据看返回定义,不用全写名字上
    Cruzz
        37
    Cruzz  
       2023-11-17 17:21:24 +08:00
    如果是 jpa 可以理解,mybatis 图啥呢? byCondition 参数用实体不更清楚么。
    Cruzz
        38
    Cruzz  
       2023-11-17 17:22:57 +08:00
    或者业务强关联,直接写业务名称写毛的具体查的啥,反正别人也不能用。你写成这样目的是为了别人用的时候知道这个。但是没人用,你写他干嘛呢。
    @Richared
    hancai
        39
    hancai  
       2023-11-17 17:25:59 +08:00
    函数名写 sql
    xiaochong
        40
    xiaochong  
       2023-11-17 17:29:01 +08:00
    看成如何 缩短 diao
    lovelylain
        41
    lovelylain  
       2023-11-17 18:10:17 +08:00 via Android
    c++重载函数统一命名 query
    aragakiyuii
        42
    aragakiyuii  
       2023-11-17 18:45:06 +08:00 via iPhone
    jpa 有 specification
    mybatis plus 有 querywrapper
    lanlanye
        43
    lanlanye  
       2023-11-17 19:10:53 +08:00
    不用 Java ,几个不知道是否可行的建议:

    1. 用 QueryObject 包装条件,避免筛选条件直接放到方法名里。
    2. 用 Statement Builder 之类的东西拆分查询逻辑,一次调用只添加一种条件。
    img src="https://cdn.v2ex.com/avatar/6bf8/3d7c/125600_normal.png?m=1755205643" class="avatar" border="0" align="default" alt="netabare" data-uid="125600" />
        44
    netabare  
       2023-11-17 19:35:38 +08:00 via iPhone   1
    能不能拆成函数组合?另外 dao 是靠近 sql 层面还是靠近业务层的,如果靠近 sql 层就是 crud 吧,靠近业务层的话……

    我一直喜欢的一句话:复杂度只能搬移,不能消除。

    而且函数组合的话感觉也有问题,比如会不会遇到 n+1 呢。
    LightofHeven
        45
    LightofHeven  
       2023-11-17 21:32:13 +08:00
    用 @Select 写个 sql 吧 dao 名字简单的 selectByCondition(queryCondition)
    Ericcccccccc
        46
    Ericcccccccc  
       2023-11-18 00:37:29 +08:00
    也不易读啊
    uxstone
        47
    uxstone  
       2023-11-18 08:38:32 +08:00
    不要太相信类名,后期业务需求变动,往往会偷懒不改动类名,导致类名和实际功能不符。
    B1ankCat
        48
    B1ankCat  
       2023-11-18 09:27:12 +08:00
    使用这世界上最完美的查表法,名字就叫 Ili1lii11llii11 ,然后每次开发在外面文档查表获取真实名称和功能
    dnjat
        49
    dnjat  
    OP
       2023-11-18 10:00:41 +08:00
    @duron600 把最难的留给自己用.
    dnjat
        50
    dnjat  
    OP
       2023-11-18 10:06:55 +08:00
    @looo
    @Akiya
    @FrankAdler
    @Richared 很好的方法,省略掉能在方法签名上已体现的信息.
    dnjat
        51
    dnjat  
    OP
       2023-11-18 10:08:32 +08:00
    @walle1530
    @luzemin
    @Aloento
    @Morii
    @lovelylain
    @Ericcccccccc 经常看到,为什么 java 里的名字这么长.
    dnjat
        52
    dnjat  
    OP
       2023-11-18 10:13:15 +08:00
    @Richared
    @lanlanye
    @aragakiyuii
    @LightofHeven 是的,参数太多,调用时也会再次核对.没必要在方法名上下功夫.
    dnjat
        53
    dnjat  
    OP
       2023-11-18 10:14:08 +08:00
    @xiaochong 你居然想练成这样的神功.
    dnjat
        54
    dnjat  
    OP
       2023-11-18 10:17:56 +08:00
    @netabare 有必要是可以再函数组合一下,这样也对关联查询在业务逻辑上做优化.
    dnjat
        55
    dnjat  
    OP
       2023-11-18 10:22:00 +08:00
    @uxstone 太赶了,根没有时间去考虑这么多.当想到的时候,算了吧,都这么多了.
    dnjat
        56
    dnjat  
    OP
       2023-11-18 10:23:08 +08:00
    @B1ankCat 再加上 O0
    nexo
        57
    nexo  
       2023-11-18 12:42:25 +08:00
    一个函数干这么多事情 也不是什么好函数吧
    Ericcccccccc
        58
    Ericcccccccc  
       2023-11-18 13:41:56 +08:00
    @dnjat 感觉是一种社区形成的习惯(比如 spring 源码里很多很长的, 大家会互相模仿)

    对比起来 go 里面很多源码就很简单(包括官方也提倡简单), 那自然大家写出来的代码就会简单

    但这并不一定是好事, go 里面很多缩写莫名其妙还不如写全称
    siweipancc
        59
    siweipancc  
       2023-11-18 16:06:02 +08:00
    最整洁的代码就是自解释的(doge

    你可以 loadAll 然后内存过滤, 服务器的 CPU 也比数据库的高效不是(doge
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5225 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:24 PVG 16:24 LAX 01:24 JFK 04:24
    Do have faith in what you're doing.
    ubao 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