【问题标题】:Method Parameter Dilemma方法参数困境
【发布时间】:2013-08-27 20:46:59
【问题描述】:

我在创建课程时总是停下来。我对建筑学相当中等,所以请耐心等待。这是我的困境。我最终在课堂上遇到了一个问题,我不得不问自己:“当我可以从类的属性或私有支持字段中获取我需要的东西时,这个方法是否需要参数?”。

现在对于公共方法,显然您很可能应该有参数,因为有人将使用您的类并使用这些方法,无论它们是在实例类还是静态类中。那场辩论与公共方法无关,因为这对我来说是显而易见的。如果您的类中有一个公共方法,即使假设您可以从该类中的属性或私有字段中获取所需的值之一,而不是需要该方法的参数并使用该参数,您应该仍然需要参数并使用参数,或者至少在您可以指定一些参数时不要将它们计算在内。至少我是这样看待公共方法的,因为谁知道其他人可能如何使用该方法,他们需要知道需要传递什么,并且他们需要将实际数据传递给该方法,因为它们在您的类之外。

例如,当我创建和使用私有方法或类似的东西时,问题就出现了。假设我创建了一个自定义控件 (.cs)。它的工作是运行一堆方法,我已经分解了这个控件的逻辑,并创建了一些 HTML 字符串输出到浏览器。好吧,我创建了一个公共属性,以便使用此控件的任何人都可以为其提供特定对象。那个特定的对象是我班级中一半的方法用来帮助生成 HTML 的。因为它是一个属性,所以我的自定义类中的任何方法都可以使用它。所以它完全绕过了在其中一些方法中创建参数的任何需要,因为我可以从属性中获取它。但是后来我到了创建大量无参数方法的地步,因为我从支持字段或支持字段和属性的组合中获取对象。或者当我能够在这个类中以其他方式获得我需要的东西时,我可能只是从一些建议中获得它们?但是后来有人对您说不,那是坏人,您确实偶尔需要参数...至少是参数的组合并在您的方法中使用一些支持字段或属性等,但不要总是打折参数即使这些参数可能是传递给它的一些内部信息(字段或属性)。但话又说回来,如果我要将内部作为参数传递,那么不通过方法作为参数而是直接在方法本身内部访问和使用这些字段或属性之间的细微差别。

但这让我很困扰,因为我质疑为什么在可以在其他地方获取值的情况下需要方法参数。

有人可以在这里解释一下细线并帮助我就在您的方法或属性中使用大量支持字段而不是您在方法中指定的某些参数之间的界线得出结论......即使其中一些参数可能当另一个方法调用它时,仍然从支持字段或属性传递一个值吗?

我希望这有任何意义,但我不能是唯一一个遇到这种困境的人。也许我是唯一一个想到这个 sh** 的人,我认为我不知道。但我个人对 OOP 的主要问题是,有太多该死的方法可以得到你需要的东西(构造函数、属性、支持字段、方法)。

【问题讨论】:

    标签: c#


    【解决方案1】:

    少喝咖啡,少说话 ;-)

    总结

    什么时候在方法中使用参数?

    简短回答

    当需要的信息在对象中可用时,根据不要重复自己的原则

    无参数方法很好,不需要告诉对象它已经知道的事情

    【讨论】:

    • 这是我从一位密友那里得到的答案,这也是我认为的另一个很好的答案:首先,公共方法:外部调用者是否需要提供差异值?对于私有(和公共)来说,考虑继承以及是否会传入不同的值......
    • @[coffeeaddict]:我必须表面上不同意你的朋友:如果传入的参数(语义上)与对象属性相同,那么它是多余的。如果传入的参数改变了对象属性的值,那么它就违反了 DRY 原则,并导致该方法具有不明显的副作用。
    【解决方案2】:

    史蒂夫的回答很好。 只需在 C# 4.0 中添加,您也可以使用默认参数的功能。这在某些情况下很有用,特别是实用程序类。我的 OracleHelper 类中有这样的方法

    ExecuteReaderNoParam(OracleConnection conn, string cmdText, OracleTransaction trans, CommmandType cmdType)
    

    大多数调用者不需要提供事务和命令类型。使用默认参数,我可以将方法编写为

    ExecuteReaderNoParam(OracleConnection conn, string cmdText, OracleTransaction trans=null, CommmandType cmdType = CommandType.StoredProcedure)
    

    调用者可以直接调用

    OracleConnection connection = new OracleConnection(connectionString);
    OracleHelper.ExecuteReaderNoParam(conn, "SP_GET_ALL_STATUS");
    

    【讨论】:

      【解决方案3】:

      另外(关于其他答案),参数越少,该方法的可读性和方便性越高。如果一个方法需要很多参数,它可能违反Single Responsibility Principle,并且可以拆分为几个更简单的方法,这样更易​​于使用和理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多