我只是想查找Martin
Fowler的域模型模式的一些示例,但我找不到。
从我在Internet Domain Model上发现的内容来看,只是在类中添加了一些“逻辑”方法。例如
public class Income {
private String title;
private String comment;
private String date;
private Double amount;
private Integer category;
public ExIn(String title, String comment, Double amount, Integer category, String date) {
this.title = title;
this.comment = comment;
this.date = date;
this.amount = amount;
this.category = category;
}
public Integer getCategory() {
return category;
}
public void setCategory(Integer category) {
this.category = category;
}
// more getters and setters
// Domain Model part starts
public boolean isPositive()
{
return amount > 0 ? true : false;
}
// more methods like that
}
我理解正确吗?如果不是这样,我将不胜感激地举一个域模型模式用法的小例子。
我理解正确吗?如果没有,我将举一个例子。
大致上是。
对于Martin Fowler而言,
领域模型是领域的对象模型,其中包含行为和数据 。
域模型经常与模型相对,在模型中,您有特定的类来承载数据,而其他一些特定的类来承载行为/处理。
如果我参加您的Income
课程,它看起来更像是一个拥有属性/数据的类,而不是具有真实行为的域模型。
public boolean isPositive(){
return amount > 0 ? true : false;
}
是一种与模型无关的效用函数。
您可以将其放在Math
课堂上。
我将尝试为您提供一个域模型示例,然后再提供该模型将数据和处理分开的版本。
假设您要建模的应用程序领域的需求中,我们需要为收入增加奖金。例如,此奖金可能发生在圣诞节的冬季(但为什么不参加其他活动)
让域模型对象执行任务,而不是让服务类进行此处理。
Incomes
,高级对象可以在Income
实例上进行迭代并应用奖励,我们可以有一个奖励规则类,该规则类根据一些输入值定义奖励。
我介绍了多个类,因为这种想法是允许每个对象根据其职责进行协作。
收入:
public class Incomes {
List<Income> incomes = ...
....
public void applyBonus(BonusRule bonusRule){
for (Income income : incomes){
income.applyBonus(bonusRule);
}
}
收入:
public class Income {
private float amount;
...
public void applyBonus(BonusRule bonusRule){
float bonus = bonusRule.compute(this);
amount += bonus;
}
...
}
ChristmasRule:
public class ChristmasBonusRule implements BonusRule {
...
@Override
public float compute(Income income){
float bonus = ...
return bonus;
}
...
}
最后,我们可以通过以下方式进行处理:
void foo(){
// create a domain object that has both behavior and data
Incomes incomes = ...;
// invoke a functional method on the object by passing another domain object
incomes.applyBonus(new ChristmasBonusRule());
}
在将数据和逻辑划分为不同类的设计中,它看起来像这样:
public class IncomeBonusService {
// stateless : no incomes data inside it
....
public void applyChristmasBonus(List<Income> incomes){
for (Income income : incomes){
// Christmas bonus computation here
float bonus = ...
income.setAmount(bonus + income.getAmount());
}
}
}
我们可以这样处理:
// inject the service
@Autowired
IncomeBonusService incomeBonusService;
void foo(){
// create a domain object that has only data
List<Income> incomes = ...;
// invoke a service method by passing data as parameter
incomeBonusService.applyChristmasBonus(incomes);
}
对象没有任何行为(只有getter / setter)的模型设计称为Anemic Domain
Model。
此示例说明的两种方式之间的巨大差异:
领域模型:
对象是有意义的。
在班级之间明确定义了行为责任。
因此具有良好的隔离性,可测试性和可维护性。
例如,添加/删除/单元测试a BonusRule
很容易。
对象负责其状态。
的确,由于对象本身可以在与其他对象协作之后更新其状态,因此无需提供设置器。
我们可以在中看到Amount.applyBonus()
:
float bonus = bonusRule.compute(this); amount += bonus;
贫血领域模型:
所有逻辑都在服务类中。
因此,一个地方即可获取代码。
只需几行,就可以了。
但是请注意,这种优势有一定的局限性,因为随着逻辑变得庞大或复杂,最好的事情通常是将逻辑拆分为多个服务类。
但是,无论您需要多少服务类,整个逻辑都位于服务类中,而不是其他位置。如果我们将其与可能在某些不同的“类型”类中分解逻辑的领域模型进行比较,则可以简化开发规范。
为域类提供获取/设置程序的必要性。
该域也不负责其状态及其不变规则。
因此,任何依赖域类的类都可以“破坏”其状态。
附带说明一下,默认情况下,某些框架(用于持久性,映射,序列化等)依赖于getter / setter。
这就是为什么这种模型尽管有缺点,但却在某些项目中处于领先地位的原因。
快住手!域模型不是持久性模型 如果这是真的,将持久性对象与域对象分开有什么好处呢?
我目前正在进行一个项目,该项目需要使用QVTO将一个模型转换为另一个模型。源模型是以表格形式表示的状态机。目标模型也是具有节点和边的statemachine。源模型只有领域元模型,但目标模型同时具有领域和符号元模型。符号元模型是http://www.eclipse.org/gmf/runtime/1.0.2/notation。我从源域模型转换到目标域模型,但是我的目标模型没有表示法模型。我想做的是
在这个话题上有数百个类似的问题。但我仍然感到困惑,我希望得到专家的建议。 我们正在使用ASP开发一个应用程序。NETMVC4和EF5以及我们的是DB优先的方法。 我们在一个单独的项目中有数据层,该项目是一个类库,包含其中定义的所有实体。然后是用所有存储库和域模型定义的业务层(这是正确使用的术语)。然后是表示层。 目前我们还没有定义任何视图模型,我们使用的是与视图模型相同的BL域模型。在这种方法中,
本文向大家介绍生成式模型、判别式模型相关面试题,主要包含被问及生成式模型、判别式模型时的应答技巧和注意事项,需要的朋友参考一下 https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/blob/master/A-机器学习/A-机器学习基础.md#生成模型与判别模型 生成式模型(generative model)会对x和y的联合分布p(
6. 原型模式(Prototype) Intent 使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。 Class Diagram Implementation // java public abstract class Prototype { abstract Prototype myClone(); } // java public class ConcreteProt
显示模式 返回上级 关于显示模式 测定支持的显示模式 设置显示模式 恢复显示模式 Mode X和Mode 13显示模式 对高分辨率和真彩色的支持 关于显示模式 返回目录 显示模式指的是显示器的当前设置,描述了显示器的分辨率和位深度,这个信息通常是由显示硬件从主页面传递给显示器的。显示模式是由三个特征定义的:宽、高、位深度。例如,大多数的显示器可以显示宽为640像素、高为480像素的图象,每一个像素