如何以模块化方式设计应用程序?

时间:2009-12-08 09:17:22

标签: python design-patterns oop modularity software-design

我正在寻找关于“如何以模块化方式设计应用程序”的指针,建议,链接,警告,想法甚至是轶事。我将在这个项目中使用python,但建议不一定要引用这种语言,尽管我只愿意实现基于OOP的设计。

这里有一些背景知道我来自哪里以及我想要实现的目标......


我的项目将是一个小型应用程序,它将使用Web服务并以多种方式显示结果,包括:

  • 通知弹出窗口仅包含通话结果
  • 应用程序主窗口中的
  • 选项卡,其中包含从检索到的原始数据绘制的图形
  • 消息的缓冲区(在domand上可见),各种服务的结果将堆积在一起

该应用程序将作为免费(语音)软件发布,因此我想让其他开发人员很容易编写插件/模块,这将扩展主应用程序的功能,无需更改核心代码。

此时,插件本质上应该允许开发人员通过定义提供者,数据操作(如果有的话)以及数据呈现给用户的方式来激活新的Web服务

我在开发drupal方面有丰富的经验,它具有强大的模块化方法,但也遵循非面向对象的设计,所以我怀疑对于python,drupal设计可能不是最佳解决方案。

如果这很重要 - 核心将为GNU / Linux本地开发。

提前感谢您的时间!

5 个答案:

答案 0 :(得分:12)

尝试保持松散耦合,并使用接口来提供帮助。

我将使用关注点分离开始设计。主要的架构层是:

  • 问题域(又名。引擎,后端):域类,完成所有实际工作,具有域知识实现域行为
  • 持久性:域类,数据库/文件系统层的存储管理
  • 用户界面:GUI,与域类对话
  • 系统接口:与其他系统交谈,例如。网络,网络服务

域类可以完成工作,但不了解UI。持久层知道域类,足以根据需要保存/加载。系统界面层抽象出外部系统,这使您可以在测试时将模拟器插入后面。理想情况下,UI应该使用MVC,以获得最大的灵活性。

如果没有太精细的话,人们通常不会将Drupal视为良好建筑设计的典范。它已经相当有机地发展,并且设计出现了许多动荡,系统升级时常规插件破损就证明了这一点。

我还要回应MicSim所说的,关于仔细设计插件界面和编写多个不同的插件来练习它。这是真正充实应用程序和插件交互方式问题的唯一方法。

答案 1 :(得分:8)

由于您将为您的应用程序提供一些基本功能,请确保您自己编写应该可扩展/可替换的部件作为插件。然后,您最好能够了解API的外观。

为了证明API是好的,你应该写第二个和第三个插件,因为那时你会发现你在编写第一个插件时做了很多假设。通常情况下,在完成第2步和第3步后,事情会有所改善。

现在,你应该再写一个插件,因为你写的最后一个插件类似于第一个类型,输入数据和演示(也许是另一个天气web服务)。选择完全不同的东西,使用完全不同的数据,您将看到您的API仍然过于量身定制。 (否则你做得很好!)

答案 2 :(得分:2)

嗯,可能首先要坐下来找出插件可能需要达到的目的。

您需要考虑设计中的两个主要方面。

  • 您的框架将如何通过插件传递请求/接收响应?
  • 可以提供哪些帮助程序类或模块?

也可能,因为这听起来像是一个学习项目。

  • 你想自己写什么,你从现有的图书馆中挑选出来有什么感受?

我还建议您在设计API时开发一些基本插件。必须实际使用您设计的内容的经验将使您能够看到给定方法可能使事情变得比他们需要的更难。

答案 3 :(得分:1)

  • 仔细设计适合您应用的API(How To Design A Good API and Why it Matters
  • 制作所有可以独立使用的模块,然后从简单部件(KISS)中分组并构建更大的部件
  • 不要重复自己(DRY)
  • 经常为自己和他人撰写/发布简短的文档(开源口头禅)......

答案 4 :(得分:1)

查看listener-subscriber模式。迟早,您的应用程序将足够复杂,您需要实现回调。当你达到这个限制时,使用listener-subscriber(在wxPython中有一个实现)。

例如,有几个模块会想要查看来自多个Feed的新数据。链接在一起的模块可能希望根据新数据自行更新。