代码之家  ›  专栏  ›  技术社区  ›  adrian.tarau

关于可插入Java框架的设计问题

  •  2
  • adrian.tarau  · 技术社区  · 15 年前

    在过去的4年里,我在业余时间从事一个项目,有两个目标:提高自己作为一名软件工程师的能力,并开发(我希望)能帮助我构建更快更好的Java应用程序。我一直喜欢模块化的应用程序,所以我认为有一个可插入的框架也不错。

    因为我总是先看后建(没必要重新发明轮子,对吧?)我在看Eclipse和NetBeans,但是有些东西不见了,它没有我想要的:

    • Eclipse和NetBeans是客户端应用程序的好平台,很好的插件系统,但是基于插件编写服务器端应用程序怎么样?客户机/服务器可插拔应用程序怎么样?
    • 如果您只想编写一个小的应用程序,可能会有点重;也可能是类似Swing应用程序框架的东西 http://appframework.dev.java.net/
    • 不适合使用相同的API构建客户端、服务器端或客户机/服务器应用程序(对于双方来说不完全相同,而是更统一的API)。

    首先,让我简单地解释一下它提供了什么:

    • 基于插件的模块化设计。
    • 应用程序功能由服务提供,不同的插件创建并注册服务,这些服务提供一定的功能:模板、持久性、调度、作业/任务执行、安全性、自动更新等。
    • 应用程序在一个XML文件中描述,每个应用程序由多个模块组成,每个模块包含1..N个插件;插件在模块之间共享(基本上是一个小的插件集创建了应用程序核心,其余的则可以通过某些方式区分应用程序,比如不同的应用程序UI)。当然,这只对客户端有意义,在服务器端,所有插件都被实例化以提供对任何客户端类型的支持)。
    • 每个插件都加载在自己的类加载器中,并且有一个应用程序生命周期:加载插件、初始化插件(此时所有服务都已注册)、init服务、post init服务、post init插件、init UI插件、post init UI plugins、start plugin。
    • 每个插件都有自己的XML描述符文件来添加/注册/配置应用程序,有一个API可以方便地通过XML配置应用程序,类似于apachecommons Digester。

    下面是问题:

    1

    问题:有更好的单元测试的需求是否比某种简单性更有价值(当然,在这种情况下)?它真的是“更好”,或者我只是习惯于更好的想法,拥有更多的可测试代码(或者至少有机会编写更多的可测试代码)意味着放弃其他所有东西?

    2

    问题:这种方法是好的做法还是可以接受的?

    我一直想把框架分成几个项目,而不是一个“单一的”项目,并且有一个最小的插件/服务核心。

    我将非常感谢任何回应和建议,我希望这不会引发类似“哦不,不是另一个框架,已经有太多…”的讨论。我的目的是构建一些能帮助我学习的东西,也许能对其他开发人员有用。

    谢谢。

    编辑 http://www.phplist.com 因此,您正在创建一个名为plugin newsletter的新插件,它需要持久性支持(在数据库中存储内容)、消息传递支持(发送电子邮件)和模板支持(生成漂亮的电子邮件)

    • persistenceservices提供类似于apacheibatis的功能,并使用springframeworkjdbc模块+EvaluationService(表达式语言如JEXL、MVEL)来生成基于参数的sql。总之,persistenceservice将带来一个新的依赖项pluginel。
    • TemplateService为一些可用的模板引擎(Velocity、FrameMaker等)提供了统一的API

    在第二个实现(b)中,您将看到所有插件的实现代码,包括它们的库。你可能只需要实例化一个特定的类。当然,我最后会实例化应用程序(但这是一个支持测试的应用程序实例,它不会解析/加载代码,因为它已经在类路径中),因为我不想用存根测试特定的类(主要是因为我很懒?)因为我可以用实际的应用程序更快地编写测试。

    我知道本着 TDD 您应该使用mock/stub隔离地测试代码,然后编写集成测试来查看不同模块是如何工作的一起。这个对于库来说非常有用,但是在编写应用程序时,您需要使用应用程序上下文,并且许多测试看起来像集成测试:初始化了一堆真实的模块并将其传递给我的分类(或直接用ApplicationContext.getWorkerService()例如)。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Roland Ewald    15 年前

    问题1:我想你不希望插件程序员依赖其他代码,而是假设会有一个组件执行X(关注点分离),即实现某个接口Y?如果是这样,我认为扩展测试范围应该没问题;您将发现更多的问题。只需注意在不同的情况下测试框架,例如安装了许多/小插件等。

    问题2:我想是的。。。可能取决于实际的应用程序(以及应用程序实例在某个时刻不是静态的)的可能性有多大。

    问题3:我希望一个插件可以清楚地定义它的依赖关系(在其他插件、库等上),并且它们能够在运行时为特定任务找到其他插件(例如,如果我想将内部数据结构存储到文件中,我可以使用哪些用于导出数据的插件,以供用户选择?)。检测配置问题并停用故障组件的插件管理也很不错(就像在Eclipse中一样)。

        2
  •  1
  •   Curtis Turner    12 年前

    一句话:你做的越多,我必须做的就越少。

    考虑到框架通常满足某组特定软件解决方案的需要,它们的范围通常很窄,一旦核心编码框架是可靠的,您就可以扩展功能集,以包括该组中其他常用的功能。尽可能保持整体性,而不削弱框架的核心设计目标。

        3
  •  0
  •   mP.    15 年前

    我也有类似的兴趣,并且考虑过OSGI,因为它允许独立组件与它们自己的依赖项共存,而不必担心版本冲突。我需要解决的唯一问题是查询bundle以标准方式公开接口的实现者的能力。

        4
  •  0
  •   Michael Borgwardt    15 年前

    据我所知, IBM's Jazz 在目的上非常相似,所以看看它在哪些方面与您的框架相似,以及它们的不同之处,可能会很有趣。