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

大家在设计接口的时候,传参一般是传逻辑上需要的最小范围还是直接传对象?

  •  
  •   shawncx · 2016-03-16 14:01:54 +08:00 · 4296 次点击
    这是一个创建于 3175 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如有个方法 getMembersFromGroup ,我可以设计它只接受需要的最小范围参数。比如. 只接受 groupId, getMemberFromGroup(domian, path, groupId)。我也可以设计他接受 Group 对象,比如 getMemberFromGroup(group)。第一种设计可以明确需要的参数,也方便调用。但是不方便扩展,当需要的参数的多的时候会很乱。第二种更面向对象,但是如果我要复用方法时,无法获得整个对象,不通过查看接口实现就无法了解该如何构造。对于这种问题大家是怎么看的?

    24 条回复    2016-03-17 11:51:50 +08:00
    knightdf
        1
    knightdf  
       2016-03-16 14:12:31 +08:00
    面向对象有个特性叫多态。。。
    bp0
        2
    bp0  
       2016-03-16 14:31:10 +08:00
    传递 group 对象通常是提高耦合性。因为如果传递 group ,则 getMemberFromGroup 方法就必须依赖 group 对象提供的获取 domain , path 和 groupId 的方法。如果这些成员是公有的,则问题更严重。

    当然,如果 getMemberFromGroup 方法本身就与 group 关联性很强,那么传递 group 也是没有问题的。

    另外,不是给接口传递对象才是面向对象。面向对象是一种方法论,而不是指接口的参数类型。
    shawncx
        3
    shawncx  
    OP
       2016-03-16 14:34:47 +08:00
    @bp0 我说的面向对象是指通过传 group 对象封装了 group 的具体信息。。。
    SpicyCat
        4
    SpicyCat  
       2016-03-16 15:13:30 +08:00
    传 id ,通过 id 再获取对象。
    chenps10
        5
    chenps10  
       2016-03-16 15:58:50 +08:00
    @knightdf 看到你的头像之后我已经忘记想跟楼主说什么了,只想对你说 666
    WhoMercy
        6
    WhoMercy  
       2016-03-16 16:11:29 +08:00
    迪米特法则( Law of Demeter )又叫作最少知识原则( Least Knowledge Principle 简写 LKP ),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
    knightdf
        7
    knightdf  
       2016-03-16 16:35:53 +08:00
    @chenps10 这么把持不住?
    fwrq41251
        8
    fwrq41251  
       2016-03-16 16:49:55 +08:00
    看参数个数,参数超过三个就写成类。
    FrankFang128
        9
    FrankFang128  
       2016-03-16 16:51:03 +08:00
    改名 getMembersByGroupId
    siteshen
        10
    siteshen  
       2016-03-16 18:01:48 +08:00
    front end 层负责把 group_id 变成 group , logic 层参数 group, model 层参数 id 。
    xylophone21
        11
    xylophone21  
       2016-03-16 18:30:35 +08:00
    @WhoMercy 说的是对的,具体来说,就是如果 getMembersFromGroup 所在的方法,必须认识 Group 就可以传,否则就不能传。
    xieguobihaha
        12
    xieguobihaha  
       2016-03-16 18:43:16 +08:00
    按照「代码大全」的建议是:如果分开传的参数刚好只是某个对象的属性,在使用这个接口时需要先 new 个对象然后填入属性,那么分开传比较合适;反之,则传对象比较合适。
    gkiwi
        13
    gkiwi  
       2016-03-16 19:02:03 +08:00
    超过 3 个就用对象吧,不过可以做一个『简单版』的对象(类似 Map ,但是做好字段规划)
    =====
    某年和别人联调遇到过一个 10 多个参数的函数,后来反反复复增删字段,差点日狗,最后改成用 HashMap 传了~
    kaizixyz
        14
    kaizixyz  
       2016-03-16 19:24:39 +08:00 via iPad
    楼主说的这种状况,请用对象。方法的名字透露了跟 group 的强联系。
    billlee
        15
    billlee  
       2016-03-16 19:34:20 +08:00
    为什么不是 Group::getMembers()
    skydiver
        16
    skydiver  
       2016-03-16 19:57:37 +08:00
    domian 23333
    caixiexin
        17
    caixiexin  
       2016-03-16 20:17:22 +08:00 via Android
    说的应该是 java 这类强类型语言吧
    刚学设计模式的时候看到迪米特法则,会强迫自己遵守,使用第一种,直接定义参数列表。
    后来工作时碰到的接口动则就是七八个参数,就妥协用第二种了。副作用是方法调用层级多的情况下,需要反复转换封装入参对象。据说使用 ddd 的设计模式可以减少不必要的模型转换。
    现在个人偏向第二种
    levn
        18
    levn  
       2016-03-16 20:37:07 +08:00 via Android
    某些语言里你可以直接同时写这两种。。。
    Ouyangan
        19
    Ouyangan  
       2016-03-17 00:09:51 +08:00
    json 23333
    ffffwh
        20
    ffffwh  
       2016-03-17 00:31:51 +08:00 via iPad
    理想:直接暴露 field 不好,弄成 getter 。然后再弄个接口包含这些 getter ,目标函数接受接口。






    现实:看心情随便写,以后有空重构。
    hardware
        21
    hardware  
       2016-03-17 00:42:36 +08:00
    **kwargs
    lecher
        22
    lecher  
       2016-03-17 02:07:46 +08:00 via Android
    一个接口七八个参数的时候,会很头疼,新增业务根本不敢随便改动接口参数,有时候为了新增的一两个参数就要另起新的接口做类似的业务处理。

    封装对象对接口调用隐匿了参数细节,内部实现各种判空校验处理做模型转换同样很头疼,有时候不看实现不知道如何传参调用。

    我习惯传对象,调用和新增业务各种省事,但是接口内部处理像一团乱麻。对外暴露的接口数量会比较少。变更数据模型的改动量小一些。

    团队开发规范是参数列表,一个接口加加加就变成五六个参数,内部实现一个接口只做一件事情,需要对外暴露很多个业务相近的接口,调整数据字段的时候经常面临七八个接口的改动。
    yuriko
        23
    yuriko  
       2016-03-17 09:56:29 +08:00
    数据多时,通过构造器生成参数包,尽可能不使用原对象
    Lpl
        24
    Lpl  
       2016-03-17 11:51:50 +08:00 via Android
    应该是 java 的 controller 层吧(用的 springmvc)?

    我们的开发规则是:当参数在四个以上时需要考虑封装成一个 formbean 对象。不然的话参数太多,代码太长
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2838 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:25 · PVG 17:25 · LAX 01:25 · JFK 04:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.