一个方法很多参数,算是好的设计还是不好的设计

2024-07-11 08:37:29 +08:00
 awesomePower

如题,一个方法含有十几个参数,这算是糟糕的设计还是好的设计,还是无所谓。 有这方面的标准么?

7209 次点击
所在节点    Java
50 条回复
Rache1
2024-07-11 09:53:17 +08:00
@HackerJax #8 PHP 8.0 开始也支持像 Py 那样的命名参数了
yanqing07
2024-07-11 09:53:55 +08:00
@maokg #2 四个还好吧。五个参数我接受不了,IDE 提示要用滚动条了
adoal
2024-07-11 09:55:51 +08:00
平行的十几个参数,大概率是没设计好。至少应该按照参数的业务亲密性分组,封装到结构类型里。而且,很有可能,这个接口可以做拆分成更细的接口,或者对调用逻辑做重组设计。
0xD800
2024-07-11 09:58:21 +08:00
不好的设计,应该放到一个结构体里面,否则接口签名变动的时候就抓狂了
Rorysky
2024-07-11 10:05:00 +08:00
封装在参数对象里
miaotaizi
2024-07-11 10:06:54 +08:00
你确定你的场景都会把十几个参数都传吗?

要不整理一下场景, 把函数重载一下?
wqhui
2024-07-11 10:10:37 +08:00
有时候可以选择用个对象装载所有字段,也可以选择拆出来每个字段传参

一般情况下,如果对象有 20 个字段,但方法只用到了其中 5 个,我倾向于只传这 5 个用到的字段,而不是整个对象丢进去,主要是为了明确这个方法只会被这几个字段影响运行,而不需要看方法具体逻辑。当然不嫌麻烦的话,为这个方法新建一个传参的对象装这 5 个字段也 ok ,参数多的话建议后者
Cabana
2024-07-11 10:11:42 +08:00
哈哈, 写 Compose 的已经麻木了~
aolifu
2024-07-11 10:15:34 +08:00
之前看过一个 OP 发的帖子,说是他们有的方法一百多个参数,我都惊了 /🤦‍♂️
Sfilata
2024-07-11 10:17:11 +08:00
我觉得主要看这个方法很多参数是不是有默认值。如果说正常使用,我可以只传一两个参数就可以使用通用功能,需要微调可以传特定的参数来改变行为的话,我觉得就是一个很好的设计。而且我感觉很多 shell 命令就是这么干的。
UIXX
2024-07-11 10:39:01 +08:00
代码结构设计是一种平衡艺术,天平的两端可以是易调用性和易调试性。

当然可以将几百个参数封装成大众接受数量的结构体,但这同时意味参数层级+1 ,在没有额外针对该结构的接口时,我更倾向于将它展开,除了更清晰的逻辑以及奥卡姆剃刀原则之外,显式地强调其中某些参数的用法也是这样设计的重要原因。
lonelee
2024-07-11 10:41:08 +08:00
java 代码的话是不好的设计,
kotlin 代码使用默认值+参数名指定完全没问题
yb2313
2024-07-11 10:42:55 +08:00
喜欢多, 那就写**kwargs
xz410236056
2024-07-11 10:50:31 +08:00
所以现在新语言都有可变参数的设计,调用的时候你想传什么传什么
xueling
2024-07-11 11:10:32 +08:00
太多参数不好,完全没有复用性。
NoOneNoBody
2024-07-11 11:54:37 +08:00
类方法没所谓,通过设计模式或者继承、抽象就能固定某些参数了
参数太多难点是逻辑,里面估计很多判断
底层的基础类参数多些能兼顾不同的“状态”,专用的符合业务模型的就继承基础类固定参数
opengps
2024-07-11 11:57:22 +08:00
这是按需,没法去界定啥。当然针对具体业务可能有更优的方案
9c04C5dO01Sw5DNL
2024-07-11 13:06:31 +08:00
@aolifu 有代码吗,看看
tairan2006
2024-07-11 14:02:21 +08:00
一般是不好的,不过有默认值的话有时候也可以,主要看还能不能保持常规情况下使用较为简单
debuggeeker
2024-07-11 14:45:37 +08:00
参数多不是问题,把每个参数注释写清楚就行

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

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

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

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

© 2021 V2EX