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

2016-03-16 14:01:54 +08:00
 shawncx

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

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

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

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






现实:看心情随便写,以后有空重构。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/263921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX