11

早些时候,我正在阅读 InfoQ 关于面向复合编程的文章:

http://www.infoq.com/articles/Composite-Programming-Qi4j

我很想知道是否有人目前正​​在使用(或曾经使用过)Qi4j框架?

它与使用传统的依赖注入框架(例如 Spring)将类连接在一起相比如何。从维护的角度来看,生成的对象图(基于 mixins 而不是类)是否更容易处理?

4

6 回答 6

9

好吧,我自己已经在一个项目中使用 Qi4j 大约一年了。一旦您习惯了领域模型中 mixin 的强大功能,您就会想知道以前没有它们是如何进行管理的。事实上,我认为创建领域模型的 POJO 方法应该已经过时了。它创建了系统性不可维护的代码。因为 mixin/composite 模型是 Qi4j 的重要特性,而不是 DI,所以在 Java 平台上确实没有任何可比性。

至于 Bozho 的担忧:在声明 mixins 时,有两种不同的情况。在实体中,即领域模型中,一个接口通常只有一个实现,实际上,出于维护和可读性的原因,您可能希望主动避免有多个实现。所以我直接在接口中声明了实现。但是,它只是一个默认值,如果你愿意,它可以被组合覆盖。到目前为止,我从未发现有必要这样做。

另一种情况是服务,这是完全不同的。在许多情况下,只有一个实现,因此在接口中声明实现也是完全可以的。但是,有更多的情况下您需要不同的实现,因此对于这些情况,您只需在具体的复合类型声明中声明 mixin。所以这两种风格都是可能的,并且出于各种原因推荐。

至于施法,能够施法是一种奖励,而不是问题。如果您没有从一个角色转换到其他角色,那么您将必须非常有创意才能绕过它,这可能不会使您的代码更简单。

于 2010-02-05T04:18:03.837 回答
3

卡布拉姆;已多次尝试与 JPA 集成。如果我们有两种重叠但不完全兼容的技术,那么您最终只会遇到可能性的交集。因此,将 Qi4j 与 JPA 集成有两种基本方法。

  1. 限制 JPA 选项,以便可以充分使用 Qi4j 需要的更灵活的数据结构。这样做是没有意义的,因为直接使用 SQL 的性能要高得多,而这正是我们选择的。

  2. 限制 Qi4j 的数据模型以适应现有的 JPA 数据模型。这样做会带走人们最初选择 Qi4j 的大部分优势。因此,我们决定不花费周期来执行此操作。但是,我认为 Qi4j 的可扩展性足够好,可以在不破坏 Core Runtime 的情况下进行此类集成,并且只需创建一个 EntityStore。

于 2012-02-25T09:49:36.277 回答
2

希望这次讨论不会太晚:但这就是我的看法。

首先,我喜欢 Qi4j 背后的想法(Composites、Mixins、Assemblies),但由于使用它的复杂性而受阻。

那里的概念应该是更广泛的保护伞的一部分,例如语言(例如Java)而不是框架,并且应该更易于使用。

2 年前我遇到了一个问题,这让我希望那时我能有这样的事情。

我想要 3 种不同的行为,可以在一组 bean 上重用。一些豆类使用了所有其他豆类,其他豆类使用了两者的任意组合。我不想把它们都放在一个班级里,因为这没有意义。另一方面,我受到不能拥有多重继承这一事实的限制。显而易见的解决方案:使用接口;这意味着多次执行该事情。我记得我曾向一位同事抱怨我希望我有办法为接口提供默认实现。这对我来说是一个简单的 OO 概念,它允许人们以更清洁的方式重用行为。如果是这种情况,您需要与默认实现不同的东西而不是实现那个。那会更有意义,并且不会破坏我能看到的任何自然法则。

所以为了回答你的问题,我认为这个 Qi4j 的概念可以让你以更清晰的方式思考 OO,其中 Spring 更具结构性,甚至在概念上也没有可比性。您可能正在考虑依赖注入,而不是在考虑 spring,而在考虑 Qi4j 而不是在考虑部门注入。

于 2010-06-07T06:47:48.530 回答
1

阅读链接文章的第一部分后,我不喜欢两件事:

  • 实现是在接口中定义的(使用@Mixins)-如果应该模拟这些实现,或者改变实现怎么办?
  • 需要铸造

没有使用 Qi4J 的经验,我不能说在实践中结果如何,但感觉并不好。

于 2010-02-04T08:58:21.433 回答
1

当我在 2 分钟、10 分钟等教程(最后一个不完整)中通读 Qi4j 时,想到的一个明显问题是如何将其与 JPA/Hibernate 托管实体集成?我希望看到与 JPA 无缝集成的解决方案。在我看来,没有 JPA 意味着没有采用 Qi4j。我很想看到作者的一篇文章,展示与 JPA 和 Spring 的集成,这两件事在 Java 企业世界中有很深的渗透。如果集成很简单,那么很快就会采用。

于 2011-02-23T22:56:38.323 回答
1

博卓;关于在接口上声明 Mixins 的问题,

Mixin 实现可以在“更高”(即子)接口中被覆盖,因为实现的查找顺序发生在“每个方法”并且从声明的接口,从左到右,然后到每个超级接口接口(在扩展子句中也是从左到右的)。或者,您可以在组合中覆盖;

public void assemble( ModuleAssembly module )
{
    module.entities( Account.class ).withMixins( LdapAuthenticatorMixin.class );
    :
}

其中 LdapAuthenticatorMixin 可能是抽象的并且仅覆盖单个方法。

于 2012-02-25T09:43:16.403 回答