【问题标题】:Using a Class Variable vs Sending Local Variable to Functions/Methods使用类变量与将局部变量发送到函数/方法
【发布时间】:2011-07-29 05:17:13
【问题描述】:

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

例如,我可以有一个函数:

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

或者我可以有一个类变量“_var”并在同一个函数中使用它,像这样:

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

我的想法是,如果我们有一个要在某个函数/方法中使用的类变量,在上面的示例中称为 DoSomething,我应该将 DoSomething 函数/方法发送为类变量一个参数,使函数更易于阅读和测试。

什么时候这样做比较好?我知道这是一个加载的问题,但我正试图为我与同事的论点提出理由,他们说我会在函数/方法签名中添加更多代码,而不是保留函数/方法签名更小。

在我看来,通过将类变量推送到相应的函数/方法,而不是强迫它们依赖/知道类变量的存在,我正在使代码更简洁和更易于维护。

请指教。

【问题讨论】:

    标签: java c++ function object


    【解决方案1】:

    它不应该是提供更多或更少的代码或需要更多努力才能输入的内容。它是关于在该类和功能的上下文中更合乎逻辑的内容。像您一样将事物彼此隔离通常是一件好事,但不要过度使用。当从函数的目的清楚地知道它应该处理包含在类 var 中的值时,它应该这样做而不是通过参数接收值。

    【讨论】:

      【解决方案2】:

      对于任何一般情况,唯一出乎意料的答案是:这取决于您的具体情况。数据成员、静态成员和函数参数都有不同的用途。当然,我们可以提供一些关键提示,告诉您应该寻找哪种类型的标志来选择其中一种。

      典型案例:

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

      错误选择有一些常见的症状。

      考虑以下问题:

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

      我的印象是您和您的同事对这个参数的性质存在简单的误解。确保你清楚地理解你同事的论点并让自己清楚。试着改写你想说的是什么。

      【讨论】:

      • 感谢您的反馈安德烈。我同事的原始设计涉及通过构造函数对类变量进行动态初始化,并且该类变量在类中的多个函数中使用。我删除了这个依赖,而是将有问题的变量发送到函数调用,然后在其他函数调用中使用它。由于变量没有封装数据然后传播到其他地方,我认为 DoSomething(int var) 函数会更合适。再次感谢您的周到回复。
      【解决方案3】:

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

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

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

      【讨论】:

      • 感谢您的回复!是的。这正是我正在准备的论点,在我上面对安德烈的评论中概述了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多