Parameters 有多少个参数太多?

Parameters 有多少个参数太多?,parameters,language-agnostic,Parameters,Language Agnostic,例程可以有参数,这不是新闻。您可以根据需要定义尽可能多的参数,但是太多的参数会使您的例程难以理解和维护 当然,您可以使用结构化变量作为解决方法:将所有这些变量放在单个结构中,然后将其传递给例程。事实上,使用结构简化参数列表是Steve McConnell在《代码完成》中描述的技术之一。但正如他所说: 谨慎的程序员避免绑定逻辑上不必要的数据 所以,如果你的例程有太多的参数,或者你用一个结构来伪装一个大的参数列表,那么你很可能做错了什么。也就是说,你没有保持耦合松散 我的问题是,什么时候我可以考虑一

例程可以有参数,这不是新闻。您可以根据需要定义尽可能多的参数,但是太多的参数会使您的例程难以理解和维护

当然,您可以使用结构化变量作为解决方法:将所有这些变量放在单个结构中,然后将其传递给例程。事实上,使用结构简化参数列表是Steve McConnell在《代码完成》中描述的技术之一。但正如他所说:

谨慎的程序员避免绑定逻辑上不必要的数据

所以,如果你的例程有太多的参数,或者你用一个结构来伪装一个大的参数列表,那么你很可能做错了什么。也就是说,你没有保持耦合松散


我的问题是,<强>什么时候我可以考虑一个参数列表太大?< /强>我认为超过5个参数,太多了。你觉得怎么样?

对我来说,当列表在我的IDE上跨越一行时,它就是一个参数太多了。我希望在一行中查看所有参数,而不中断眼神交流。但这只是我个人的偏好。

我大体上同意5,但是,如果有一种情况我需要更多,并且这是解决问题的最清晰的方法,那么我会使用更多。

根据Perl最佳实践,3是可以的,4是太多了。这只是一个指导原则,但在我们的商店里,这是我们努力坚持的。

如果你开始在心里计算签名中的参数并将其与调用匹配,那么是时候重构了

似乎除了数字之外还有其他考虑因素,下面是我想到的一些:

  • 功能主要用途与一次性设置之间的逻辑关系

  • 如果它们只是环境标志,那么绑定就非常方便


  • 这在很大程度上取决于你工作的环境。以javascript为例。在javascript中,传入参数的最佳方法是使用具有键/值对的对象,这实际上意味着您只有一个参数。在其他系统中,最佳点将在3或4处


    最后,这一切都归结为个人品味。

    作为一般经验法则,我只谈三个参数。现在是时候传递一组参数或一个配置对象了,这也允许在不更改API的情况下添加未来的参数。

    我自己将公共函数的限制定为5个参数


    依我看,长参数列表仅适用于只能从代码中的几个特定位置调用的私有/本地助手函数。在这种情况下,您可能需要传递大量的状态信息,但可读性并不是一个大问题,因为只有您(或将维护代码并理解模块基本原理的人)需要关心调用该函数。

    我同意3是可以的,4作为指导原则太多了。使用3个以上的参数,您不可避免地要执行不止一项任务。应将多个任务拆分为单独的方法


    然而,如果我看一看我所从事的最新项目,例外情况会比比皆是,大多数情况下很难归结为3个参数。

    什么时候会有如此淫秽的东西被认为是可以监管的,尽管第一修正案保证言论自由?根据波特·斯图尔特大法官的说法,“当我看到它的时候我就知道了。”这里也是如此

    我讨厌制定这样的硬性规定,因为答案的变化不仅取决于项目的规模和范围,而且我认为它甚至会在模块级别上发生变化。根据您的方法在做什么,或者类应该表示什么,很可能2个参数太多,这是耦合太多的症状

    我建议你首先提出这个问题,并尽可能多地限定你的问题,这样你才真正了解所有这些。这里最好的解决方案不是依赖于一个硬性的数字,而是关注同行之间的设计评审和代码评审,以确定内聚性和紧密耦合性较低的领域

    永远不要害怕向同事展示你的工作。如果你害怕,那可能是更大的迹象,表明你的代码有问题,而且你已经知道了。

    年,罗伯特·C·马丁用了四页来讨论这个问题。要点如下:

    函数的理想参数数 函数为零(niladic)。接下来是 一个(一元),紧随其后的是两个 (二元)。三个参数(三元) 应尽可能避免。更多 三个以上(多元酸)需要非常 特别的理由——然后 无论如何都不应该使用


    这个答案假设使用OO语言。如果您没有使用这个答案,请跳过这个答案(换句话说,这不是一个与语言无关的答案)

    如果传递的参数超过3个左右(特别是内在类型/对象),并不是因为“太多”,而是因为您可能错过了创建新对象的机会

    寻找传递到多个方法中的参数组——即使是传递到两个方法中的参数组,也几乎可以保证在其中有一个新对象


    然后你将功能重构到新对象中,你不会相信它对你的代码和你对OO编程的理解有多大帮助。

    我过去处理过的一些代码使用全局变量只是为了避免传递太多的参数

    请不要那样做


    (通常)

    参数列表的长度限制只是又一个限制。限制意味着应用暴力。这听起来很有趣,但即使在编程时也可以是非暴力的。让代码来规定规则。很明显,如果有许多参数,函数/类方法的主体将足够大,可以使用它们。A第二大
    void *
    mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t offset);
    
    HWND CreateWindowEx
    (
      DWORD dwExStyle,
      LPCTSTR lpClassName,
      LPCTSTR lpWindowName,
      DWORD dwStyle,
      int x,
      int y,
      int nWidth,
      int nHeight,
      HWND hWndParent,
      HMENU hMenu,
      HINSTANCE hInstance,
      LPVOID lpParam
    );