代码之家  ›  专栏  ›  技术社区  ›  mac

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

  •  23
  • mac  · 技术社区  · 15 年前

    我在寻找有关 “如何以模块化方式设计应用程序” . 我将在这个项目中使用Python,但是建议并不一定要引用这种语言,尽管我只愿意实现基于OOP的设计。

    这里有一些背景来理解我从哪里来,以及我想实现什么……


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

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

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

    在这个时候, 插件应该能够让开发人员通过定义提供者、数据操作(如果有的话)以及向用户展示数据的方式来激活一个新的Web服务。 .

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

    如果这一点很重要,那么内核将为GNU/Linux进行本机开发。

    提前谢谢你的时间!

    5 回复  |  直到 14 年前
        1
  •  12
  •   gavinb    15 年前

    试着保持事物松散地耦合,并充分地使用接口来帮助。

    我将从 关注点分离 .主要建筑层有:

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

    域类可以完成这项工作,但不了解UI。持久性层了解域类,足以根据需要保存/加载。系统接口层将外部系统抽象出来,这样可以在测试时在后面插入模拟器。用户界面最好使用MVC,以获得最大的灵活性。

    如果不把重点放在上面,人们通常不会把Drupal看作优秀建筑设计的典范。它已经发展得相当有机,而且设计也发生了许多变化,这一点可以从系统升级时经常出现的插件损坏来证明。

    我也会重复Micsim所说的,关于仔细设计插件接口和编写多个不同的插件来练习它。这是解决应用程序和插件交互问题的唯一方法。

        2
  •  8
  •   MicSim    14 年前

    由于您将在应用程序中提供一些基本功能,请确保您编写的部分应该是可扩展/可替换的,并且已经作为插件由您自己编写。然后您最好了解一下您的API应该是什么样子。

    为了证明API是好的,您应该编写第二个和第三个插件,因为这样您会发现在编写第一个插件时做了很多假设。通常情况下,在完成第二步和第三步之后,事情会有一点好转。

    现在,您应该再编写一个插件,因为您编写的最后一个插件类似于类型、输入数据和表示中的第一个插件(可能还有另一个weather webservice)。选择完全不同的东西,使用完全不同的数据,您将看到您的API仍然是定制的。(否则你做得很好!)

        3
  •  2
  •   Adam Luchjenbroers    15 年前

    好吧,也许首先要做的是坐下来,弄清楚插件可能需要什么来实现它的目的。

    你想在设计中考虑两个主要方面。

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

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

    • 你想自己写些什么,从现有的图书馆里挑选什么你很高兴?

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

        4
  •  1
  •   miku    15 年前
    • 仔细设计应用程序的API( How To Design A Good API and Why it Matters )
    • 把所有可以独立使用的东西做成一个模块,然后用简单的部分(kiss)组合并构建更大的部分。
    • 不要重复你自己(干)
    • 经常为自己和他人编写/发布简短的文档(开放源码咒语)
        5
  •  1
  •   wisty    15 年前

    研究侦听器订户模式。迟早,你的应用程序会非常复杂,你需要实现回调。当达到这个限制时,使用侦听器订阅服务器(wxpython中有一个实现)。

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