[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的更多相关文章

  1. [Architecture Design] 跨平台架构设计

    [Architecture Design] 跨平台架构设计 跨越平台 Productivity Future Vision 2011 在开始谈跨平台架构设计之前,请大家先看看上面这段影片,影片内容是微 ...

  2. [Architecture Design] CLK Architecture

    CLK.Prototype.Architecture 最近找数据,看到了博客园在不久之前,办了一个架构分享的活动:.Net项目分层与文件夹结构大全.看完之后觉得获益良多,接着也忍不住手痒,开始整理属于 ...

  3. [Architecture Design] 3-Layer基础架构

    [Architecture Design] 3-Layer基础架构 三层式体系结构 只要是软件从业人员,不管是不是本科系出身的,相信对于三层式体系结构一定都不陌生.在三层式体系结构中,将软件开发所产出 ...

  4. Architecture Design Process

    Architecture Design Process The architecture design process focuses on the decomposition of a system ...

  5. .NET Best Practices: Architecture & Design Patterns (5 Days Training)

    .NET Best Practices: Architecture & Design Patterns (5 Days Training) .NET最佳实践:架构及设计模式 5天培训课程 课程 ...

  6. 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 ...

  7. Responsive Design响应式网站设计心得笔记

    这个词已经喊了很久了,一直都是小打小闹,没正经的做过大的响应式全站,这次终于有机会了.网站刚上线半个月,就要改版为响应式设计,支持手机/PC等各类终端显示浏览.今天把首页做好,并测试无误,这里把一些应 ...

  8. Android 5.0以上Material Design 沉浸式状态栏

    偶然在知乎上看到这个问题,Android 5.0 如何实现将布局的内容延伸到状态栏,之前也见过多个应用的这个功能,但是知乎上的答案却没有一个真正实现此功能的一类是把标题栏设置App主题颜色,一类是提取 ...

  9. ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

    1. 摘要 最近,神经网络的架构设计都是基于计算复杂度的间接度量,比如 FLOPs.然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素. 因此本文建议直接在目标平台上用直接度量进 ...

随机推荐

  1. UIWebView 操作

    网络开发中,当公司已经使用 HTML5 技术实现同时适应 Android 和 iOS 等多个平台的网页时,这时往往需要我们 iOS 平台能够嵌入网页并进行各种交互,那我们应该怎么做来实现这种需求呢? ...

  2. C++ Low level performance optimize 2

    C++ Low level performance optimize 2 上一篇 文章讨论了一些底层代码的优化技巧,本文继续讨论一些相关的内容. 首先,上一篇文章讨论cache missing的重要性 ...

  3. nginx+lua_nginx+GraphicsMagick生成实时缩略图

    暂做笔记,带后续验证通过后,再补充 1.2.3 步. 一.安装 lua 首先确认是否安装 readline yum -y install readline-devel ncurses-devel 进入 ...

  4. 简谈ubuntu之DIY发行版

    2007.05.13    二十一世纪到了,每个人都强调自己的个性,于是一种叫做DIY的东西悄然兴起. 操作系统作为全人类智慧的结晶,自然DIY起来难度极大,因而DIY出一个操作系统成就感绝对比买宜家 ...

  5. angularjs + seajs构建Web Form前端(一)

    简介 Bootstrap是Twitter推出的一个用于前端开发的开源工具包,它由Twitter的设计师Mark Otto和Jacob Thornton合作开,是一个CSS/HTML框架. Angula ...

  6. Vectoroid

    Use cases Drawing (sketch, illustrations, cartooning, etc). Diagramming (any sort of chart with obje ...

  7. Javascript倒计时组件new TimeSpan(hours, minutes, minutes)

    function TimeSpan(h, m, s) { this.h = Number(h); this.m = Number(m); this.s = Number(s); } TimeSpan. ...

  8. DDD:四色原型中Role的 “六” 种实现方式

    背景 一个实体在不同的上下文中具备不同的职责,如:产品在“生产完成上下文”中具备的一些职责,在“质检相关上下文”中具备另外一些职责.四色原型.DIC和“UML事物模式”在不同的维度阐述了这一情况,在代 ...

  9. Mysql学习笔记(三)运算符和控制流函数

    本章学习内容: 1.操作符 2.控制流程函数 操作符: i.圆括号.. 简单的介绍一下圆括号,圆括号的使用的目的是规定计算表达式的顺序...这个想必大家都熟悉例如  mysql>select 1 ...

  10. R提高篇(二): 图形初阶

    目录: 图形示例 图形参数 符号.线条 颜色 文本属性 尺寸与边界 自定义标题 自定义坐标轴 图例 文本标注 图形组合 图形示例 如下代码描述病人对两种药物五个剂量水平上的响应情况 > myda ...