【问题标题】:Initialize member variables in a method and not the constructor在方法而不是构造函数中初始化成员变量
【发布时间】:2011-06-10 17:16:40
【问题描述】:

我有一个使用变量的公共方法(仅在公共方法的范围内)我作为参数传递我们将调用 A,此方法多次调用私有方法,这也需要参数。

目前我每次都在传递参数,但看起来很奇怪,将这个成员变量设置为类是不好的做法,还是不确定它是否被初始化是不必传递它的优点?

简化伪代码:

public_method(parameter a)
    do something with a
    private_method(string_a, a)
    private_method(string_b, a)
    private_method(string_c, a)

private_method(String, parameter a)
    do something with String and a

附加信息:参数 a 是一个包含 100 多个条目的只读映射,实际上我将调用 private_method 大约 50 次

【问题讨论】:

    标签: methods parameters coding-style


    【解决方案1】:

    我自己也遇到过同样的问题。
    我在 3 种不同的上下文中以不同的方式实现它,以亲身体验使用 3 种不同策略的结果,见下文。

    请注意,我是那种对代码进行许多更改的程序员,总是试图改进它。因此,我只满足于可以更改的代码,readbale,你会称之为“灵活”代码吗?我只满足于非常清晰的代码。

    经过实验,我得出了这些结果:

    1. 如果您有一个或两个(短数字)这样的值,传递一个 as 参数是完全可以的。传入参数具有非常好的可见性、清晰度、清晰的传球线、清晰可见的寿命(初始化点、破坏点)、易于更改、易于跟踪。
      如果此类值的数量开始增长到 >= 5-6 个值,我将转向下面的 #3。

    2. 通过类成员传递值 - 对我的代码的清晰度没有好处,最终我摆脱了它。它使代码不太清晰。代码变得混乱。我不喜欢它。它没有任何优势。

    3. 作为 (1) 和 (2) 的替代方案,我采用了内部类方法,以防此类值的数量 > 5(这会导致参数列表过长)。
      我将这些值打包到小的内部类中,并通过引用将此类对象作为参数传递给所有内部成员。
      类的公共函数通常会创建一个内部类的对象(我称之为 Impl 或 Ctx 或 Args)并将其传递给私有函数。
      这结合了 arg 传递的清晰性和简洁性。太完美了。

    祝你好运

    Edit

    Consider preparing array of strings and using a loop rather than writing 50 almost-identical calls. Something like char *strings[] = {...} (C/C++).

    【讨论】:

    • 即使我调用该方法 50 多次?
    • 正确地说,如果方法需要超过5-6个参数,那么最好将它们作为另一个代表参数的类的实例传递。
    • @whatsthebeef。您是在说源代码中的 50 个位置吗?还是在调用发生时在运行时发生 50 多次?
    • 作为一种通用方法,它会导致一些负面后果。 1. 在线程应用程序中,将本地变量任意转换为类成员会使类突然变得非线程安全。 2. 如果在 public_method 返回后将此映射保留为类中的成员,那么您将浪费更长的内存,否则会在 public_method 返回时更早释放。作为设计规则,变量/对象应最迟在需要时分配,在不需要时尽早处置。如果您试图将源代码缩短 N 个字符,有时这很好,但绝不是设计目标。
    【解决方案2】:

    这实际上取决于您的用例。 'a' 是否代表您的应用程序/对象关心的状态?然后你可能想让它成为你的对象的成员。评估大局,在设计结构时考虑维护和可扩展性。

    【讨论】:

      【解决方案3】:

      如果您的参数 a 是您自己的类的 a,您可以考虑将 private_method 设为变量 a 的公共方法。

      否则,我不认为这看起来很奇怪。如果您只需要 1 个函数,那么将其作为类的私有变量将是愚蠢的(至少对我而言)。但是,如果您需要它 20 次,我会这样做 :P 或者更好的是,只需将“a”作为您自己的对象,它具有您需要的特定功能。

      【讨论】:

      • 实际上我需要调用它超过 20 次,仍然不确定是否将其设为成员变量,但 +1 建议将其设为我自己的对象,在这种情况下,它是一张地图在相当独立的组件之间共享,所以我不想制作它们都需要的共享对象,但这是未来的计划
      【解决方案4】:

      理想情况下,一个方法不应传递超过 7 个参数。使用超过 6-7 个参数的数量通常表明设计存在问题(这 7 个参数是否代表嵌套类的对象?)。

      至于您的问题,如果您只想将参数设为私有只是为了在私有方法之间传递而参数与对象的当前状态(或有关对象的某些信息)有任何关系,那么它不建议您这样做。

      从性能的角度(内存消耗)来看,引用参数可以作为方法参数传递,而不会对内存消耗产生任何重大影响,因为它们是通过引用而不是值传递的(即数据的副本不是创建)。对于可以组合在一起的少量参数,您可以使用struct。例如,如果参数表示一个点的xy 坐标,则将它们传递到单个Point 结构中。

      底线
      问自己这个问题,您作为成员创建的参数是否代表有关对象的任何信息(数据)? (数据可以是状态或唯一标识信息)。如果他的问题的答案是明确的否,则不要将该参数包含为类的成员。

      更多信息

      【讨论】:

        猜你喜欢
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 2011-05-02
        • 2023-03-14
        相关资源
        最近更新 更多