首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >域动态/变更时如何处理域驱动设计

域动态/变更时如何处理域驱动设计
EN

Stack Overflow用户
提问于 2014-05-28 08:32:03
回答 4查看 649关注 0票数 3

为了阐明我的意思,让我们建立一个假设的场景,在那里可能需要这样做。

让我们说,我正在为一家管理苏格兰威士忌酿酒厂的公司开发一些软件。每一家啤酒厂公司都可以有一份这个软件的副本来管理所有的商业物流。

假设我有一个Kettle对象,在它上我们将有一些属性,例如.Colour.Material

但如果Glenfiddich啤酒厂想要另一处领地呢?例如,.Size和其他一些啤酒厂不关心以上所有的事情,只对.Content.DateFermentationStarted感兴趣

在OOP中,是否有一种方法可以使我的Kettle对象动态(有不同的属性和方法),取决于一些名为Customer的参数

如果我没有弄错的话,这和多态性有很大的不同。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-28 12:35:29

您不能在这个场景中应用太多DDD,因为域概念定义在不同的客户端之间发生变化。我是说,我们都有水壶,但客户想要的任何财产都可以。你怎么能运用行为?更准确地说是什么?

最多“域”对象将是数据结构。在定义对象以及自定义选项是什么时,谁得到一个谚语确实很重要。例如,如果客户端可以从预定义的属性中进行选择,那么您就有一定的回旋余地。

但是,如果他们可以添加任何具有任何名称的属性,那么您就失去了语义,并且最终得到了由神奇字符串组成的数据结构。并且您不能强制执行业务规则,除非您还有一个业务规则编辑器,客户端可以使用它来定义规则。这对开发人员和客户来说都是相当复杂的。

因此,IMO,DDD并不真正适合这一点,除非您正在为每个客户构建单独的应用程序,但正确的OOP仍然适用。不过,您将使用数据结构,而ORM在这里可能会有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2014-05-28 11:16:57

如果这些属性是动态的,则有几个选项。

  1. 拥有具有公共属性的基类,然后派生具有定义的新属性的新类。但是,这个解决方案有一个问题--您必须为每个需要特殊属性的客户创建不同的构建。更重要的是,系统在代码级别的显式属性意义上是完整的文档化。
  2. 属性建模为一个独立的自治类,并能够在运行时创建属性实例并将它们分配给域对象。属性可以在DB中定义(以及它们的名称,可能是数据类型),并分配给需要的特定域类。这样就不需要为每个不同的配置创建新的构建,只需要一个DB更新。

这个简单的类图展示了这样的想法:

在DB中以及在运行时读取和分配给域对象时定义了其他属性。

票数 1
EN

Stack Overflow用户

发布于 2014-05-28 09:42:24

首先,谢谢你让我为你的英国例子而发笑:-D

我要做的是,并且要记住,我是一个初学者,它有一个处理所有属性的Domain对象,还有一个派生类型,它还提供了一个接口来告诉租户哪些属性是允许读取的。

代码语言:javascript
复制
interface iKettle
{
    public getColour() : ?Colour;
}

interface iUserKettle extends iKettle
{
    public canReadColour() : bool;
}

class Kettle implements iKettle
{
    public getColour() : ?Colour
    {
        return this.colour;
    }
}

class UserKettle extends Kettle implements iUserKettle
{
    public UserKettle(....., UserKettleProperties props)
    {
        this.props = props;
    }

    public canReadColour() : bool
    {
        return this.props.canRead("colour");
    }

    public getColour() : ?Colour // override
    {
        if(this.canReadColour())
            return super.getColour();
        else
            throw new Exception("You aren't allowed to know the colour");
    }
}

canRead*方法的要点是要有一种明确的方法来判断属性是否可读。

假设您有一个Kettle字段,它返回一个值,它也是可空的。然后执行instance.getSomeProperty(),得到NULL。但是您得到NULL是因为值实际上是空的,还是因为您不允许读取它?这就是为什么您有第二个方法,即canReadSomeProperty(),它告诉您是否允许调用getter方法。

或者,为了拥有canRead*方法并抛出异常,您可能会考虑只返回NULL或null对象。

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

https://stackoverflow.com/questions/23906488

复制
相关文章

相似问题

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