首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计方法(领域驱动或服务驱动)

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

Stack Overflow用户
提问于 2010-08-04 12:13:47
回答 2查看 419关注 0票数 4

我的问题是:

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

  1. Service驱动approach

编写只包含文件属性的VO文件。例如:

代码语言:javascript
复制
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;
    }
}

并为与文件相关的操作分离服务。例如:

代码语言:javascript
复制
public Class FileService {
        public boolean deleteFile(File file) {
            //Add delete logic.
        }
        //Same way you can add methods for Add and copy file.
}

  1. Domain驱动的方法(我可能错了)

其中VO文件包含所有属性和所需的操作:

代码语言:javascript
复制
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.
}

那么,这两种方法的利弊是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-04 12:34:35

没有多少关于你想要什么样的系统的信息,就很难发音。对我来说,选择取决于系统的界限。

如果您需要提供一个以服务形式公开并可供外部使用者访问的API,请选择解决方案1,这是唯一的方法。如果您的系统是一个类库,它的API将在内部被其他应用程序使用,那么可以选择一个富域模型,如解决方案2中的那样,它是一个更多的OO。您不希望使用没有真正原因的服务、管理器和实用程序类来膨胀API。

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

票数 4
EN

Stack Overflow用户

发布于 2010-08-04 12:35:13

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

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3405352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档