【问题标题】:Splitting code into modules (conventions)将代码拆分为模块(约定)
【发布时间】:2018-08-15 23:57:57
【问题描述】:

所以我一直在搜索,但在 Google 或 PEP 上找不到任何讨论此问题的内容。
我正在用tkinter 做一个项目,我有一个文件,它是项目的一部分,只有 200 行代码(不包括所有注释掉的代码)。虽然整个文件与项目的 GUI 部分相关,但我觉得它有点长而且有点宽泛。
我最终将文件拆分为 4 个不同的文件,每个文件都有自己的 GUI 部分。
基本上,目录如下所示:

project/
        guiclasses/
                   statisticsframe.py
                   textframes.py
                   windowclass.py
        main_gui.py
        ...

statisticsframe 有一个框架类,用于显示有关事物的统计信息。
textframes 有 3 类框架保存文本区域,其中一个继承 Frame,其他继承第一个。
@987654325 @ 基本上创建了窗口的根目录和 tkinter GUI 的所有常规初始化。
main_gui 实际上不是名称,但它只是结合了以上所有三个并运行 mainloop()

总的来说,每个文件现在有 40-60 行代码。

我想知道是否有任何关于此的约定。大多数语言的经验法则是,如果您可以在其他地方重用函数/类,那么您应该拆分,尽管在 Python 中这不是问题,因为您可以从模块中导入特定的类和函数。

抱歉,如果不够连贯,这里快凌晨 3 点了,它只是在我的脑后。

【问题讨论】:

  • 这是无法严格定义的事情之一。你必须使用你的直觉(这意味着,你越有经验,你做出的决定就越好),因为它实际上取决于更多的事情,而不是用言语表达的。无论如何,我不会说行数很重要,除非它真的很极端(我不会做很多文件,每个文件只有 3 行,我也不喜欢很多文件有数千行代码)。
  • 无论如何,这主要是一个基于意见的问题,因此我会说关于 SO。
  • PEP 中定义了很多东西,这些东西通常可以被视为偏好或意见,例如行长或括号之间的空格以及其中的内容。另外,公平地说,我问是否有任何关于此的约定(即使不是 Python 官方的),而不是人们喜欢什么。
  • 当然,一旦它们被定义,例如在 PEP-8 中,它们不再是基于意见的 ;) 而你所问的问题并没有在 PEP 中定义,所以你能得到的最好的答案是它没有定义,或者许多基于用户意见的相互矛盾的答案- 这就是为什么这些问题是题外话;)

标签: python python-3.x conventions


【解决方案1】:

我不熟悉tkinter,所以我的建议会比较广泛。

你可以使用任何你觉得更好的拆分成模块,但是

  • 由于可读性很重要,请尝试使名称连贯,不要重复自己:guiclasses - 你的全部程序是关于 GUI 的,而且显然在某个地方有类,为什么要在名称中重复呢?想象一下在 import 中输入所有内容,使其有意义
  • 扁平结构优于嵌套,三个模块不必去子模块
  • 最好的分割是跨抽象层(这可能是最难的,也是tkinter特有的)
  • 模块中的任何内容都应该相当自给自足,并且与程序的其他部分完全隔离
  • 模块应该为单元测试提供良好的实体(例如共享相同的夹具)
  • 你能为一个模块写一个可以理解的文档字符串吗?那么这是一个很好的。
  • 尝试通过示例学习,我经常在 Barry Warsaw mailman 中寻求命名和包结构的智慧,也许您可​​以尝试使用 tkinter 寻找一些有信誉的 repo 来关注(例如 IDLE?)。

从纯粹的语法角度来看,我会将模块命名为:

- <package_name>
   - baseframe
   - textframe
   - window
   - main

【讨论】:

  • 目前整个项目与 GUI 无关,只有这 4 个文件。很少有文件可以添加 GUI 所需的功能,例如统计信息,这就是我选择 guiclasses 的原因。尽管如此,这是一个有效的观点。您关于通过示例学习的想法实际上是一个非常好的想法,我将研究 mailman 和 IDLE。
  • 希望一些线索会有所帮助!我只想通过命名guiclasses 只是gui 来节省一些打字,类部分对我来说看起来是多余的。
  • 另外,如果您发现任何值得回顾的内容,请在此处写回 tkinter 示例。也许 Spyder 也应该在名单上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多