[Architecture Design] 累进式Domain Layer
[Architecture Design] 累进式Domain Layer
前言
本篇的内容大幅度的简化了分析设计、面向对象等等相关知识,用以传达累进式Domain Layer的核心概念。实际开发软件项目时,建议还是采用DDD、TDD等等系统化方式来分析设计系统内容。
问题情景
软件项目套用三层式体系结构,可以将程序代码分门别类提供系统化的整理归类。
理论上,分析设计Domain Layer的时候,应该要从领域层的角度切入,去分析设计领域层的组成结构。但实作上,人类的思考惯性常常会带着开发人员使用Presentation Layer的角度,去分析设计Domain Layer的组成结构。例如:下列的商城系统,包含了购物车、商品查询这两个使用案例。
购物车这个使用案例,提供一个页面让使用者可以查询购物车购物列表,点击列表项目可以看到商品内容。依照页面的需求,开发人员可能会建立一个ShoppingCartService类别来提供领域层的服务,这个类别包含了两个方法:查询购物清单(GetAllPurchase)、取得商品内容(GetProductDetail)。
商品查询这个使用案例,提供一个页面让使用者可以商品编号来查询商品,并将查询到的商品内容显示在页面上。依照页面的需求,开发人员可能会建立一个ProductQueryService类别来提供领域层的服务,这个类别只包含了一个方法:取得商品内容(GetProductDetail)。
经由实作上面两个使用案例,可以在领域层内建立ShoppingCartService、ProductQueryService两个类别。但是仔细检视两个类别的方法,会发现GetProductDetail这个方法重复了。这时有经验的开发人员,就会精炼领层将共享的方法抽取出来,建立为一个共享的ProductCommonService类别,用以避免不必要的程序代码重复。
到目前为止,看起来软件架构一切正常,服务可以不停地依照系统需求被扩展,需要什么页面就在领域层扩展出对应的服务,并且从中不停精炼出共享服务。但是上述这个软件开发架构,其实仅适用于开发人数较少的开发团队;如果将开发情景拉高到多人共同开发的情景,会发现要从系统中精炼出共享服务,必须要有个人不停审核每个成员产出的服务,才能分析出共享的方法,接着在领域层中建立共享的服务。先不提一般开发团队是否拥有这样的人力配置,光是想想这个人员要审核所有的服务、并且发觉重复的程序代码,这个工作量就让人觉得头皮发麻,甚至可以说这是个不可能的任务。
解决方案
为了解决上述问题情景所会造成的问题,在软件开发架构设计的时候,就需要先设计好Domain Layer,让领域层拥有「累进程序代码」的能力。
以同样的商城系统,包含了购物车、商品查询这两个使用案例来说,可以先由软件架构师,定义Domain Layer该拥有甚么样的基础类别(ShoppingCartService、ProductService),这些基础类别一开始的时候不包含任何方法,只定义了这些基础类别的职责范围。(EX:ShoppingCartService负责购物车相关逻辑、ProductService负责商品相关逻辑)
实做购物车这个使用案例的开发人员,依照页面的需求会需要建立两个方法:查询购物清单(GetAllPurchase)、取得商品内容(GetProductDetail)。这时可以依照基础类别的职责范围,将GetAllPurchase散落到ShoppingCartService类别、将GetProductDetail散落到ProductService类别。再由购物车页面去使用这两个类别的方法,就可以完成使用案例的需求。
实做商品查询这个使用案例的开发人员,依照页面的需求会需要建立一个方法:取得商品内容(GetProductDetail)。这时可以依照基础类别的职责范围,将GetProductDetail散落到ProductService类别,但是马上会发现GetProductDetail方法在先前实作购物车使用情景的时候,已经被实做完成。那开发人员就可以很轻松的直接使用ProductService类别上的GetProductDetail方法,来完成商品查询的使用案例需求。
透过上述步骤,就能不停增加Domain Layer中各种基础类别的方法。而在基础类别的职责范围不足以覆盖项目范围的时候,也可以继续增加基础类别项目来覆盖更多职责范围。透过这样不断累进的方式,最终就能在Domain Layer中完整封装软件项目背后的领域知识。后续遇到新的使用案例,只要组合调用已经封装好的类别与方法,就能快速满足使用案例的开发需求。
后记
以DDD的角度去看,Entity、Service、Repository等等领域对象的定义,都可以拿来做为Domain Layer累积程序代码的基础类别,系统所以要提供的各种方法都可以散落在这些领域对象之上。DDD的相关分析设计资料可以参考:
[Architecture Design] 累进式Domain Layer的更多相关文章
- [Architecture Design] 跨平台架构设计
[Architecture Design] 跨平台架构设计 跨越平台 Productivity Future Vision 2011 在开始谈跨平台架构设计之前,请大家先看看上面这段影片,影片内容是微 ...
- [Architecture Design] CLK Architecture
CLK.Prototype.Architecture 最近找数据,看到了博客园在不久之前,办了一个架构分享的活动:.Net项目分层与文件夹结构大全.看完之后觉得获益良多,接着也忍不住手痒,开始整理属于 ...
- [Architecture Design] 3-Layer基础架构
[Architecture Design] 3-Layer基础架构 三层式体系结构 只要是软件从业人员,不管是不是本科系出身的,相信对于三层式体系结构一定都不陌生.在三层式体系结构中,将软件开发所产出 ...
- Architecture Design Process
Architecture Design Process The architecture design process focuses on the decomposition of a system ...
- .NET Best Practices: Architecture & Design Patterns (5 Days Training)
.NET Best Practices: Architecture & Design Patterns (5 Days Training) .NET最佳实践:架构及设计模式 5天培训课程 课程 ...
- Agile software architecture design document style..( sketches and no UMLs)
http://www.infoq.com/articles/agile-software-architecture-sketches-NoUML If you're working in an agi ...
- Responsive Design响应式网站设计心得笔记
这个词已经喊了很久了,一直都是小打小闹,没正经的做过大的响应式全站,这次终于有机会了.网站刚上线半个月,就要改版为响应式设计,支持手机/PC等各类终端显示浏览.今天把首页做好,并测试无误,这里把一些应 ...
- Android 5.0以上Material Design 沉浸式状态栏
偶然在知乎上看到这个问题,Android 5.0 如何实现将布局的内容延伸到状态栏,之前也见过多个应用的这个功能,但是知乎上的答案却没有一个真正实现此功能的一类是把标题栏设置App主题颜色,一类是提取 ...
- ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
1. 摘要 最近,神经网络的架构设计都是基于计算复杂度的间接度量,比如 FLOPs.然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素. 因此本文建议直接在目标平台上用直接度量进 ...
随机推荐
- dissmiss a UISearchBar with an SearchBarController
If you want do dissmiss a UISearchBar with an SearchBarController, just use this Code: [self.searchD ...
- [Z] 北大一牛人生物转申CS的经历
http://www.bdwm.net/bbs/bbscon.php?board=CIS&file=M.1367038121.A&num=626&attach=0&di ...
- U3D4.X版本无法安装MONODEV编辑器
可能是由于机器无法成功安装.NET 4.0的缘故
- 浅析MongoDB数据库的海量数据存储应用
[摘要]当今已进入大数据时代,特别是大规模互联网web2.0应用不断发展及云计算所需要的海量存储和海量计算发展,传统的关系型数据库已无法满足这方面的需求.随着NoSQL数据库的不断发展和成熟,可以较好 ...
- 【转载】Solr4+IKAnalyzer的安装配置
转载:http://www.cnblogs.com/madyina/p/4131751.html 一.下载Solr4.10.2 我们以Windows版本为例,solr-4.10.2.zip是目前最新版 ...
- 指定的参数已超出有效值的范围 参数名: utcDate WebResource异常
指定的参数已超出有效值的范围.参数名: utcDate 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息 ...
- mysql中int、bigint、smallint 和 tinyint的区别详细介绍
1 bytes = 8 bit ,一个字节最多可以代表的数据长度是2的8次方 11111111 在计算机中也就是 -128到127 1.BIT[M] 位字段类型,M表示每个值的位数,范围从1到64,如 ...
- C# 读取压缩文件方式及乱码处理
目前主流的压缩文件操作类,除了C#原生的.还有 1. ZIP-DotNetZip 网址:http://dotnetzip.codeplex.com/ 2 7Zip-SevenZipSharp 网址:h ...
- 再次讲解js中的回收机制是怎么一回事。
在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这 ...
- 托管调试助手“NonComVisibleBaseClass”检测到问题
最近 一次在研究 自动化测试框架White ,程序总是报 “托管调试助手“NonComVisibleBaseClass”在“d:\xxxxxxxxxx.vshost.exe”中检测到问题.” 其他 ...