当一个方法有太多参数?

Yon*_*oni 39 language-agnostic ide parameters

今天调试一些Web服务客户端代码时(在Java中,使用jax-ws),我遇到了令人兴奋的97个参数的Web服务方法!

我必须创建一个调用此方法的测试用例,我注意到了几件事:

  • 代码辅助/悬停不能很好地扩展.我正在使用Eclipse,并且该方法的工具提示与屏幕一样宽,并且跨越多行.
  • 我不得不从之前的xml捕获中复制参数值,并且几乎不可能记住"我在哪里" - 当我将光标放在逗号之后并且在键入一些值之前,我经常得到错误的数据类型 - 我输入了整数而不是字符串,反之亦然.
  • 即使在我写完所有参数之后,我仍然遇到了一些错误并且签名不匹配.不幸的是,Eclipse将整条线标记为红色,因为有错误,所以找到错误的地方需要更多的时间:(

所以这让我思考,您认为方法的最大参数数量是多少?如果您可以更改此Web服务签名,您认为如何改进它?

Pét*_*rök 64

没有明确的限制,但我对超过3-4个参数感到不舒服.清洁代码中的 AFAIR叔叔Bob Martin 建议最多3.

有几种重构可以减少方法参数的数量(有关详细信息,请参阅Michael Feathers的有效使用遗留代码).我想到了这些:

  • 将许多相关参数封装到单个对象中(例如,而不是String surName, String firstName, String streetAddress, String phoneNumberPerson包含这些参数的对象作为字段传递)
  • 在调用此方法之前,在构造函数或其他方法调用中传递参数

  • +1为"没有明确限制",因为我认为鲍勃叔叔严格限制最大限度.3个参数太教条了.这可能会导致奇怪的变通方法,例如隐藏依赖关系和破坏线程安全性的其他变量(例如,"清洁代码"第73页上重构的PrimeGenerator.java). (8认同)
  • +1提及WELC,这是一个处理现实世界的惊人资源. (4认同)
  • WELC 的另一个+1,它是一颗真正的宝石。 (2认同)

小智 34

当你不得不问,它可能太多了.

  • 基本上与这个完全相同的重复问题中的接受答案相同:http://stackoverflow.com/questions/174968/how-many-parameters-are-too-many (2认同)

Ond*_*ták 12

正如Steve McConnell在Code Complete中提到的那样,黄金法则是4 +/- 3个参数.对于普通人来说,很难记住超过4个参数,5-7应该只在特殊情况下使用,你永远不应该使用8个或更多.

  • 提到神灵的强制性+1 (2认同)

Maw*_*awg 8

大佛!! 九十七????

良好的做法通常建议最大.六到八个.当然,ymmv,可能有一个有效的理由,不时,为第九.但97 ?? !!

一些想法......这些只是数据,还是基于价值观做出的决定?

如果许多/大多数影响流量控制,则您具有几乎不可维护(甚至可理解或可测试)的"设计"(对于"设计"的小值).

如果它们只是数据,它们是否可以分组为结构和指针,通过这些结构?

你有设计文件吗?可能会解释发生了什么.

哦,而且,"危险,威尔罗宾逊" - 任何公开传递97个参数的人也可以传递任何数字 - 不是那么明显 - 作为全局变量.

Ps不知道Eclipse如何在Java上工作,但是使用C/C++,如果你将paramaeters放在不同的行上

char DoEverything(
        int meaninglessParameterName1,
        char *meaninglessParameterName2,
        ....
        long double *meaninglessParameterName97)
        { return !NULL;}
Run Code Online (Sandbox Code Playgroud)

Eclipse实际上会识别带有错误参数的行


Mar*_*iss 5

好吧,如果你使它成为一个JSON对象,你可以将所有97(或更多)包装在该对象中,并只发送一个对象.