Value Object & Entity & Domain Service

Entity

对于Entity,区别于Value Object的地方在于Entity有着唯一的标示,可以认为是其实体的ID,辨识其为独一无二的,但是其余方面Entity又和Value Object很类似,具体以代码形式来看。
首先对于Entity

class Entity {
    constructor(id) {
        super();
        this.id = id
    }

    get id() {
        return this._id;
    }
    set id(value) {
        this._id = value;
    }
}
class Business extends Entity {
    constructor(options = {}) {
        const {
            amount, date, status
        } = options;
        // 从父类继承id属性,用来表示Entity的独一性 
        super(id);
        this.amount = amount;
        this.date = date;
        this.status = status;
    }

    get amount() {
        return this._amount;
    }
    set amount(value) {
        this._amount = value;
    }

    get date() {
        return this._date;
    }
    set date(value) {
        this._date = value;
    }

    get status() {
        return this._status;
    }
    set status(value) {
        this._status = value;
    };
}

首先是定义基本属性,并且从Entity继承了ID这样的属性,用来作为独一无二的标识,其中标识可以在对象创建的时候生成,也可以在持久化对象的时候生成。

Value Object

首先针对Entity以及Value Object,我们应该尽量使用的是值对象而非实体。如果将所有的的对象创建实体,每一个实体的属性都映射到数据库中,并且为每个属性设置相应的setter以及getter,会变得异常复杂,并且浪费时间。
相反的,值对象可以在创建对象化之后直接处理掉,不用担心客户端对值对象的修改问题。
对于值对象,它不应该成为领域内的某一个东西,而仅仅是描述领域内的一个概念。
当值对象创建出来之后,就不应该再去修改,也就是值对象的不变性。
对于简单代码而言

class ValueObject {
    constructor() {
        super()
    }
}

class Business extends ValueObject {
    constructor(options = {}) {
        const {
            amount, date, status
        } = options;
        // 从父类继承id属性,用来表示Entity的独一性 
        super();
        this.amount = amount;
        this.date = date;
        this.status = status;
    }

    get amount() {
        return this._amount;
    }
    set amount(value) {
        this._amount = value;
    }

    get date() {
        return this._date;
    }
    set date(value) {
        this._date = value;
    }

    get status() {
        return this._status;
    }
    set status(value) {
        this._status = value;
    };
}

没有ID属性,也就缺失了独一无二的特性

Domain Service

领域中的服务表示无状态的操作,用于实现某个特定领域的任务。当操作不适合放在聚合中或者ValueObject中的时候,此时就应该放置在领域服务中。
其中领域服务并不是业务服务,业务服务并不会处理到业务逻辑,而领域服务恰恰是处理业务逻辑的。
一些明确无状态的操作就可以划分到领域服务中去,如下

class DomainService {
    constructor() {
        super()
    }
}
class queryService extends DomainService {
    static async getTransaction(){
        ...
    }
}

查询操作就可以划分到领域服务中去。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,312评论 19 139
  • 一. Java基础部分.................................................
    wy_sure阅读 9,232评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,898评论 18 399
  • 有人说,你边上班边带孩子,家里肯定有老人帮忙吧! 有人说,你自己带两个孩子,还上班?你的工作一定很轻松...
    宁子沫沫阅读 1,547评论 1 1
  • 一些博客 王巍 Objc中国发起人、Line工程师 ibireme YYKit作者 bang JSPatch作...
    RubyAhooo阅读 12,179评论 21 299