1

在一个工作项目中,我们的域模型中有一个特定的值类型类,其中包含大量的属性......

public class BigValueType {
    private Foo foo;
    private Bar bar;
    private Baz baz;

    //...
}

我们已经意识到我们希望将其“集中”到许多不同的、更专业的类中,这些类只具有该类属性的一些子集。我认为我们希望对这些数据有不同的“视图”。

public class SpecializationA {
    private Foo foo;
    private Baz baz;
    //...
}

public class SpecializationB {
    private Bar bar;
    private Baz baz;
    //...
}

private class SpecializationC {
    private Foo foo;
    private Bar bar;
    //...
}

但是,此域模型旨在相当通用,而不是特定于该项目。在未来的项目中,它将添加特定于项目的扩展,但公共域模型将与这些扩展分开。如果我们现在简单地定义一堆类,很可能其他使用领域模型的项目以后只需要编写自己的稍微不同的类。(我们无法轻易预测这些数据的哪些视图将是有用的。)

我认为我们应该做的是为这个大类编写特定于项目的适配器,以呈现数据的不同视图。这样,该域的未来用户不必触及“通用”域模型中的任何内容来定义此信息的新视图。

public class AdapterA {
    private BigValueType wrapped;
    //...

    public ViewA(BigValueType wrapped) {
        //...
    }

    public Foo getFoo() {
        return wrapped.getFoo();
    }

    //...
}

这对我来说比普通继承更有意义,因为我们的顶级类/接口几乎没有任何内容。

对这种方法有任何反馈吗?

4

3 回答 3

1

首先,了解您要解决的问题很重要。拥有一个具有大量属性的类并不一定是坏事,如果您只想进行重构以符合“良好”的设计原则,我会重新考虑这个决定。

话虽如此,这是 SOA 世界中相当普遍的设计。您有一个大型服务,它接受具有相当多属性的复杂消息作为请求。然后,该服务会“适应”以迎合具有不同需求的客户。所以,你的设计应该运作良好。当然,它的前提是您已经知道所有可能的“视图”,否则您将不得不为新客户端编写新的适配器。

这种“适应”可以在两个级别执行 - 用户界面级别(本质上是您的设计 - 以适应类)或较低级别,例如在数据库级别,这反过来也会修改您的主类. 这将取决于您的应用程序、您的框架的用户等等。

要考虑的另一种方法也可以是 REST 方式来执行此操作 - 公开数据(Foo、Baz 等),尽管来自主类,并让客户端使用主要提供 CRUD 的主类自行处理数据此数据的特征。然后你的类的行为更像是一个没有真正业务逻辑的结构。

恕我直言,这三种方法中的任何一种都应该没问题。

于 2009-06-28T03:06:54.263 回答
0

好吧..对我来说似乎很好。我认为您使用组合的解决方案比使用继承要好得多,它会在很大程度上影响您的模型并生成许多低内聚类。

于 2009-06-28T02:50:11.363 回答
0

我发现跨多个项目共享代码的目标比听起来更难。至少,很难做到正确!这正是您讨论的原因,不知道您在某些新项目中可能需要哪些功能。问题是适配器问题不会为您解决这个问题(如果底层对象不支持所需的功能集,那就是)。

I would suggest that you use interfaces for your separate projects but that you code the implementations separately. If you find yourself writing exactly the same code 3 times then pull this out into a common library. Try and keep your library as lightweight as possible.

Managing multiple dependencies can be expensive later on, when you find you need to add features - possibly conflicting ones - and you have the complication of affecting lots of apps.

于 2009-06-28T09:48:58.887 回答