首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解耦元件.设计

解耦元件.设计
EN

Software Engineering用户
提问于 2013-07-29 09:48:34
回答 5查看 3.3K关注 0票数 2

我在Python中创建了许多不平凡的脚本,这些脚本可以进行一些长时间运行的报告。起初,这些报告开始时都是带有配置文件的脚本。然后我添加了一个数据库组件来持久化数据。现在,我正在构建一个GUI,将其放在所有用户之上。

我的问题与设计有关。每次我添加额外的需求时,我都希望自己能比我更多地分离这些脚本的组件。当我考虑如何将代码简化为更模块化时,我发现我需要在代码周围传递相当多的引用,以至于类初始化器和函数签名有大量的参数。另外,我发现自己有一些简单的“传递”参数,因为一个对象只需要它们传递到另一个对象,对它们不做任何事情。

在Python中实现模块化的最佳方法是什么,同时将传递引用的需求降到最低?

我知道这是非常概念性的,并将随着设计的不同而变化,但我正在寻找指导原则。

EN

回答 5

Software Engineering用户

发布于 2013-07-29 15:55:34

当我试图模块化时,我不会遇到这个问题。所以很明显我在做一些不同的事情,但是没有看到你在做什么,我只能猜到是什么。

所以我会把自己限制在一般的陈词滥调上。

首先,在编写大量相关脚本时,通常最好是构建一个小型脚本和一个公共库。这种类型的设计往往能更好地经受多种因素的影响。

第二,如果函数有很多参数,请使用命名参数和合理的默认值。(如果不知道如何使用命名参数,请参见http://docs.python.org/release/1.5.1p1/tut/keywordArgs.html。)

第三,在类中使用只将内容传递给另一个类的方法是没有错的。只要这些类确实有不同的用途,那就好了。

第四,有大量的课程只是为了达到某种审美目的,这是很不对的。对于每一堂课,除非你能确切地解释这门课是做什么使你的生活更容易,你可以删除它。

第五,“代码完整”( Complete )一书提供了大量非常详细的建议,从变量的正确命名到有效的模块化。如果你没有按你的方式完成它,我强烈建议你做这个练习。

第六,如果你可以的话,你真的非常非常想要一个你信任的导师来开始检查你的代码。我敢打赌,你最需要学习的东西是你永远不会看到的(这就是你需要帮助的原因),这对一个更有经验的人来说是相当明显的。教一个人看不见他们正在做的事情,并不比驾驶一辆汽车而看不到道路更有效。

票数 4
EN

Software Engineering用户

发布于 2013-07-29 20:14:00

当您使用控制反转技术(例如依赖注入)时,您可以只给类提供它们执行任务所需的组件,这样它们就不必担心它们的依赖项依赖于什么。这将大大减少传递给函数的参数数量,降低脚本的复杂性,并在组件之间引入松散耦合。为了在psudo代码中给出一个很好的例子,比如我们正在建造一辆汽车。

你可以把汽车的所有部件都通过构造器,但它必须知道活塞,线圈和火花塞,即使它不需要知道他们。它只需要他们组装引擎。

代码语言:javascript
复制
Car(Tires tires, Pistons piston, Coil coil)
{
    SparkPlugs sparkPlugs = new SparkPlugs(piston, coil)
    Engine = new Engine(sparkPlugs, tires)
    Tires = tires;
}

一个更好的方法是事先制造发动机并将其传递给汽车。那么这辆车只需要知道它使用的部件

代码语言:javascript
复制
Car(Engine e, Tires t)
{
    Engine = e;
    Tires = t;
}
票数 3
EN

Software Engineering用户

发布于 2013-07-30 19:35:08

这是一个有趣的问题,我做了完全相同的事情,但在Ruby。基本上,我的报告解决方案是这样演变的:

  1. 一种临时脚本,用来显示管理人员正在发生的事情。脚本只作为控制台应用程序运行,所以我将结果数据复制并粘贴到Excel中,并添加了一些很好的格式和图表。
  2. 临时解决方案成了每周报告,由于假期临近,我通过一个单独的脚本添加了一个HTML输出。常用的函数被放入一个公共库文件中。
  3. 一些生产输入的商业软件改变了,但是报告很受欢迎。在这一点上,我将报告移植,并从过程/功能风格转变为面向对象的风格。(Go成了我工作中的通用语言,你也可以用Python做同样的事情)

我假设你在我的世界中,在第一步或第二步。正如你所看到的,模块化是必要的。当我这样做的时候,我记得一些模式:

  • 将多个参数反复传递给一个函数?创建一个可以携带所有这些参数的类。一些函数可能会成为该类的方法。
  • 抽象:我做了许多分组、计数和聚合操作。我创建了为许多可能的表格式执行这些操作的类(类型)。如果您有这样一个转换类,您可以定义转换函数/lambdas (functional!)对于所需的数据类型。因此,简而言之:将所有业务从问题中删除,只需考虑数据类型和所需的转换即可。

关于第二点:由于您正在使用Python,我认为Numpy是一个非常适合该工作的工具。它有一些非常强大的表格数据转换工具。

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

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

复制
相关文章

相似问题

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