在方法中初始化成员变量而不是构造函数

时间:2011-06-10 17:16:40

标签: methods parameters coding-style

我有一个使用变量的公共方法(仅在公共方法的范围内)我作为参数传递,我们将调用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次

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我自己也有同样的问题 我在3个不同的上下文中以不同的方式实现它,以便使用3种不同的策略来实现结果,见下文。

请注意,我是程序员的类型,它对代码进行了许多更改,总是试图改进它。因此,我只针对易于修改的代码,readbale,你会称之为“灵活”代码。我只接受非常清晰的代码。

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

  1. 如果您有一个或两个 - 短数字 - 这样的值,则传递as参数是完全可以的。通过参数具有非常好的可视性,清晰度,清晰的通过线,明显的生命周期(初始化点,破坏点),易于更改,易于跟踪。
    如果这些值的数量开始增长到> = 5-6的值,我会接近下面的#3。

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

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

  4. 祝你好运

    Edit

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

答案 2 :(得分:1)

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

否则,我认为这看起来并不奇怪。如果你只需要一个只有一个函数,那么把它变成你班级的私有变量就会很愚蠢(至少对我而言)。然而,如果你需要它20次,我会这样做:P或者甚至更好,只需使'a'成为你自己的对象,具有你需要的某种功能。

答案 3 :(得分:1)

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

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

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

底线
问自己这个问题,你作为成员制作的参数是否代表有关该对象的任何信息(数据)? (数据可以是状态或唯一标识信息)。如果他的问题的答案是明确的,那么不要将参数作为班级成员包括在内。

更多信息