2011-06-10 48 views
1

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

其他信息:参数是一个只读拥有超过100项映射和现实中我将调用private_method约50倍

回答

2

我自己也有同样的问题。
我在3种不同的环境中以不同的方式实现它,以便亲身体验使用3种不同策略的结果,请参见下文。

请注意,我是一种程序员,对代码进行了许多更改,总是试图改进它。因此,我只为适合修改的代码解决问题,readbale,你会称之为“灵活”代码。我只为非常明确的代码解决。

实验之后,我来到了以下结果:

  1. 传递一个作为参数是完全确定的,如果你有一个或两个 - 短号码 - 这种价值的。通过参数具有非常好的可见性,清晰度,清晰的传递线,清晰可见的生命周期(初始点,破坏点),易于修改,易于追踪。
    如果这些值的数量开始增加到> = 5-6个值,我将切换到下面的#3。

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

  3. 作为替代(1)和(2),我采用了内部类方法,在这种情况下,当这样的值大于5(这会导致太长的参数列表)。
    我将这些值打包成小的内部类,并通过引用将此类对象作为参数传递给所有内部成员。
    一个类的公共函数通常会创建一个Inner类的对象(我称之为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++)

+0

即使我打电话方法50+次? – zode64 2011-06-10 18:39:00

+0

正确地说,如果方法需要超过5-6个参数,那么最好将它们作为表示参数的另一个类的实例传递。 – 2011-06-11 02:40:45

+0

@whatsthebeef。你在说源代码中的50个地方吗?或在呼叫发生时运行时发生50多次事件? – Andrei 2011-06-11 08:26:15

2

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

1

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

否则,我不认为这看起来很奇怪。如果你只需要一个函数,将它作为你的类的私有变量将是愚蠢的(至少对我来说)。然而,如果你需要它20次,我会这么做:P或者更好,只要让'a'成为你自己需要的某个功能的对象。

+0

其实我需要调用它20倍以上,仍不能确定使它成为一个成员变量,但+1建议把它作为我自己的一个对象,在这种情况下,它是一个相当独立的组件之间共享的地图,所以我不想让它们都需要共享对象,但这是未来的计划 – zode64 2011-06-10 18:33:11

1

一个方法理想情况下不应该超过7个参数。使用大于6-7的参数数通常表明设计有问题(7个参数是否表示嵌套类的对象?)。

至于你的问题,如果你想让参数仅用于私有方法之间传递,而不需要参数与对象的当前状态(或有关对象的某些信息)有任何关系,那么建议您不要这样做。

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

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

更多信息

相关问题