网站开发+百度编辑器,济南seo公司报价,西安私人网站,房租 做网站1.引言
在开始之前#xff0c;我想我们有必要先了解以下DDD的主要参与者。因为毕竟语言是人说的吗#xff0c;就像我们面向对象编程一样#xff0c;那通用语言面向的是#xff1f;DDD的主要参与者#xff1a;领域专家开发人员领域专家#xff1a;精通业务的任何人。开发…1.引言
在开始之前我想我们有必要先了解以下DDD的主要参与者。因为毕竟语言是人说的吗就像我们面向对象编程一样那通用语言面向的是DDD的主要参与者领域专家开发人员领域专家精通业务的任何人。开发人员开发测试。领域专家擅长某个领域的知识专注于交付的业务价值。开发人员则注重于技术实现。开发人员总是想着类、接口、方法、设计模式、架构等。以面向对象的编程思想进行思考思考如何进行抽象、封装、继承、多态等。而领域专家对软件中的框架、持久化、数据库等没有概念而这也就导致了他们之间交流的困难性。
那怎么解决交流障碍这个问题呢
2. 通用语言
抛开DDD而言单从字面意思来理解我们首先肯定先联想到作为世界使用最多的语言--英语。英语之所以能成为通用语言我想无非是以下几方面
简单易学使用率高国际通用
那DDD中通用语言又是怎样呢首先它也同样要拥有【简单】的特性这样才便于理解和传播。其次它也要有【通用】、【使用率高】的特性因为只有在软件开发的过程中团队范围内所有的参与人员广泛使用才能准确传递业务规则。
通用语言是团队交流的基础上建立起来的代码则是基于通用语言来进行业务表达的。
3. 举个例子
项目经理安排了一项任务给我圣杰这个补丁处理下【可销控制】这个需求。听后真是一脸懵逼【可销控制】是什么鬼
这明显是专业术语我不懂的专业术语。按照DDD对通用语言的定义【可销控制】就不算通用语言。因为只有领域专家知道它的含义开发人员一脸茫然。
但通用语言是领域专家和开发人员一起创建的所以我们开个需求会议来梳理下专业术语背后的含义。
可销控制的应用场景是在ERP中在做单时对销售员负责的客户进行范围控制。比如A客户是销售员小李发展过来的小李希望仅能自己负责对A客户的业务。
这么一解释是不是明白不少了。但是不是还有几点疑惑
可销范围如何配置做什么单据时进行可销范围控制如何进行可销控制可销控制需不需要参数控制
经过讨论得出以下结论
提供专门的【销售员-客户可销控制】界面进行销售员-客户映射数据配置。做销售订单单据时进行可销范围控制在录入销售员后做单员在选择客户列表时客户列表中仅显示可销范围配置的客户数据。提供【销售员-客户可销范围控制】系统参数勾选后才进行可销范围控制。
好了这下需求理解个七八九了。原来可销控制就是销售员-客户销售范围控制。咱们用一句话来精简下这个需求可销控制是指销售员所负责客户的范围控制当勾选了【销售员-客户可销控制】参数后在做销售订单录入客户数据时客户列表仅能选择到在【可销控制】列表中为该销售员配置的客户。
经过这么一说明我们是不是已经理清了【可销控制】这个需求点。
那这种通过团队交流达成共识的能够简单清晰准确传递业务规则的语言可以是文字、图片等即可称为通用语言。
4. 通用语言的价值
就像上面所说的那样通用语言的最大价值是解决了交流障碍问题使领域专家和开发人员能够协同合作从而能够确保业务需求的正确表达。另外基于通用语言开发人员能够开发出可读性更好的代码从而将业务需求准确转化为代码设计。达到DDD的目标代码即设计设计即代码。通俗的讲也就是开发人员写的代码领域专家也能看懂。
5.通用语言的代码表达
既然开发人员也要基于通用语言进行代码开发那代码如何体现通用语言呢在《实现领域驱动设计》书中有一个简单的例子P238我们一起来看一下
系统必须对User进行认证并且只有当Tenant租户处于激活状态时才能对User进行认证。
上面这个用例就是基于通用语言的用例简单清楚的说明了业务规则。我们先看第一种代码实现
bool anthentic false;
User user _userRepository().FindUserByTenantIdAndUserName(tenantId, userName);if(user!null)
{authentic user.IsAuthentic(password);
}return authentic;
这段代码完全不能反应通用语言主要存在以下问题
这段代码先查找user再对user进行密码匹配来完成认证。其中user.IsAuthentic(password);表示的是“用户是否被认证”的意思而没有表达出“认证”这个过程即“对用户进行认证”。未体现“检查Tenant是否处于激活状态”这个前提条件。
知道问题后我们可以讲代码略做改动
bool anthentic false;
Tenant tenant _tenantRepository.FindTenantById(tenantId);//检查租户是否激活if(tenant!nulltenant.IsActive){
User user _userRepository.FindUserByTenantIdAndUserName(tenantId, userName);if(user!null)
{authentic tenant.Authenticate(user, password);//租户对用户进行认证}
}}return authentic;
以上代码虽然也不是最终结果但至少对通用语言进行了体现。通读代码就能明白业务用例体现代码即设计这一思想。
原文地址http://www.cnblogs.com/sheng-jie/p/6819378.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注