请描述您在尽量减少使用全局变量方面的挣扎[关闭]

2024-04-21

我编写的大多数程序都是相对流程图化的过程,有明确的开始和期望的结束。问题本身可能很复杂,但不容易倾向于集中使用对象和事件驱动编程。通常,我只是通过大量不同批次的文本数据来生成不同的文本数据。我只是偶尔需要创建一个类:例如,为了跟踪警告、错误和调试消息,我创建了一个具有一个实例化 (myErr) 的类(问题),我认为这是单例设计模式的一个示例。另一个因素是,我的同事比我更守旧(程序化),并且不熟悉面向对象编程,所以我不愿意创建他们无法理解的东西。

然而我一次又一次地听到,即使单例设计模式实际上也是一种反模式,应该避免,因为全局变量很糟糕。

次要函数需要传递给它们的参数很少,并且不需要知道配置(不变)或程序状态(变化)——我同意。然而,链中间的函数主要控制程序流程,需要大量的配置变量和一些程序状态变量。我相信向一个函数传递十几个或更多参数是一种“解决方案”,但很难说是一个有吸引力的解决方案。当然,我可以将变量塞入单个哈希/字典/关联数组中,但这看起来像是作弊。

例如,连接到 Active Directory 来创建一个新帐户,我需要诸如管理用户名、密码、目标 OU、一些默认组、域等配置变量。我必须通过各种方式传递这些参数甚至不会使用它们的函数,只是将它们通过一条链向下移动,最终导致真正需要它们的函数。

我至少会声明配置变量为常量,以保护它们,但我现在选择的语言(Python)没有提供简单的方法来做到这一点,尽管配方确实作为解决方法存在。

许多 Stack Overflow 问题都涉及到为什么?的坏处和必要的回避,但不经常提及在这种准宗教限制下生活的技巧。您是如何解决或至少解决全局变量和程序状态问题的?你在哪里做出了妥协?除了向函数传递大量参数之外,你还有什么技巧?


我认为单例模式有其存在的时间和地点,或者类似的情况。要记住的关键一点是,很多人一次又一次地经历过“错误”选择使用全局/共享/静态变量以及单例模式时的恐惧。

就您而言,您正在具体讨论配置。我认为使用单例样式模式来访问这些配置项没有什么坏处。每个应用程序都有配置,它应该位于您可以调用的位置,不需要只是传递它,这会使事情变得复杂而不是有帮助。

这里的关键是确保您真正需要的信息仅存在一次,配置是迄今为止我发现使用此类模式的最佳原因之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请描述您在尽量减少使用全局变量方面的挣扎[关闭] 的相关文章

  • 模块中的全局变量范围

    以下是我的文件和输出 我想做的就是获得价值x after func1 as 20 我已经参考过这个答案 https stackoverflow com questions 15595393 python global variable sc
  • 如何在Python函数中使用全局变量? [复制]

    这个问题在这里已经有答案了 如何在 python 函数中设置全局变量 To use global函数内的变量 你需要做global
  • 为什么不需要“global”关键字来访问全局变量?

    根据我的理解 Python 有一个单独的函数命名空间 所以如果我想在函数中使用全局变量 我可能应该使用global 但是 即使没有 我也能够访问全局变量global gt gt gt sub 0 0 0 0 gt gt gt def get
  • JavaScript 全局变量的生命周期

    我在 w3schools 上阅读了以下内容 但我不明白第二部分的含义 全局变量 对于加载到同一窗口中的新页面仍然可用 任何人都可以启发我吗 在 Web 浏览器中 当您关闭浏览器窗口 或选项卡 时 全局变量将被删除 但对于加载到同一窗口中的新
  • 什么时候使用静态变量?

    我目前正在 C 中做一个需要大量渲染的项目 并且在几乎所有类中 都有一个用于缩放渲染的整数类型常量值 我知道我可以在一个地方将这个常量定义为普通变量 然后将其传递 但 这看起来确实很麻烦 什么时候可以在 C 中使用静态变量 解决我的问题的最
  • Android - 全局变量?

    我需要在我的应用程序中存储一些数据 我知道我可以这样做 class public class MyApplication extends Application private String someVariable public Stri
  • 如何在没有 eval 的情况下本地化许多遗留全局变量?

    我问这个问题是因为我终于解决了一个问题 我一直在尝试在许多情况下寻找解决方法 我认为这非常简洁 所以我正在对此进行问答 看看我是否可以使用eval 我会这样做 eval join n map my v valcashe sprintf Te
  • 为 RSpec 套件中的所有示例设置一次变量(不使用全局变量)

    设置变量一次以供 RSpec 套件中的所有示例使用的传统方法是什么 我目前在中设置了一个全局变量spec helper检查规范是否正在 调试模式 下运行 debug ENV key DEBUG ENV DEBUG casecmp false
  • PHP 自动“GET”变量

    我正在为我的公司设计一个新网站 我正在尝试实现切换导航 这是我过去在所有网站上使用的 由于某种原因 当我转到index php x products 时没有任何反应 它仍然显示 inc main php 换句话说 它没有从 URL 中检测到
  • extern 与 c 中变量的全局定义

    我有以下我感兴趣的源代码 include
  • 线程环境中的 Clojure 全局变量行为

    鉴于这按我的预期工作 do println resolve a nil def a a println resolve a user a 我想了解为什么这不会 future println resolve b user b shouldn
  • 在 JavaScript 中使用全局变量

    我该怎么做呢 我的代码是这样的 var number null function playSong artist title song id alert old number was number var number 10 alert n
  • 文件私有的全局变量

    在 GOLANG 中 有没有办法使变量的作用域成为包内文件的本地范围 就我而言 有 2 个文件 ex1 go 和 ex02 go ex01 go 定义了一个全局变量 var wg sync WaitGroup 它在该文件中的函数之间使用 在
  • Rails 3 中全局变量的放置位置

    我曾经将全局变量放入我的 Rails 2 3 8 应用程序的environment rb中 例如 MAX ALLOWD ITEMS 6 它似乎在 Rails 3 中不起作用 我尝试将其放入 application rb 中 但这没有帮助 你
  • 单例类 iPhone

    好吧 我试图避免全局变量 所以我阅读了单例类 这是尝试设置和读取可变数组 但结果为空 Content h interface Content NSObject NSMutableArray contentArray Content shar
  • 在不同的翻译单元中启动全局变量(涉及链接器)

    最近在复习C 这是我的问题 请参阅中的代码file1 cpp and file2 cpp 文件1 cpp int x1 1 int y1 x1 2 文件2 cpp include necessary headers extern int y
  • Lua 从 5.1 更新 - LUA_GLOBALSINDEX 问题

    我最近将旧的 Lua 5 1 项目更新到了该库的最新版本 但遇到了问题LUA GLOBALSINDEX 它变得不确定 我只用过它lua getfield函数 像这样 void luastartgame void if startgamefu
  • Zend,Application.ini 中的全局变量?

    我有一个问题 因为我需要一个全局静态变量 并且我有一个问题是否有可能将其添加到 application ini 文件中 该怎么做 或者我必须 使用静态变量创建抽象类 在 Zend Registry 中注册它 以便从所有应用程序访问该变量 在
  • Perl 中的全局变量、子程序变量问题

    如何将子程序变量值转移到另一个子程序变量中 我可以使用全局变量吗 sub foo my myvar Hello sub foo1 my myvar1 myvar how can I get the Hello from myvar 我尝试使
  • 将变量声明为全局变量,然后声明为局部变量 -Shadowing-

    将变量声明为全局变量然后将其重新声明为局部变量意味着什么 int a 0 int main int a 7 return 0 我在参考文献中看到了这个例子 但我不明白 请考虑到我是 C 编程的初学者 这意味着在你的main方法 如果你只使用

随机推荐

  • 在 Javascript/jQuery 中从数组中删除多个元素

    我有两个数组 第一个数组包含一些值 而第二个数组包含应从第一个数组中删除的值的索引 例如 var valuesArr new Array v1 v2 v3 v4 v5 var removeValFromIndex new Array 0 2
  • 从头开始一个 TDD 项目

    我读了很多关于 TDD 的问答和关于 SO 的单元测试 但我没有找到任何答案 我从哪里开始 我和团队已经完成了几个项目 在这些项目中 我们对代码采用了单元测试 但先编码 然后单元测试 在开发过程的某个阶段 先编写测试然后编写代码变得很自然
  • Manatee.Trello 移动卡片

    我正在编写一个小型应用程序来管理 Trello Boards 的几个方面 例如对列表中的卡片进行排序 根据截止日期和 或标签移动 复制卡片 定期归档列表以及根据标签生成报告 因此 我一直在 Manatee Trello 库周围构建一个外观
  • Picasso 加载 AsyncTask 内生成的图像

    所以我正在尝试使用毕加索图书馆 http square github io picasso 用于图像下载和缓存 为了让 contactUri 传递给Picasso我需要向联系人查询Content Provider 由于我不想阻止主 UI 线
  • ETL 工具...它们到底做什么?请通俗地说[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我最近接触了一些 ETL 工具 例如 Talend 和 Apatar 我想知道这些工具通俗地说的用途 主要目标到底是什么 谁主要使用它
  • UICollectionView 断言失败

    我在执行时遇到此错误insertItemsAtIndexPaths in UICollectionView 断言失败 UICollectionViewData indexPathForItemAtGlobalIndex SourceCach
  • java.time中,月份相加的结果是如何计算的?

    在 JSR 310 中java timeJDK 8中的API 日期加月份结果的计算规则是什么 特别是 当您向 1 月 31 日这样的日期添加 1 个月时会发生什么 LocalDate initial LocalDate of 2012 1
  • UglifyJS 和 webpack v5

    我们的 React 代码一直使用 UglifyJS 和 webpack v4 但随后更新为 webpack v5 看来 UglifyJS 不适用于 webpack v5 还有其他选择吗 我们需要一些可以与 babel loader 配合使用
  • Cygwin git 将错误的路径传递给我的编辑器以获取提交消息

    我在 cygwin 下使用 git 但它没有将提交消息的正确路径传递给我的编辑器 我正在位于我的驱动器上的测试存储库中工作 d X git myproject 在 cygwin 终端中 该路径显示为 cygdrive d X git myp
  • 在 KQL azure 显示器中显示今天、昨天、一周的最佳方式

    我试图显示今天的计数 9 滚动 24 小时 与昨天 再次滚动 对比每周平均值 虽然我已经有了可以工作的代码 但我也遇到了错误 错误是 查询成功 但有警告 处理查询时出现一些错误 部分查询失败 未指定的错误 消息 分片 5eeb9282 08
  • 未找到入口点

    当我尝试运行链接到 DLL 的应用程序 我有一段时间没有更改代码 因为它工作正常 时 遇到了一个奇怪的错误 这个 DLL 曾经可以工作 但我一直在更改 DLL 的代码并使其编译正常 不幸的是 当尝试运行该应用程序时 GameTest001
  • 如何解压或获取存储在 Azure DevOps Build Piplines 变量组中的嵌套变量的值?

    是否可以在 Powershell 脚本中的变量内使用 Azure Pipelines 变量 SCENARIO Azure Pipelines 变量组中设置了两个变量 DeploymentCredentials a DeployUATApiP
  • NHibernate Envers 喜欢使用实体框架 6+ 进行审计日志

    每当更新 删除实体时 NHibernate Envers 都能很好地创建审核日志 基本上 它为每个可审计实体创建一个审计表 并将数据快照写入审计表中 例如如果客户记录保存在 CUSTOMER 表中 则客户记录的审核日志将保存在 CUSTOM
  • 如何获取包含表的列名的数组

    我需要一个包含表的列名的数组 有什么想法如何使用 Rails 3 0 0rc 做到这一点吗 假设您有一个 Post 模型 Post column names or Post columns map column column name 它将
  • 如何在执行脚本之前等待 data-main 被 Require.JS 加载?

    我有以下代码 Inside example1我正在要求一些组件的路径应该设置在scripts main 但是 路径设置不正确 根据控制台反馈判断 这使我相信 require js 尚未完成加载中引用的文件scripts main 这一切都很
  • 无效的日期时间格式:1292 不正确的日期时间值 - Laravel 5.2

    当我将这些值插入数据库表时 出现此错误 SQLSTATE 22007 Invalid datetime format 1292 Incorrect datetime value 24 06 2017 for column registrat
  • Grails 使用来自 POST 请求的 XML 填充参数

    我有一个通过 grails 控制器公开的 RestFull grails api 我需要自动绑定 POST 请求中发送的 xml 数据 我不认为使用groovybindData object params 工作作为params参考似乎没有
  • 向循环中添加代码如何使其速度更快?

    我有一个带有内部循环的简单函数 它缩放输入值 在查找表中查找输出值 并将其复制到目的地 ftol ambient是我从网上复制的一个技巧 用于将float快速转换为int for i 0 i lt iCount i iScaled ftol
  • 我一直在尝试找到一种方式来展示两者gifs and videos mp4 ogg webm 在同一个标 签内 所以 如果在一个
  • 请描述您在尽量减少使用全局变量方面的挣扎[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi