`
talentluke
  • 浏览: 604484 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于领域建模时考虑用户需求的出发点的理解

 
阅读更多

摘自http://www.jdon.com/42751

最近又重温了领域驱动设计的原著,有了一些新的理解。现在我觉得我能更好地理解jdon007之前说的下面这段话了。

“用 户需求”不能等同于“用户”,捕捉“用户心中的模型”也不能等同于“以用户为核心设计领域模型”。 《老子》书中有个观点:有之以为利,无之以为用。在这里,有之利,即建立领域模型;无之用,即包容用户需求。举些例子,一个杯子要装满一杯水,我们在制作 杯子时,制作的是空杯子,即要把水倒出来,之后才能装下水;再比如,一座房子要住人,我们在建造房子时,建造的房子是空的,唯有空的才能容纳人的居住。因 此,建立领域模型时也要将用户置于模型之外,这样才能包容用户的需求。

所以,我的理解是:我们设计领域模型时不能以用户为中心为出发点去思考问题,不能老是想着用户会对系统做什么;而应该从一个客观的角度,根据用户需求挖掘出领域内的相关事物,思考这些事物的本质关联及其变化规律为出发点去思考问题。

下面以Eric Evans(DDD之父)在他的书中的一个货物运输系统为例子简单说明一下。

在经过一些用户需求讨论之后,在用户需求相对明朗之后,Eric这样描述领域模型:
1. 一个Cargo(货物)涉及多个Customer(客户,如托运人、收货人、付款人),每个Customer承担不同的角色;
2. Cargo的运送目标已指定,即Cargo有一个运送目标;
3. 由一系列满足Specification(规格)的Carrier Movement(运输动作)来完成运输目标;

从 上面的描述我们可以看出,他完全没有从用户的角度去描述领域模型,而是以领域内的相关事物为出发点,考虑这些事物的本质关联及其变化规律的。比如第1点, 如果是以用户为中心的话,就变成了:一个托运人可以托运货物,即具有托运货物的行为,一个收货人可以收货物,一个付款人需要付款;而他的描述中完全以货物 为中心,把客户看成是货物在某个场景中可能会涉及到的关联“事物”,如货物会涉及多个客户,货物有一个确定的目标,货物会经过一系列列的运输动作到达目的 地;其实,我觉得以用户为中心来思考领域模型的思维只是停留在需求的表面,而没有挖掘出真正的需求的本质;我们在做领域建模时需要努力挖掘用户需求的本 质,这样才能真正实现用户需求;

这让我想到了我之前思考图书借阅系统时的出发点也是错误的,因为我之前总是在以用户为中心思考问题。比如借书者借书,借书者还书,管理员对书本入库,等等;经过上面的分析后,我觉得我应该以书本为核心出发点思考领域模型。如:
1. 一本书在某个时刻最多只能被一个人借,或者没有被借走留在图书馆;
2. 书本在被归还时需要检查归还时间,如果有超期则需要做罚款处理;
3. 一本书有库存信息,如书本存放位置,库存数量;
4. ……

没有从用户的角度去描述领域模型,而是以领域内的相关事物为出发点。



看来认识识分析需求有两种线索,一个是以人为核心的需求分析;还有一个与人无关,事物领域自身的内在规律,或者称为“道”。

至于以哪个为主要为侧重点,还是要看人和事物在不同场景中扮演戏份的多少与否,比如在货运系统中,从这个名字我们也可以看出以货为主的一个运输系统,因此,人应该处于次要地位。

但是图书馆借书这个案例中,我个人认为好像不是以书为主的自主运动,而是以人为主,书为辅助的这样一个系统,如果以书为主,就发生“书被借”这样奇幻事情发生,呵呵。

人 != 用户

比如,人口档案管理系统,系统中应有记录人的信息或者说存在关于人的模型,但这个人的模型并不表示用户。

图书馆管理系统,用户群若是“读者”,那么应该将“读者”(用户)至于模型之外;如果用户群是图书馆管理员,那么“读者”(不再是用户,哪怕命名为用户),可以置于模型之内(比如要挖掘用户兴趣模型,发现什么的人群喜欢阅读什么样的书)。

物流系统,如果用户群是“顾客”,那么应该将“顾客”至于模型之外;如果用户群是“管理者”,那么可以将“顾客”(此时已不是系统的用户)放在模型之内。

将“用户”至于“模型”之外,用户群单一时,比较容易做到;若存在多种性质截然不同的用户群时,要注意到不同用户群将有不同的心智模型,尽管它们之间可能有交集。

但是,即便将不同性质的用户群的心智模型聚集在一起,也应遵循这个原则,并需要清醒地意识到视角潜在的变化(这可能被忽略或遗忘, 从而引起混淆)。

从整体上而言,“书”、“账号”、“书库”是模型(包括其结构/状态与功能/行为上的特征),可理解为系统的结构组成;“借阅规则”是场景规约或业务规则,可理解为系统的运作规则。

用户(读者)的心智模型不仅仅包含书,还应包含账号(图书卡)、书库(图书馆)等,模型有状态有行为,但其在参与场景进行交互时的受到场景规约的约束。

一种可以尝试的思路,是从业务规则(感知场景,从中提炼出的场景规约)中发现模型,并将业务规则与模型进行整体上的分离,让模型更自由,从而可能复用于不同的业务规则,或适应业务规则的变化。

至于模型的组织可以借鉴四色 原型的PPT , 如图书馆的例子:Place(Library)、Party(Account)、Thing(Book), 或借鉴OO 的message-based的思路,将模型分类为object+message或event+handler/dispatcher; 当然,还有别的分类或组织模型的方法。

模型的使用者不应该被包含在模型内部。 ...



当你确定书是核心领域模型了,那么模型的使用者是不应该包含进来进行分析,通过借书这样一个事件 或场景的发生,模型的使用者与模型发生了关系,这时模型书还是需要一个使用者的记录的。
模型:
Class Book{
String id;
String name;
}

用户操作借书事件 激活借书服务,从而发生借书场景:
Class BookContext{

boolean borrow(Book book);

}

当borrow(Book book)事件被调用以后,拉了一泡屎,留下状态,这个书被借了,借阅者是某个用户,在数据表中我们可能有这样的记录:
book{
String id;
String borrowedUserId;
}

至于,这个borrowedUserId字段是否应该出现在Book模型中,则是另外一种设计考虑,比如我们认为borrowedUserId字段应该属于Book的状态,那么出现在BookState中比较合适,那么Book类有了一个新引用BookState:

Class Book{
String id;
String name;
BookState bookState;
}

Class BookState{
Book book;
User borrowedUser;
Date returnDate;//归还日期等
}

完毕。

我把整个过程列出来,是为了理清我们的思绪,不要让模型的状态去影响我们的分析。

以上这个分析的唯一前提是:假设这个系统是以书为核心,跟踪围绕书发生的各种事件

所以,我们在描述时不能以“书被借”这样去描述需求,会产生误导,因为“借书”是一个事件 ,而“书被借”是一个状态,状态是事件 的结果,事件是状态的因,而模型是事件 的核心,没有模型,事件就无法发生,就象没有电话,就没有电话铃这个事件 ,没有书,就不会有借书这样的事件

由以上倒退,我们知道,分析一个需求,核心模型是第一步,这一步是不应该考虑用户,前提是如果这个用户是在事件 发生时介入的话;但是如果这个用户不是事件 介入发生,而是属于模型一部分,如书的作者,那么就应该考虑用户。

我的观点是:天地不仁,以万物为刍狗。

千万不要以为是人就扔掉:驱动者和参与者的区别。在领域当中的“人”,与“刍狗”等同,没有特殊地位。在整个领域世界中,应该全是逻辑描述,即使是人,也应该以简单对象来理解,构成事实离不开万事万物。

试想一个互动功能,交朋友,没有任何独立于人的实物,把人扔掉会是什么样的效果呢?

理解驱动者与参与者区别,就可以走出误区,account很容易让人想到使用者,分开Passport和Reader不就行了?Reader是人吗?是,但他完全和Book的地位一样,“刍狗”一只而已。

“以用户为中心”的思想主要来自于登录系统——认为系统事件 参 与者就是现实世界中的用户。虽然这样的观点在一定程度上可行,但这种关联只是一个潜在的认为而已——经过登录后,认为某个现实用户(或者电脑,或者仪器, 或者IP)所发出的所有命令是系统中与这个登录所绑定的“人”发出的。这种关联是通过登录后获得,也就是说,若果没有登录,这两者应该是分离的,是两个独 立的个体。

分享到:
评论

相关推荐

    一次领域建模的实战之旅.docx

    领域建模是一种重要的软件开发方法,它关注于理解和表达业务领域的复杂性,通过抽象和建模来创建可复用的对象模型。在这个过程中,我们借鉴了《分析模式:可复用的对象模型》、DDD(领域驱动设计)以及彩色UML等建模...

    《软件需求分析》习题集

    《软件需求分析》习题集提供了丰富的练习题,旨在帮助学习者深入理解和掌握软件需求分析这一核心领域。软件需求分析是软件工程中的一个重要环节,它涉及到理解和定义软件系统的功能、性能和其他特性,确保软件产品的...

    第3章结构化需求分析郭宁《软件工程实用教程2》.pptx

    需求是用户对软件系统功能、性能、界面等特性的期望,它是软件开发的出发点。需求工程则是围绕需求管理、需求获取、需求分析、需求验证等过程展开的专业领域,随着时间的发展,需求工程逐渐成为软件工程的重要分支。...

    IBM Rational需求工程技术方案.PDF

    5. **定义用户需求**:从用户的角度出发,明确用户对系统的需求。 6. **识别角色和用例**:确定系统中的不同角色及其使用的用例。 7. **用例优先级排序**:根据业务价值和紧急程度对用例进行排序。 8. **用例细化**...

    实例化需求培训

    当用户工作流出现明显分支时,考虑拆分故事。 - **探索替代方案**:深入思考是否真的需要实施当前需求,探索是否有更简单或更高效的解决方案。 - **建立统一语言和细化领域模型**:确保所有参与者对项目的术语和概念...

    用例建模

    用例建模从用户的角度出发,清晰地描绘了系统的行为和功能,有助于确保系统开发的方向与用户需求一致。同时,用例建模也是UML动态建模的一部分,支持系统的进一步设计和实现。 #### UML2.X中的图 UML2.X提供了丰富...

    需求分析训练营讲义

    业务驱动的需求分析更注重从业务视角出发,通过业务建模,深入了解业务流程,识别并挖掘潜在需求。需求的五种类型包括约束、质量需求、价值树、业绩差距(问题)、项目目标等,这些类型覆盖了需求的各个方面,帮助...

    数据仓库建模技术

    1. **满足不同用户的需求**:考虑到金融行业业务流程复杂,涉及多个业务部门和层级,数据模型设计时必须充分考虑这些不同的需求。例如,在财产保险领域,模型需要支持财产险、货物运输险等多种类型的业务需求;同时...

    软件需求分析PPT资料整合pdf(有目录)

    ### 软件需求分析知识点整合 #### 一、需求工程概述 ...以上内容概括了软件需求分析的关键知识点,从需求工程的重要性到具体的方法和技术,旨在帮助读者全面理解软件需求分析的核心理念和实践方法。

    王建《移动终端产品的用户研究方法探讨》.pdf

    这提示了产品经理在进行用户研究时,不仅要关注产品的功能是否满足用户的基本操作需求,还要考虑到更高层次的需求,比如产品的美观、趣味性以及是否能够帮助用户实现自我提升。 此外,文章还涉及了用户群分类和用户...

    Java 建模

    这种方法强调从整体的角度出发,考虑软件系统的各个组成部分及其相互作用,从而更好地指导开发过程。 ### 结语 通过本文的学习,我们不仅了解了UML中的序列图的基本概念及其应用场景,还深入探讨了序列图在表示...

    uml用例建模指南

    用例建模作为UML中的一种重要建模方式,其优势在于能够从用户角度出发,清晰地界定系统功能边界,促进需求的准确理解和表达。通过细致描绘参与者与系统之间的交互过程,用例建模不仅提升了软件开发的效率,还增强了...

    徐锋-需求分析

    徐锋老师在需求分析领域具有深厚的理论基础和丰富的实践经验,其课程内容设计贴合实际工作中遇到的诸多挑战,如理解用户的真实需求、明确需求规格、需求变更的管理等。课程内容不仅涵盖了需求分析的基本理论,还包括...

    软件工程与软件需求管理方法.pptx

    - **确保用户需求:**一切以满足用户需求为出发点。 - **用户需求至上:**确保软件产品能够满足用户的具体需求。 - **降低复杂度:**通过合理的设计来降低系统的复杂度,便于后期的维护。 - **简化、模块化设计:**...

    软件需求设计UML全程实作--愿景UMLChina

    愿景是软件项目开发的出发点,它描述了项目的目标和要达成的结果。通常,愿景需要从高层次的商业视角来描述,就像文档中引用的《财富》杂志评为“20世纪最伟大企业家”的例子一样,它的目的是为了激发并引导团队向着...

    毕业设计论文之详解需求分析

    信息主要来源于问题陈述,目的是澄清需求,为利益相关者和开发者之间的协议提供基础,并用作设计和实现的出发点。 领域分析的关键在于细化需求,构建真实世界的模型。这一阶段,我们需要根据初步的需求来构建详尽的...

    基于用户干预的自适应导航基于用户干预.zip

    1. 用户行为建模:系统如何收集和分析用户数据,构建用户行为模型,以理解用户的需求和驾驶习惯。 2. 实时反馈机制:用户如何通过点击、语音指令或其他交互方式对导航结果进行反馈,以及系统如何处理这些反馈以改善...

    UML建模方法论(上):建模初期的准备.docx

    业务目标通常反映了客户或公司对软件系统的期望,是软件开发工作的出发点。为了确立这些目标,我们需要与公司高层领导或项目发起人进行深入交流,理解他们的愿景和具体要求,从而明确软件系统应覆盖的业务范围和关键...

    数学建模之自来水管道铺设问题代码.rar

    3. **流量分析**:在设计管道系统时,要考虑不同时间段的水需求量。MATLAB可以用来模拟不同流量条件下的系统性能,如使用ode45等ODE求解器来模拟动态流体流动。 4. **成本函数**:铺设管道的成本包括材料、劳动力和...

    2B电商核心问题以及算法建模

    在2B电商领域,算法建模是实现精准营销和提升用户体验的关键技术之一。算法建模涉及多个方面,包括对用户(人)、商品(货)、市场(场)的深入理解和建模。本篇文档将从核心问题的定义出发,探讨如何通过算法构建...

Global site tag (gtag.js) - Google Analytics