V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dnjat
V2EX  ›  程序员

如何缩短 dao 层命名,selectAllListIdAndUpdateHashAndStateByTaskIdAndUpdateGroupAndStateList

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

    (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
    GetByXXX
    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 类是不是会好一点?
    enchilada2020
        17
    enchilada2020  
       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  
       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 什么看参数定义,想知道拿到的数据看返回定义,不用全写名字上
    Richared
        37
    Richared  
       2023-11-17 17:21:24 +08:00
    如果是 jpa 可以理解,mybatis 图啥呢? byCondition 参数用实体不更清楚么。
    Richared
        38
    Richared  
       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 之类的东西拆分查询逻辑,一次调用只添加一种条件。
    netabare
        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   ·   实用小工具   ·   3401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:31 · PVG 19:31 · LAX 03:31 · JFK 06:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.