【问题标题】:Structure of a program with many global variables [closed]具有许多全局变量的程序的结构[关闭]
【发布时间】:2015-09-26 16:44:36
【问题描述】:

正如标题所示,我对构建使用许多全局变量的程序的最佳方式(也许是最 Pythonic 的方式)感兴趣。

首先,“很多”是指我的程序的每个模块都需要访问的大约 30 个变量(可能是字典、浮点数或字符串)。现在,似乎有两种方法可以做到这一点:

  • 在单独的模块中定义“全局”变量
  • 使用面向对象的方法

使用面向对象方法的优点是我可以初始化一些主类的许多实例,并可能在以后比较不同的值(例如某些分析的结果)。

我已经编写了一个程序,但基本上它分解为一个具有大约 30 个属性的类。虽然它工作正常,但我知道这是一种非常混乱的方式。

所以,基本上,如果我使用 OOP 方法,我可能需要将我的主类分解为几个子类,每个子类都存储特定的逻辑相关变量。

欢迎提出任何建议。

附:只是为了具体说明我正在尝试做的事情:我有一个 FEM 求解器,它需要存储结构信息、元素和节点数据、分析结果数据等。所以,我处理的数据类型最多其中以某种方式连接。

【问题讨论】:

  • 我认为最pythonic的方法是不使用全局变量:-)
  • 我不同意,大多数框架都实现了“settings.py”,例如 django,这不是一件坏事。我只会将它用于常量,而不是变量数据,从不。
  • @Apero。所以,事实上,您确实同意(假设您从不修改此类全局变量)。
  • 确实,我们确实同意。应避免像害虫 IMO 一样避免全局对象
  • 我还想强调一下,基本上我所有的“全局变量”都在被修改。唯一的常量是一些设置类型的变量。

标签: python


【解决方案1】:

不幸的是,正如 cmets 中所暗示的那样,没有“Pythonic”方法可以做到这一点。拥有大量全局 constants 就很好 - 许多程序和库都这样做。但是在 cmets 中,您已经指定所有全局变量都在被修改。

您需要将程序的架构重新带回绘图板上。重新考虑程序实体(函数、类、模块等)之间的关系。 必须有更好的组织方式。

顺便说一句,听起来您也快要使用God Object Antipattern了。使用 this SO question 中的一些建议来重构你的庞大类,它在你的程序中到处都是。

【讨论】:

  • 一些额外的细节:我的程序已经被分割成模块,它们被非常合乎逻辑地按特定任务划分。这些模块主要包含功能。我使用的大类(也是程序中唯一的一个)仅包含属性,因此大多数模块都在对其进行操作。现在唯一的“问题”是在哪里放置这些非常量属性。事实上,在几个新创建的模块之间分配这些属性(即潜在变量)对我来说似乎是合乎逻辑的。当我再次考虑程序的架构时,我没有看到比这个更直观的方式。
  • 参考我上面的评论,实际上可能有更好的方法来做到这一点:在后面的步骤中,我的程序创建一个可以稍后查看的数据库。由于程序以 .csv 文件形式从外部应用程序获取输入数据,因此可以在开始时创建一个包含所有相关数据的数据库以进行计算。我只是不确定这是否会降低性能?我已经阅读了 Sqlite 可能的内存数据库。我认为这些应该足够快?这将是一种完全避免使用非常量“全局变量”的方法。
  • @JohnKimble 我之前没有使用过内存数据库,所以我无法评论使用它会如何影响程序的性能,但是如果你用数据库引用替换全局引用,那就是只是边际改善。由于具有从许多地方修改的全局数据结构,您仍然使您的程序难以调试。由于你的类似乎只是一个数据容器,如果你不能重构以减少数据依赖的数量,就不要让它成为全局的。创建对象并通过函数参数正确传递它。
  • 所以基本上,您是说我的数据结构应该只在需要的地方创建/处理,对吧?另外,我想强调一下,我的代码实际上并不难维护和调试,只是这个庞大的类看起来很傻。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2013-01-24
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
相关资源
最近更新 更多