设计方法(域驱动或服务驱动)

Sil*_*ior 4 java architecture domain-driven-design

我的问题陈述是:

我想写设计文件管理(添加,复制,删除等操作).有两种方法:

  1. 服务驱动的方法

写入仅包含文件属性的文件VO.例如


public Class File {
    private boolean hidden;
    private boolean read;
    private boolean write;

    public boolean isHidden() {
        return hidden;
    }
    public void setHidden(boolean hidden) {
        this.hidden = hidden;
    }
    public boolean isRead() {
        return read;
    }
    public void setRead(boolean read) {
        this.read = read;
    }
    public boolean isWrite() {
        return write;
    }
    public void setWrite(boolean write) {
        this.write = write;
    }
}
Run Code Online (Sandbox Code Playgroud)

并为文件相关操作分离服务.例如:


public Class FileService {
        public boolean deleteFile(File file) {
            //Add delete logic.
        }
        //Same way you can add methods for Add and copy file.
}
Run Code Online (Sandbox Code Playgroud)
  1. 领域驱动的方法(我可能在这里错了.)

文件VO包含所有属性和所需操作的位置:


public class File {
    private boolean hidden;
    private boolean read;
    private boolean write;

    public boolean isHidden() {
        return hidden;
    }
    public void setHidden(boolean hidden) {
        this.hidden = hidden;
    }
    public boolean isRead() {
        return read;
    }
    public void setRead(boolean read) {
        this.read = read;
    }
    public boolean isWrite() {
        return write;
    }
    public void setWrite(boolean write) {
        this.write = write;
    }
        public boolean deleteFile() {
            //Add delete logic.
        }
        //Same way you can add methods for Add and copy file.
}
Run Code Online (Sandbox Code Playgroud)

那么这两种方法的优点和缺点是什么?

Jef*_*rey 6

在面向对象的语言中,将逻辑放在类本身而不是服务类中是典型的方法(以及更好的IMO).它遵循"告诉,不要问"原则,例如,通过告诉文件删除自己,而不是要求某些服务删除它.这背后的主要原因之一是允许继承.例如,如果您有一个File的子类并希望在删除它之前编写一条日志消息,那么对于服务类来说这很难做到,因为您需要为每个子类使用不同的服务类.

就面向服务的方法而言,这通常被认为是更高层次的(即面向服务的架构).考虑一个金融股票系统,您可能有"买入股票"服务和"卖出股票"服务.拥有一个对应于各个类的服务类(即一个知道如何买卖股票的股票服务)不会非常面向对象.

您可能还在系统中有一个服务层,它提供与其他外部服务(即数据库)的集成点,但同样,我不认为这就是您在这里所说的.所以,我可以坚持在File类本身封装逻辑的方法.