为了阐明我的意思,让我们建立一个假设的场景,在那里可能需要这样做。
让我们说,我正在为一家管理苏格兰威士忌酿酒厂的公司开发一些软件。每一家啤酒厂公司都可以有一份这个软件的副本来管理所有的商业物流。
假设我有一个Kettle对象,在它上我们将有一些属性,例如.Colour和.Material。
但如果Glenfiddich啤酒厂想要另一处领地呢?例如,.Size和其他一些啤酒厂不关心以上所有的事情,只对.Content和.DateFermentationStarted感兴趣
在OOP中,是否有一种方法可以使我的Kettle对象动态(有不同的属性和方法),取决于一些名为Customer的参数
如果我没有弄错的话,这和多态性有很大的不同。
发布于 2014-05-28 12:35:29
您不能在这个场景中应用太多DDD,因为域概念定义在不同的客户端之间发生变化。我是说,我们都有水壶,但客户想要的任何财产都可以。你怎么能运用行为?更准确地说是什么?
最多“域”对象将是数据结构。在定义对象以及自定义选项是什么时,谁得到一个谚语确实很重要。例如,如果客户端可以从预定义的属性中进行选择,那么您就有一定的回旋余地。
但是,如果他们可以添加任何具有任何名称的属性,那么您就失去了语义,并且最终得到了由神奇字符串组成的数据结构。并且您不能强制执行业务规则,除非您还有一个业务规则编辑器,客户端可以使用它来定义规则。这对开发人员和客户来说都是相当复杂的。
因此,IMO,DDD并不真正适合这一点,除非您正在为每个客户构建单独的应用程序,但正确的OOP仍然适用。不过,您将使用数据结构,而ORM在这里可能会有所帮助。
发布于 2014-05-28 11:16:57
如果这些属性是动态的,则有几个选项。
这个简单的类图展示了这样的想法:

在DB中以及在运行时读取和分配给域对象时定义了其他属性。
发布于 2014-05-28 09:42:24
首先,谢谢你让我为你的英国例子而发笑:-D
我要做的是,并且要记住,我是一个初学者,它有一个处理所有属性的Domain对象,还有一个派生类型,它还提供了一个接口来告诉租户哪些属性是允许读取的。
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对象。
https://stackoverflow.com/questions/23906488
复制相似问题