26

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

这里有一些上下文来了解我来自哪里以及我想要实现的目标......


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

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

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

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

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

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

提前感谢您的宝贵时间!

4

5 回答 5

13

尽量保持松散耦合,并自由地使用接口来提供帮助。

我会从关注点分离开始设计。主要的架构层是:

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

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

如果不强调它,人们通常不会将 Drupal 视为良好架构设计的典范。它已经相当有机地发展,并且设计发生了许多剧变,系统升级时经常出现插件损坏就是证明。

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

于 2009-12-08T11:57:54.630 回答
9

由于您将使用您的应用程序提供一些基本功能,因此请确保您自己将应该可扩展/可替换的部分编码为插件。然后,您将最好地了解您的 API 应该是什么样子。

并且为了证明API好,你应该写第二个和第三个插件,因为那样你会发现你在写第一个的时候做了很多假设。通常情况下,在执行完第二步和第三步之后,情况会有所好转。

现在,您应该再编写一个插件,因为您编写的最后一个插件在类型、输入数据和演示(可能是另一个天气 Web 服务)方面与第一个插件相似。选择完全不同的东西,使用完全不同的数据,你会发现你的 API 仍然过于量身定制。(否则你做得很好!)

于 2009-12-08T11:25:18.033 回答
2

好吧,首先开始的地方可能是坐下来弄清楚插件可能需要什么来实现其目的。

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

  • 您的框架将如何传递请求/接收来自插件的响应?
  • 提供哪些帮助类或模块可能比较好?

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

  • 你想自己写什么,从现有的库中挑选什么你很高兴?

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

于 2009-12-08T09:25:23.490 回答
1
  • 仔细为您的应用设计 API(如何设计一个好的 API 及其重要性
  • 将所有可以独立使用的东西做成一个模块,然后将简单的部分组合起来并构建更大的部分(KISS)
  • 不要重复自己(干)
  • 经常为自己和他人编写/发布简短文档(开源口头禅)...
于 2009-12-08T09:42:57.373 回答
1

查看侦听器-订阅者模式。迟早,您的应用程序将变得足够复杂,以至于您需要实现回调。当您达到该限制时,请使用 listener-subscriber(在 wxPython 中有一个实现)。

例如,几个模块将希望从多个提要中监视新数据。链接在一起的模块可能希望根据新数据进行自我更新。

于 2009-12-08T12:06:25.553 回答