【问题标题】:Is it better to use local or global variables使用局部变量还是全局变量更好
【发布时间】:2017-12-30 16:37:08
【问题描述】:

使用局部变量还是全局变量更好?

假设谈论 2000 多行 android(java) 服务类,所有服务都在处理“请求”对象和类似的共享对象。

如果我将所有内容都设为本地(保留在函数内部),则每次都需要传递许多变量,或者多次覆盖同一个函数。我需要确保对象和子对象也不为空。

如果我将一些变量设为全局变量(跨类),我可以共享它们,跨函数使用它们。我认为这会让一切变得更容易。

在函数内部定义变量或全局定义有哪些优点和缺点。在实践中和理论上(可读性等)。

有推荐的方法吗?

谢谢。

【问题讨论】:

  • 这很简单。全局变量几乎总是一个错误,会以意想不到的方式咬你。此外,将 值 传递给函数是 Java 所做的。
  • “如果我将一些变量设为全局变量(跨类)”——类中的普通字段并不是大多数程序员使用该术语的“全局”字段。如果您提供minimal reproducible example 来准确地演示“使某些变量成为全局变量”的含义,您可能会有更好的运气。
  • 根据这种思路,领域是邪恶的,应该避免吗?
  • @efekctive 具体来说,可变字段是邪恶的。如果不必要地使用,可变性增加的复杂性比它节省的复杂性要多。
  • @MmtBkn 如果你有一个带有这么多参数的函数,你需要重构这个函数,也许还需要定义一些新的对象。删除参数只会让事情变得更糟。

标签: java android software-design


【解决方案1】:

总是更喜欢本地而不是全球。如果您需要将数据作为多个参数传递,那就这样吧。至少那时您明确说明了您的功能所依赖的数据。参数过多肯定是个问题,但将其中一些作为全局变量卸载并不是解决办法。

如果您依赖全局变量,则可能不清楚某些数据的来源。如果全局变量是可变的,那么一旦您开始尝试调试一个难题,您手上就会一团糟,因为当某些全局变量被修改时可能并不明显。

请注意,不可变常量全局变量也不错。如果您有一个在许多函数中都需要的常量(例如 PI),那么将其设为全局是有意义的。不可变常量不会受到上述缺点的影响,因为它们不能改变。

【讨论】:

    【解决方案2】:

    这一切都取决于变量的范围。如果您觉得某个变量会通过传递各种函数来获取多个值,那么请使用局部变量并在函数调用中传递它们。 如果你觉得你需要使用的某个变量会有常量值,那就声明为全局变量吧。

    【讨论】:

      【解决方案3】:

      您编写了超过 2000 行的服务类。你完成了这个项目。凉爽的 !现在一个月后,您收到了一个错误报告,需要修复它。


      让我们来看看两种不同的情况:

      案例 1

      您又回到了服务代码。您会看到func1() 使用globalVariabl1。好的,但现在它的价值是多少?它是如何变化的?谁在涉及此功能之前改变了globalVariabl1?所有这些突变的顺序是什么?你不会知道的。要弄清楚这一切将是相当困难的。

      案例 2

      你回到你的代码,看到func0() 获取一些东西,然后将它作为参数传递给func1(param1)。您清楚地知道数据是什么,它是如何到达这里的。


      在什么情况下更容易解决错误? 大多数情况下,CASE 2 会更容易。

      局部变量

      局部变量总能帮助你。即使您编写代码并使用局部变量,调用语句本身也会告诉您此函数依赖于此特定数据。它可以帮助您小心传递的内容。

      全局变量

      当全局变量代表类/对象的state 时,或者即使它们是常量(通常应该全部为大写字母)时,它们也可以。当您只需要经常访问该值时,它们也可以很好,并且您知道该变量将在您使用它时始终被初始化(例如在 onCreate() 中对其进行初始化)

      【讨论】:

        【解决方案4】:

        Java 中没有全局变量。您指的是成员变量。基本规则是变量应该具有尽可能小的封闭范围。

        【讨论】:

          【解决方案5】:

          我知道这个问题已经得到解答,我赞成 Carcigenicate 的回答。

          为了详细说明他的观点,我建议您尝试测试驱动开发实践。一旦您开始结合单元测试编写代码,您就会意识到全局变量有多糟糕,并且您会意识到您正在编写无法测试的代码,而无需实现不必要的依赖注入。

          还有一件事。每当您开始处理多线程和并发时,全局变量都是一个巨大的错误。听起来您并没有处理这个问题,但在您决定创建全局变量时请记住这一点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-24
            • 2017-11-08
            • 1970-01-01
            相关资源
            最近更新 更多