首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何摆脱与不同模式/数据集相关的代码流中的多个if语句- Python?

如何摆脱与不同模式/数据集相关的代码流中的多个if语句- Python?
EN

Software Engineering用户
提问于 2022-03-24 10:06:19
回答 1查看 110关注 0票数 -1

我的Python项目包括数据处理程序、模型,可以在不同的模式下运行。

在我的代码中,我使用如下语句

代码语言:javascript
运行
复制
if mode=='mode1':
# or
if isinstance(model, Model1):

适应培训脚本和绘图脚本的流程。

我相信我已经通过为模型和数据处理程序提供不同的子类来使用策略模式。

但我不知道如何正确地训练模型和绘图结果,因为这些脚本使用模型、数据处理程序和模式。

例如,绘图函数将根据数据处理程序有不同的子图排列,并且根据模型产生不同的内容。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2022-03-24 11:56:25

您的问题被标记为有助于消除代码中重复条件的技术:多态性和策略模式。不过,实际上,策略模式只是对多态的一种奇特的重新表述。你的问题中没有提供太多的信息,所以给你一个权威的解决方案是不可能的。这里的关键是开发您的代码分析技能。

考虑用新的抽象替换检查“模式”的条件。每次检查if mode == "x"时,可能都会发现一个缺少的抽象。请注意,真正的抽象可以相互替换,客户端代码(使用这些抽象的代码)不应该被更改。这就是"L“在面向对象编程的实心原则:Liskov替代原则

根据“模式”进行更改的代码可能会重构为其他类,这些类可能使用继承,也可能不使用继承。Python在定义抽象时提供的不仅仅是类。函数也可以是多态抽象。您可以通过将方法引用传递给另一个方法封装行为。你并不总是需要一个物体。

第二个挑战将是确定这些新抽象所需的依赖关系。初始化需要一些依赖项。其他依赖项可能只有在运行时才知道。初始化所需的依赖关系成为构造函数参数。只有在运行时(或调用方法时)已知的依赖关系才会成为方法的参数。

如果已经有抽象,但仍然检查if isinstance(model, Model1),则可能创建了不正确或不完整的抽象。检查一个对象在运行时从哪个类继承,将显示该抽象“泄漏”到客户端代码的实现细节。这就是我们所说的“漏水的抽象”。检测对象类,然后执行以下任一操作的代码立即受到怀疑:

  • 将不同的方法参数传递给同名的方法。
  • 过程方法的结果不同。
  • 调用不同的方法。
  • 以上的任何组合。

您还需要分析该代码。要解决这个问题,需要在类之间重构或移动代码,并创建新的类来封装条件行为。

确定正确使用依赖注入和控制反转的新抽象将导致您开始构建用于读取配置的类或文件(通过文件或命令行参数)并初始化整个应用程序。这被称为复合根--应用程序的入口点,您使用的抽象被确定,然后连接到执行特定用例所需的内聚对象图中。

多态性的一个副作用是删除重复条件,而不是删除所有条件项(related:依赖反转是如何解决切换问题的?)。检查应用程序模式或对象的类不是您应该需要的条件。

改进设计可能需要对现有代码进行重大重构。这不是一项容易的任务。没有一个神奇的设计模式可以解决这个问题,因为它似乎是系统性的问题。重写这么多代码是否值得,取决于复杂性、测试覆盖率以及这段代码对组织的重要性。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/437573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档