我在Python中创建了许多不平凡的脚本,这些脚本可以进行一些长时间运行的报告。起初,这些报告开始时都是带有配置文件的脚本。然后我添加了一个数据库组件来持久化数据。现在,我正在构建一个GUI,将其放在所有用户之上。
我的问题与设计有关。每次我添加额外的需求时,我都希望自己能比我更多地分离这些脚本的组件。当我考虑如何将代码简化为更模块化时,我发现我需要在代码周围传递相当多的引用,以至于类初始化器和函数签名有大量的参数。另外,我发现自己有一些简单的“传递”参数,因为一个对象只需要它们传递到另一个对象,对它们不做任何事情。
在Python中实现模块化的最佳方法是什么,同时将传递引用的需求降到最低?
我知道这是非常概念性的,并将随着设计的不同而变化,但我正在寻找指导原则。
发布于 2013-07-29 15:55:34
当我试图模块化时,我不会遇到这个问题。所以很明显我在做一些不同的事情,但是没有看到你在做什么,我只能猜到是什么。
所以我会把自己限制在一般的陈词滥调上。
首先,在编写大量相关脚本时,通常最好是构建一个小型脚本和一个公共库。这种类型的设计往往能更好地经受多种因素的影响。
第二,如果函数有很多参数,请使用命名参数和合理的默认值。(如果不知道如何使用命名参数,请参见http://docs.python.org/release/1.5.1p1/tut/keywordArgs.html。)
第三,在类中使用只将内容传递给另一个类的方法是没有错的。只要这些类确实有不同的用途,那就好了。
第四,有大量的课程只是为了达到某种审美目的,这是很不对的。对于每一堂课,除非你能确切地解释这门课是做什么使你的生活更容易,你可以删除它。
第五,“代码完整”( Complete )一书提供了大量非常详细的建议,从变量的正确命名到有效的模块化。如果你没有按你的方式完成它,我强烈建议你做这个练习。
第六,如果你可以的话,你真的非常非常想要一个你信任的导师来开始检查你的代码。我敢打赌,你最需要学习的东西是你永远不会看到的(这就是你需要帮助的原因),这对一个更有经验的人来说是相当明显的。教一个人看不见他们正在做的事情,并不比驾驶一辆汽车而看不到道路更有效。
发布于 2013-07-29 20:14:00
当您使用控制反转技术(例如依赖注入)时,您可以只给类提供它们执行任务所需的组件,这样它们就不必担心它们的依赖项依赖于什么。这将大大减少传递给函数的参数数量,降低脚本的复杂性,并在组件之间引入松散耦合。为了在psudo代码中给出一个很好的例子,比如我们正在建造一辆汽车。
你可以把汽车的所有部件都通过构造器,但它必须知道活塞,线圈和火花塞,即使它不需要知道他们。它只需要他们组装引擎。
Car(Tires tires, Pistons piston, Coil coil)
{
SparkPlugs sparkPlugs = new SparkPlugs(piston, coil)
Engine = new Engine(sparkPlugs, tires)
Tires = tires;
}一个更好的方法是事先制造发动机并将其传递给汽车。那么这辆车只需要知道它使用的部件
Car(Engine e, Tires t)
{
Engine = e;
Tires = t;
}发布于 2013-07-30 19:35:08
这是一个有趣的问题,我做了完全相同的事情,但在Ruby。基本上,我的报告解决方案是这样演变的:
我假设你在我的世界中,在第一步或第二步。正如你所看到的,模块化是必要的。当我这样做的时候,我记得一些模式:
关于第二点:由于您正在使用Python,我认为Numpy是一个非常适合该工作的工具。它有一些非常强大的表格数据转换工具。
https://softwareengineering.stackexchange.com/questions/206369
复制相似问题