使用类变量与将局部变量发送到函数/方法

问题描述:

何时将局部变量作为参数推送到函数/方法,而不是使用类变量来代替函数/方法变量,这是一种很好的形式。使用类变量与将局部变量发送到函数/方法

举例来说,我可以有一个功能:

int DoSomething(int var) 
{ 
    if(var == -1) 
    return 0; 
} 

或者我可以有一个类变量“_var”,并用它在相同的功能,就像这样:

int DoSomething() 
{ 
    if(_var == -1) 
    return 0; 
} 

我如果我们在上面的例子中有一个函数/方法需要使用一个类变量,称为DoSomething,那么我应该把函数/方法的类变量作为参数发送给函数/方法,这样函数就更容易了阅读和测试。

什么时候该做什么好的形式?我知道这是一个加载的问题,但我试图为我与同事的争论提供一个案例,他们说我会向函数/方法签名添加更多代码,而不是保留函数/方法签名较小。

在我看来,通过将类变量推送到相应的函数/方法,而不是强迫他们依赖/了解类变量的存在,我将代码更简洁,更容易维护。

请指教。

蓝色的唯一答案,对于任何一般情况是:这取决于您的具体情况。数据成员,静态成员和函数参数都服务于不同目的。当然,我们可以给出一些关键的提示,您可以选择哪种类型的标志来选择其中一种。

典型病例:

  • 数据构件:该值是对象的(如在一个类的实例)的状态的一部分。你想要其他方法来调用这个特定的状态。
  • 静态成员:该值具有同时存在,与全部相同的含义该类的实例。这通常仅用于常量(即使在运行时初始化,如单例),但在某些情况下,需要可变类的状态。
  • 函数参数:该值仅对函数/方法的特定执行有意义。这个值可能会随着一次调用而改变。

有一些不良选择的常见症状。

考虑以下问题:

  • 你总是相同的值传递给方法,无论你来自哪里打电话吗?考虑让参数保持不变并将参数隐藏起来。考虑定义重载:一个没有关于普通情况的论证,另一个关于灵活性的论点。
  • 你每次调用函数时都需要设置一个数据成员(通过setter)吗?考虑将值作为函数的参数。如果您需要用两条线路替换每个呼叫以预先设置该值,则无需保存功能签名。

我的印象是,你和你的同事对这个参数的性质有一个简单的误解。确保你清楚地理解你的同事的论点,并让自己清楚。尝试改述你想说的是什么。

+0

感谢您的反馈安德烈。我的同事的原始设计是通过构造函数对类变量进行动态初始化,并且该类变量在类中的多个函数中使用。我删除了这个依赖关系,而是将有问题的变量发送给一个函数调用,然后在其他函数调用中使用它。由于变量没有封装数据然后在其他地方传播,我认为DoSomething(int var)函数会更合适。再次感谢您的深思熟虑的回应。 – Rick 2011-04-04 15:42:11

我以依赖关系来看它,即谁依赖于变量(在你的情况下是var),它是一种方法还是一个类?

例如, JavaBeans的类变量依赖于类,所以如果类需要这些变量,那么DoSomething()是最好的。

另外,如果你的类不关心var,并且不需要任何其他地方,只需要DoSomething()var,然后DoSomething(int var)是必不可少的。

+0

感谢您的回复!是。这正是我正在准备的论点,在我对安德烈的评论中概述。 – Rick 2011-04-04 15:43:13

它不应该是关于什么给或多或少的代码或需要更多努力键入。这是关于什么是在该类和功能的背景下更合理。像你一样保持彼此隔绝的东西通常是件好事,但不要过度。从函数的目的来看,它应该处理类var中包含的值,它应该这样做,而不是通过参数接收值。