Weitere ähnliche Inhalte Ähnlich wie 领域驱动设计实践 (20) 领域驱动设计实践1. 领域驱动设计实践 @
瑞友科技IT应用研究院池建强
Twitter: @sagacity
Weibo: @池建强
Mail: jackychi@gmail.com
2. About ME
• 池建强,70后程序员,98年毕业,先后就职于洪恩软件、
RocketSofeware和用友集团-瑞友科技,现任瑞友科技IT应用
研究院副院长
• 先后从事互联网和企业应用开发,目前致力于基础应用平台
的研究
• 热爱技术和编码工作,坚持年轻时的理想,倒霉的乐观者
• 技术领域:Java、Python、Ruby、Objective-C、DDD、
OSGi、App Platform
3. 模型是抽象的
现实是形象的
技巧是重要的
思想是永恒的
Domain
Model
-‐
What
Why
How?
7. 2010-01 2010-03
2010-05
...... 2010-12
采用领域驱动的
方式开发
幸福的时光总是短暂的......
8. 2010-01 2010-03
2010-05
...... 2010-12
采用领域驱动的 商务要求尽快出⼀一
方式开发 个版本
2010-01 2010-03
2010-05
...... 2011-04
好日子结束了
苦逼的总是开发者
15. public
interface
IBookService
{
û
double
submitOrder(int
orderId);
}
不容易理解的抽象
public
interface
IBookService
{
double
submitOrder(Order
order);
}
ü
32. • 成熟、清晰的分层架构
分层架构 • 领域对象与现实世界的业务映射
• 明确的职责划分
• 领域对象是核心
复用 • 领域对象复用:完整的业务对象描述
• 设计复用:设计基于领域对象而非数据库
• 具备复杂业务逻辑的软件开发
• 对设计和开发人员要求较高
使用场景
• 不适用普通CRUD的业务
• 软件的维护性和扩展性良好
34. 名称 职责
展现层 负责向用户展现信息以及解释用户命令
很薄的⼀一层,用来协调应用的活动。它不包含业务逻辑。它不保留
应用层 业务对象的状态,但它保有应用任务的进度状态
本层包含关于领域的信息。这是业务软件的核心所在。在这里保留
领域层 业务对象的状态,对业务对象和它们状态的持久化被委托给了基础
设施层。
本层作为其他层的支撑库存在。它提供了层间的通信,实现对业务
基础设施层 对象的持久化,包含对用户界面层的支撑库等作用
44. 关系数据库
面向对象数据库
NoSql
创建
存储
修改 活动状态 数据库
重建
删除 归档
数据库或文件
删除
48. Item Product
<<IPaymentStrategy>>
CashPay CreditCardPay
Aggregate
root
50. <beans>
<!--Volvo是ICar的实现类 -->
<bean id="vcar" class="Volvo">
</bean>
<!--为驾驶者提供用车,依赖注入-->
<bean id="oneDriver" class="Driver">
<property name="car">
<ref bean="vcar"></ref>
</property>
</bean>
</beans> public Driver{
private ICar car;
public Driver(){
}
public void drive(){
car.method();
}
//getter and setter
}
Driver drive = helper.getBean( "oneDriver" );
drive.drive();
72. 增加规约:
public class BookShelf { 1、不同作者的书放到相应
private List books; 的书架
2、不同类型的书放到相应
public BookShelf(){
的书架
books = new ArrayList();
}
public void addBook( Book book ){
books.add(book);
}
}
73. 引入规约 <<Specification>>
74. public class AuthorSpecification implements
Specification {
private String author;
public AuthorSpecification( String author ){
this.author = author;
}
public boolean isSatisfiedBy(Book book) {
return ( book.getAuthor().equals(author) );
}
}
public void addBook( Book book ){
if ( validate( book ) )
books.add(book);
}
private boolean validate( Book book ){
AuthorSpecification as = new AuthorSpecification( author );
TypeSpecification ts = new TypeSpecification( type );
return ( as.isSatisfiedBy(book) && ts.isSatisfiedBy(book) );
}
75. 边界上下文
Bounded
Context
83. Money
currency
amount
plus(Money other)
minus(Money other)
...
<<Entity>> <<Root>> <<Value Object>>
<<Entity>> <<Root>>
Order LineItem
Customer
date goods
name
customer quantity
surname
amount notes
address
...
subtotal() ...
update() ...
updateDiscount()
close()
...
ship()
...
shipping address
<<Value Object>>
CustomerData
billing address
name
surname <<Value Object>>
Address
<<Value Object>> street
city
country
zipcode
95. 分层描述
名称 职责
由于该平台主要面向B/S架构,展示层主要由web资源文件组成,包括
View JSP,JS和大量的界面控件,采用了AJAX技术,负责向用户展现丰富的界
面信息,并执行用户的命令
负责展示层请求的转发、调度和验证,同时处理后台返回的异常信息,同
Control 时控制层可以通过Action做远程的请求
是系统最为丰富的⼀一层,主要负责处理整个系统的业务逻辑。这⼀一层主要
Domain 包括业务服务和领域模型,同时负责系统的事务管理
负责数据持久化,支持O/R Mapping和JDBC,对数据源的访问提供多种访
Persistence 问方式
系统的控制层、领域层和持久化层元素都有IOC容器统⼀一管理,实现完全的接口分离和解耦
99. • 成熟、清晰的分层架构
分层架构 • 领域对象与现实世界的业务映射
• 明确的职责划分
• 领域对象是核心
复用 • 领域对象复用:完整的业务对象描述
• 设计复用:设计基于领域对象而非数据库
• 具备复杂业务逻辑的软件开发
• 对设计和开发人员要求较高
使用场景
• 不适用普通CRUD的业务
• 软件的维护性和扩展性良好
109. Questions?
Follow me
微博:@池建强 | twitter: @sagacity