gpt4 book ai didi

python - OOP 和 MVC 编程风格

转载 作者:行者123 更新时间:2023-12-01 00:01:08 25 4
gpt4 key购买 nike

我正在编写一些数据分析软件并决定使用这种方法:

EPN:
model/data.py <- 模型定义
model/reader.py <- 如何将数据读入模型
view/gui.py <- 主 gui 框架 (wx)
view/dialogs.py <- 不同的对话框 (wx)
epn.py <- Controller

对于 gui 和数据之间的通信,我使用了 wx.lib.pubsub。因此,当按下“调制索引”按钮时,epn.py 会捕获消息并发出命令:

self.view.control_panel.displayModulationIndex(self.data.getModulationIndex())

其中 self.data.getModulationIndex() 是:

def getModulationIndex(self):
m = self.mean_flux
f = self.fluxes
# other things

另一方面,我可以将其写为:

def getModulationIndex(self, m, f)
# other things

并将其命名为:

m = self.data.mean_flux
f = self.data.fluxes
self.view.control_panel.displayModulationIndex(self.data.getModulationIndex(m, f))

从我的角度来看,第一个示例更好(更短、封装、更防错)。但测试它比较困难——你不能只在一些模拟对象上调用该方法。

希望这一点是清楚的

问候
克里斯

最佳答案

示例 1:“更好(更短、封装、更防错)”

不完全是。

  • 示例 1 的函数调用不少于示例 2;您必须在调用函数之前设置实例变量,而不是将值作为参数传递。这是相同的代码。

  • 示例1的函数调用不再封装。封装是类作为一个整体的属性,而不是单个方法。方法只是方法,它们通常有参数,以便它们清晰、明显、可替换且易于测试。

  • 示例 1 函数调用在任何意义上都不是防错的。您很可能会忘记设置实例变量,就像忘记在函数调用中传递实例变量一样。

    当您有显式参数时(示例 2),Python 可以检查您是否提供了正确数量的参数。在示例 1 中,没有为您进行任何检查。

示例 1:“更难测试”

同意。

摘要

实例变量很特殊。它们反射(reflect)了某些物体的存在状态。对于模型对象来说,它们是一件严肃的事情,因为它们通常是持久的。对于 GUI 对象,它们是“现在正在显示的内容”,通常是 transient 的。

不要过度使用实例变量。实例变量应该是有意义且重要的。不仅仅是那些在其他地方没有合适的家的东西的垃圾变量。

方法函数只是函数。在面向对象的世界中,它们仍然只是函数。它们将输入参数映射到输出结果(或对象状态更改)。传递所有有意义的论点。

关于python - OOP 和 MVC 编程风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/377337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com