代码之家  ›  专栏  ›  技术社区  ›  Samiksha

关于传递多个参数

  •  9
  • Samiksha  · 技术社区  · 17 年前

    我有大约8-9个参数要传递给一个返回数组的函数。我想知道,直接在函数中传递这些参数还是传递一个数组更好?哪种方式更好,为什么?

    10 回复  |  直到 16 年前
        1
  •  12
  •   Stefan    17 年前

    如果我要做什么,那就是创建一个包含所有参数的结构,以获得良好的智能和强名称。

    public struct user 
    { 
        public string FirstName; 
        public string LastName; 
        public string zilionotherproperties; 
        public bool SearchByLastNameOnly; 
    } 
    public user[] GetUserData(user usr) 
    { 
        //search for users using passed data and return an array of users. 
    } 
    
        2
  •  6
  •   Dave Markle    17 年前

    逐一传递它们,因为:

    • 这是类型安全的方法。
    • IntelliSense将在Visual Studio中接受它,当你编写调用函数时,你会知道什么是什么。
    • 这样执行会更快。

    但是,如果参数确实是数组,则传递数组。例子:

    对于看起来像这样的函数,使用以下符号:

    Array FireEmployee(string first, string middle, string last, int id) {...}
    

    对于看起来像这样的函数,请使用数组:

    Array FireEmployees(Employee[] unionWorkers) {...}
    
        3
  •  4
  •   Don Kirkby    17 年前

    您的场景在Martin Fowler的重构书中介绍了参数对象重构。这本书很值得拥有,但对于那些不值得拥有的人来说,它描述了重构 here 。还有一个预览 publisher's site 以及谷歌图书。它建议不要用数组替换参数,而是用新对象替换。

        4
  •  3
  •   Stefan    17 年前

    关于Skeets对我上面例子的评论,他会使用类而不是结构,也许我也会更清楚地说明在哪里使用类和在哪里使用结构。我想还有其他人对此也很好奇。

    正如我所看到的,使用类的主要原因是你可以使其不可变,但结构也是如此吗?

    例如:

    struct user 
    { 
    public user(string Username, string LastName) 
    { 
        _username = Username; 
    } 
    private string _username; 
    public string UserName { 
        get { return _username; } 
    } 
    

    }

    我早就觉得,当我们可以在结构中拥有属性、初始化器、字段以及类所拥有的一切时,我不再知道类和结构之间的区别了。我知道类是引用类型,结构是值类型,但在上述情况下,将其用作函数中的参数有什么区别呢?

    我在网站上找到了对差异的描述 http://www.startvbdotnet.com/oop/structure.aspx 这个描述正是我在脑海中所描绘的:

    结构可以被定义为一种工具 用于在逻辑上处理一组 相关数据项。他们是 用户定义并提供一种方法 将不同的数据打包在一起 类型。结构与 班级。就像课堂一样,他们也可以 包含字段和 方法。主要区别在于 类和结构是,类是 参考类型和结构是 值类型。实际上, 结构用于较小的 轻量级对象,不 坚持很长时间,并使用类 对于预期的较大物体 长时间存在于记忆中。

    也许这应该是一个自己的问题,但当我们对结构和类作为参数有不同的看法时,我觉得这是相关的。

        5
  •  2
  •   Frank Krueger    17 年前

    我假设你使用的是C#4,可以使用命名参数:

    FireEmployee(
        first: "Frank",
        middle: "",
        last: "Krueger",
        id: 338);
    

    这些使得代码几乎和VB或Smalltalk一样可读。 :-)

    如果没有,我会同意戴夫·马克尔的说法。

        6
  •  2
  •   Peter Wone    17 年前

    如果这是大量使用的库代码,并且某些参数具有默认值的典型值,那么您应该考虑Dave Markle的建议,并提供一系列参数逐渐减少的重载。这是《Microsoft Framework设计指南》中推荐的方法。

    或者,您可以使用Stefan的方法获得类似的效果,通过使用成员初始化器设置默认值并使用一系列ctor重载。

        7
  •  1
  •   Francis Stephens    17 年前

    如果你真的不想单独传递你的参数,我建议创建一个新类来封装你的所有参数。为此,您可以(在Java中,最有可能在C#中)在包含粗糙方法的类中声明一个公共内部类。这避免了让类四处浮动,而这些类实际上只是辅助类型。

        8
  •  1
  •   Anton    17 年前

    我会说,也要单独通过它们。我不喜欢创建一个类,然后将该类作为参数传递的想法。这是一种印章耦合的形式,这意味着由于一个类使用另一个类,因此进行更改将更加困难。重用一个类意味着你也必须重用另一个类。

    你可以使用接口来减少戳耦合,但这对我来说开销太大了,所以我喜欢单独传递参数。

        9
  •  0
  •   Jonathan Schuster    17 年前

    一个函数真的需要8-9个参数吗?在我看来,如果你需要那么多参数,那么你可能在该函数中做了太多不同的事情。尝试将代码重构为单独的函数,以便每个函数都有一个目的。

        10
  •  -1
  •   hhafez    17 年前

    除非函数作用于数组,否则不要将它们作为数组传递,我也不会创建新的数据结构来对参数进行分组,原因如下

    1. 传递新的数据结构会隐藏函数真正需要的输入内容(它需要所有数据结构/部分数据结构吗?)

    2. 与1相关,它使UT变得更加困难(在编写UT时,您需要重新创建整个数据结构)

    3. 如果输入参数不相关,您最终会得到一个新的数据结构,该结构将无关的数据类型分组,除了使函数调用看起来更整洁之外,没有其他原因

    4. 如果您选择将新的数据结构传递给您的函数,则该函数不能在定义新数据结构的作用域中使用

    实际上,将每个参数传递给函数的唯一缺点是,您可能无法将函数放入一行代码中,但不要忘记在函数调用之前需要填充数据结构的行。

    推荐文章