微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于领域驱动设计中命名和构造值对象的困惑

如何解决关于领域驱动设计中命名和构造值对象的困惑

在阅读了 Eric Evan 关于域驱动设计的书之后,我正在尝试实现我的第一个域驱动应用程序。我对如何创建值对象有点困惑。

所以在我的应用程序中,用户可以购买一项服务,让他们在 Youtube 上发布的视频获得一定数量的观看次数,这由我的应用程序中观看这些视频的其他用户完成(基本上是许多视频的复制品) youtube 推广应用已经可用,供学习)。

假设服务在应用中表示为名为 WatchTime 的实体。 WatchTime 实体包含一些信息,例如 MaxViews(购买的最大观看次数)和 CurrentViews(已完成的观看次数)。 MaxViews 和 CurrentViews 是值对象,两者很相似。

所以问题是,我是否应该有一个通用的“视图”值对象,它是 MaxView 和 CurrentView 域概念的类型,如下所示:

class Views extends ValueObject<Views> {
    @override
    bool fsameValueAs(Views other) {
       // Implementation
    }


    int mvalue;
}


class WatchTime extends Entity<WatchTime> {
    @override
    bool fsameIdentityAs() {
        // Implementation
    }



    Views mmaxViews;
    Views mcurrentViews;
}

我是否应该为 MaxViews 和 Current Views 创建一个单独的类,因为它们是领域概念并且它们应该是明确的,有点像这样:

class Views {}

class MaxViews extends ValueObject<MaxViews> {
    // Other stuff

    Views mviews;
}

class CurrentViews extends ValueObject<CurrentViews> {
    //Other stuff

    Views mviews;
}

class WatchTime extends Entity<WatchTime> {
    @override
    bool fsameIdentityAs() {
        // Implementation
    }



    MaxViews mmaxViews;
    CurrentViews mcurrentViews;
}

像这样:

class MaxViews extends ValueObject<MaxViews> {
    // Other stuff

    int mviews;
}

class CurrentViews extends ValueObject<CurrentViews> {
    //Other stuff

    int mviews;
}

class WatchTime extends Entity<WatchTime> {
    @override
    bool fsameIdentityAs() {
        // Implementation
    }



    MaxViews mmaxViews;
    CurrentViews mcurrentViews;
}

我不确定我应该怎么做。

我也不确定书中的另一件事。所以我明白,明确领域的概念将使应用程序更清晰,更易于导航和阅读。所以要明确一些,有必要使它成为与域类同名的实体或值对象,或者变量名与域概念相同就足够了。

例如, .

class Money {}

Money mSalary;

对比

class Salary {}

Salary mSalary;

我很确定我的建议可能看起来很愚蠢,如果您能给我更好的建议,我会很高兴。谢谢。

解决方法

我不确定我应该怎么做。

根据您的域、这些事物彼此之间的相似程度、它们更改的频率、它们是否出于相同的原因更改等等,两种答案都可能是最佳答案。

常见的情绪是duplication is cheaper than the wrong abstraction。换句话说,如果您还不确定这些实现是否应该全部派生自一个共同的基础,那么请将它们分开,并观察它。

您还应该查看 Joshua Block 撰写的 Effective Java 第 19 条。 “设计和文档继承,否则禁止”。

为继承设计一个类需要付出很大的努力,并且对这个类有很大的限制......在修改了一个非最终的具体类的内部结构后,收到与子类化相关的错误报告并不少见,该类不是为继承而设计和记录的.

请注意,您还可以选择使用两个独立的类来实现一个或多个常见的接口,这有助于减少您必须担心的耦合量。


必须使其成为与域类同名的实体或值对象

没有。可以拥有多个相同类型的数据成员是很常见的。成员的名称不必与成员类型的名称相匹配。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。