[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.然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素. 因此本文建议直接在目标平台上用直接度量进 ...
随机推荐
- Subgradient Algorithm
Subgradient是一种可以优化不可微的凸函数的方法. 首先回顾凸函数的定义: $f(y) \geq f(x) + \nabla f(x)^T(y-x), all \hspace{2 pt} x, ...
- Unix sed实用教程系列目录[已完成]
本系列文章已经译完了,译自awk-sed@theunixschool,收获颇丰,作者没有讲明白的我做了补充,并且尝试讲的更清楚,整理成系列索引,方便学习,开篇非译文,是我为了方便后面的理解写的一篇,感 ...
- 原生DOM探究 -- NodeList v.s. HTMLCollection
涉及获取元素的主要API 在获取原生DOM元素的时候,主要涉及这几个DOM API(链接为Living Standard): Node及对应集合NodeList Element(继承Node)及对应集 ...
- 使用UIKit制作卡牌游戏(三)ios游戏篇
译者: Lao Jiang | 原文作者: Matthijs Hollemans写于2012/07/13 转自朋友Tommy 的翻译,自己只翻译了这第三篇教程. 原文地址: http://www.ra ...
- 各种Camera,总有一款适合你(二)
在实际的项目开发中,一般需要程序抽象出一些在几何意义上有明确意义的参数,这样方便策划或美术在自己的机器上进行调试. 下面是一个可变参的地下城摄像机的简单实现: // 第三人称摄像机,平移和旋转会同时进 ...
- CentOS下Tmux安装和使用
Tmux介绍: Tmux是BSD实现的Screen替代品,相对于Screen,它更加先进:支持屏幕切分,而且具备丰富的命令行参数,使其可以灵活.动态的进行各种布局和操作.它可以做到一条命令就启动起来( ...
- [Matlab.Matrix] reshape
a=[1,2,3;4,5,6;7,8,9]; a=reshape(a,1,9); a=[1,4,7,2,5,8,3,6,9]; a=reshape(a,9,1); a=[1;4;7;2;5;8;3;6 ...
- python内置模块(3)
博主所有python文章均为python3.5.1环境. 目录: 1.collections 2.subprocess 3.configparser 4.XML 5.shutil 一. collect ...
- 【第〇课】用更好的IDE开发
推荐的IDE IntelliJ IDEA JetBrains是一家捷克的软件开发公司,这家公司做出了很多的优秀的IDE,有写python的.php的.web前端的……IDEA就是其中一款非常优秀的ja ...
- IOS学习笔记之 Socket 编程
最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”.所以在今天,开始好好学习IOS.(本人之前4年都是搞.Net的,java也培训过一年) 打算学IOS,从哪入 ...