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

Java 设计方法(领域驱动或服务驱动),java,architecture,domain-driven-design,Java,Architecture,Domain Driven Design,我的问题陈述是: 我想写设计文件管理(添加、复制、删除等操作)。有两种方法: 服务驱动方法 写入仅包含文件属性的文件VO。例如 public Class File { private boolean hidden; private boolean read; private boolean write; public boolean isHidden() { return hidden; } public void setHid

我的问题陈述是:

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

  • 服务驱动方法
  • 写入仅包含文件属性的文件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 Class FileService {
            public boolean deleteFile(File file) {
                //Add delete logic.
            }
            //Same way you can add methods for Add and copy file.
    }
    
  • 领域驱动方法(这里我可能错了。)
  • 其中,文件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.
    }
    

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

    如果没有太多关于您正在设计的系统类型的信息,很难发音。对我来说,选择取决于系统边界

    如果您需要提供作为服务公开并可供外部消费者访问的API,请选择解决方案1,这是唯一的方法。如果您的系统是一个库,它的API将由其他应用程序在内部使用,那么请选择解决方案2中的富域模型,它更适合面向对象。您不想用服务类、管理类和实用程序类来扩充API,因为这些类不存在真正的原因


    但是,在不知道最终目标的情况下,很难说清楚。

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

    就面向服务的方法而言,这通常是在更高的层次上考虑的(即面向服务的体系结构)。考虑一个金融股票系统,你可能有一个“买入股票”服务和一个“卖出股票”的服务。拥有一个与单个类相对应的服务类(即股票服务,它知道如何买卖股票)并不是非常面向对象的

    您的系统中可能还有一个服务层,它提供与其他外部服务(即数据库)的集成点,但我想这不是您在这里讨论的内容。因此,我可以坚持将逻辑封装在文件类本身中的方法