[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.然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素. 因此本文建议直接在目标平台上用直接度量进 ...
随机推荐
- JS实现TITLE悬停长久显示效果
canrun <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...
- mysql DB server端,如何让读写更快
其实,我不是专业的DB管理同学,甚至算不上会了解.只是在最近的工作中,遇到了DB server端优化的契机,所以把这些手段记录下来: 通过调整这个参数的值,可以让DB更给力: 这两个参数的含义: 1. ...
- DevExpress.XtraGrid winform试用分享
DevExpress.XtraGrid在winform里使用还挺麻烦,为了减少重复代码和代码复用,本人针对DevExpress.XtraGrid封装了一个Form的基类,其中涵盖了DevExpress ...
- unix/linux中图形界面那些事
我们知道unix/linux刚开始的时候是没有图形界面的,随着时代的发展,排版.制图.多媒体应用越来越普遍了,这些需求都需要用到图形界面(Graphical User Interface).为此,MI ...
- java中解决组件重叠的问题(例如鼠标移动组件时)
java中解决组件覆盖的问题! 有时候在移动组件的时候会出现两个组件覆盖的情况,但是你想让被覆盖的组件显示出来或者不被覆盖! 在设计GUI时已经可以定义组件的叠放次序了(按摆放组件的先后顺序) ...
- 使用命令行备份指定文件夹并保留最新N份
客户需要对网站进行定期备份,并保留最近30天的文件,编写后以下脚本,通过Windows的任务计划进行调度 对比手工和任务计划调度运行情况来看,手工运行中可直接调用RAR.exe和网络进行传输,但是任务 ...
- Direct3D11学习:(四)计时和动画
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 接触过游戏开发的人都知道,在游戏中,计时器是一个非常重要的工具,用来精确地控制游戏帧数和动画的播放.要正确实现动 ...
- ASP.NET HTTP模拟提交通用类 GET POST
用法: WebRequestSugar ws = new WebRequestSugar(); //可选参数 //ws.SetAccept //ws.SetContentType //ws.SetC ...
- 一、HTTPServer,RequestHandler,ServerHandler,Handler
1. HTTPServer,RequestHandler,ServerHandler,Handler 1.1 基本概念 HTTPServer主要是对传输控制层HTTP,TCP,S ...
- mysql获取插入时自增ID值的方法
1. LAST_INSERT_ID: LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变. LAST_INSERT_ID是 ...