使用类变量与将本地变量发送到函数/方法

时间:2011-04-04 14:06:37

标签: java c++ function object

什么时候将局部变量作为参数推送到函数/方法,而不是使用类变量代替函数/方法变量。

例如,我可以有一个功能:

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

或者我可以有一个类变量“_var”并在同一个函数中使用它,如下所示:

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

如果我们在上面的示例中有一个名为DoSomething的函数/方法中使用了一个类变量,那么我应该发送DoSomething函数/方法将类变量作为参数,以便该函数更易于阅读和测试。

何时做好表格?我知道这是一个有问题的问题,但是我试图用同事来说明我的论点,他们说我会在函数/方法签名中添加更多代码,而不是保留函数/方法签名较小。

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

请告知。

3 个答案:

答案 0 :(得分:10)

对于任何一般情况,唯一的答案是:它取决于您的具体情况。数据成员,静态成员和函数参数都提供不同的目的。当然,我们可以提供一些关键提示,以便您选择其中一种或哪种标志。

典型案例:

  • 数据成员:该值是对象的一部分(如类的实例)状态。您希望对方法的其他调用反映此特定状态。
  • 静态成员:该值与所有类的实例具有同时,相同的含义。这通常仅用于常量(即使在运行时初始化时,如单例),但在某些情况下,需要可变的类状态。
  • 函数参数:该值仅对函数/方法的特定执行有意义。此值可能会从一次调用更改为下一次调用。

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

考虑以下问题:

  • 您是否始终将相同的值传递给方法,无论您从哪里调用它?考虑使参数为常量并隐藏参数。考虑定义重载:一个没有参数的常见情况和一个带有灵活性的参数。
  • 每次调用函数时是否需要设置数据成员(通过setter)?考虑将值作为函数的参数。如果您需要用两行替换每个调用来预先设置值,则无需保存函数签名。

我的印象是你和你的同事对这个参数的性质有一个简单的误解。确保你清楚地了解你的同事的论点并明确自己。试着改写一下你想说的是什么。

答案 1 :(得分:2)

我用依赖来看待它,即谁依赖于变量(在你的情况下是var),它是方法还是类?

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

或者,如果您的课程不关心var并且在其他任何地方都不需要,并且只有DoSomething()需要var,那么DoSomething(int var)是必不可少的。

答案 2 :(得分:0)

它不应该是什么提供更多或更少的代码或更多的努力键入。它是关于在类和函数的上下文中更合乎逻辑的东西。像你一样保持彼此隔离的东西通常是一件好事,但不要过度。当从函数的目的清楚它应该处理类var中包含的值时它应该这样做而不通过参数接收值。

相关问题