前沿

随着软件行业的飞速发展,从软件的管理、开发、测试运维等各个角度、环节都很着许多针对新业务场景产生的新技术。而在对于MDD,DDD,TDD这几个长得相似的几个名词相信也是十分常见的,以下做个总结。

一、关于MDD

简述

MDD(模型驱动开发)代表了一套理论和工业化软件开发的方法框架,在软件开发全生命周期中系统的使用模型作为主要工具。是一种以模型作为主要工件的高级别抽象的开发方法,是iuap平台下的元数据驱动设计框架,前后端的统一基于元数据的框架。

背景

只看概念,是十分抽象难以理解的。我们需要去结合MDD的目标回顾以下软件的大致发展过程。
首先MDD的核心思想:

  • 分离领域业务技术平台的耦合
  • 极大提升业务领域模型和技术模型在软件生命周期的复用

PIM(与平台、技术无关的模型) → PSM(技术平台具体实现的模型)

任何技术都来源于业务问题\用户的需求。随着软件的繁荣,高级语言的众多,在软件由现实世界映射为虚拟世界的过程中,不同语言采用的抽象层有所差异,因此需要寻求一种更为通用性的方案解决。概括来说当时/现在的软件危机/背景为:

  • 复杂性
  • 变更性

而软件的关注的角度主要为:业务领域 + 技术平台 + 问题抽象;我们在开发软件的过程则是将业务领域进行问题抽象,并采用技术去映射为机器代码的过程。作为软件开发工程师,为了更好地去解决 复杂、易变的 业务问题,出现了高级编程语言以及复用的思想,因此构建软件更加便捷。其中的复用理解十分关键,也需要从软件的发展去看待复用什么以及如何复用。软件的发展大致可以为以下阶段:

  1. 以机器为中心:通过0\1指令去控制机器,人们需要记忆机器指令,利用机器的思维去处理,此时基本上是软硬件一体化时代,此时还未体现复用,一般处理科学计算。
  2. 汇编时代,辅助符号去代替机器指令,但任然需要记忆寄存器、PC等指令,计算机内部世界,不过开始向人的思维过度。
  3. 高级语言及OS的出现,此时出现了巨大的改变,此刻人们则面向操作系统进行编程,中间有了操作系统的中间层,我们无需关注底层实现,甚至内存管理也无需关心。我们只需要关心高级语言的特性,如何利用高级语言去处理业务问题。但高级语言之间有着差异。因此,不同高级语言之间难以复用。解决该问题的方式可以为:
  • 建模,则可用该处的MDD,模型驱动开发,先进行建立通用模型,然后对于不同的高级语言都可以利用该通用的模型去开发。相对于在 OS 和 高级语言之间建立了一层抽象层。常见的建模工具则是UML了,也是业界常使用的。
  • 中间件(也是第四点,以企业为中心),不同语言只需去调用不同中间件提供的服务即可。

而 RPC 远程调用,解决的则是不同(不同语言)程序之间可以进行通信,可以并行开发,业务服务组件之间可以替换,也类似有点复用的意味,但没有明显的建立中介抽象层。
微服务追求业务层面的复用,服务的粒度更小,更便于替换。

更进一步,现在的serverless,直接面向用户提供计算、存储服务。

基本过程

关于模型的定义抽象过程如下图:


具体的讲解可参考参考博文

简单应用

对于UML的使用工具 常用的UML设计工具有微软Office自带的Visio、Rational Rose、PowerDesign以及StarUML、EA(Enterprise Architect)。对于UML大家肯定都听说过了,毕设或者课设一般都会用来画类图、交互图等。
但对于Eclipse的EMF建模工具,可能还没使用过,该建模工具则基于的ECore构建标准进行实现。具体的使用可参考:百度知道

二、关于DDD

有了MDD的基本概念,来理解DDD更好理解了。

基本概念

DDD(Domain-driven design)领域驱动设计是一种通过将实现连接到持续进化的模型来满足复杂需求的软件开发方法。领域模型是对业务模型的抽象,DDD是把业务模型翻译成系统架构设计的一种方式。

由概念可知,DDD则是重点关注在业务的层面,而MDD则是整个环节或者侧重于业务到技术的中间层。


关于DDD的更多介绍可以参考
博文1
博文2
对于DDD的项目示例,比较推荐 周志明老师的《凤凰架构》中的示例项目。以及阿里巴巴微服务脚手架COLA(面向对象架构),官方GitHub;脚手架地址

对于DDD 和 COLA 的区别,请见该文

三、关于TDD

概述

TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。

相对于前面两个概念,TDD更为简单,即测试先行。有面向失败设计的思想。为了保证开发的准确,先将进行编写测试(单元测试),在此过程中更利于去加深对业务的理解,降低错误。

基本原则

  • 独立测试不同代码的测试应该相互独立,一个类对应一个测试类,一个函数对应一个测试函数。用例也应各自独立,每个用例不能使用其他用例的结果数据,结果也不能依赖于用例执行顺序。 一个角色:开发过程包含多种工作,如:编写测试代码、编写产品代码、代码重构等。做不同的工作时,应专注于当前的角色,不要过多考虑其他方面的细节。

  • 测试列表:代码的功能点可能很多,并且需求可能是陆续出现的,任何阶段想添加功能时,应把相关功能点加到测试列表中,然后才能继续手头工作,避免疏漏。

  • 测试驱动:即利用测试来驱动开发,是TDD的核心。要实现某个功能,要编写某个类或某个函数,应首先编写测试代码,明确这个类、这个函数如何使用,如何测试,然后在对其进行设计、编码。

  • 先写断言:编写测试代码时,应该首先编写判断代码功能的断言语句,然后编写必要的辅助语句。

  • 可测试性:产品代码设计、开发时的应尽可能提高可测试性。每个代码单元的功能应该比较单纯,“各家自扫门前雪”,每个类、每个函数应该只做它该做的事,不要弄成大杂烩。尤其是增加新功能时,不要为了图一时之便,随便在原有代码中添加功能,对于C++编程,应多考虑使用子类、继承、重载等OO方法。

  • 及时重构:对结构不合理,重复等“味道”不好的代码,在测试通过后,应及时进行重构。

  • 小步前进:软件开发是复杂性非常高的工作,小步前进是降低复杂性的好办法。

四、一些小思考

软件的发展是朝着人的思维发展,而人的思维行为具有很多不确定性,人与人之间也用着复杂的关系。正是因为这些不确定性和复杂关系导致软件的复杂。而解决软件的复杂的最好办法则是不断寻求好的中间层进行抽象,并进行有效地抽象问题和复用,避免重复劳动。

另外,软件关注的主要有 质量 + 效益 + 成本。我们在关注效率的同时也要注意成本,当然效率的提升基本是会给成本的带来降低。现在越来越多的中小企业之所以愿意选择serverless服务,很大程度是因为,云原生提供了极好的服务,在不是高数据安全的要求之下,企业愿意去负担该笔费用,避免硬件的购买的昂贵费用。

什么是MDD,DDD,TDD?相关推荐

  1. Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计

    Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计 1.1. software development methodology (also known as SDM 1 1 ...

  2. 从myspace数据库看分布式系统数据结构变迁

    从myspace数据库看分布式系统数据结构变迁 http://smb.pconline.com.cn/database/0808/1403100.html [08-29 14:33:40]出处:pco ...

  3. 从前端工程师到前端架构师, 我们经历了什么?

    前言 前端架构师, 听起来就是个很高大上的 Title, 每个初入行的前端工程师在面试时, 被问到你未来的方向是什么? 我们或许都会很顺口的回答, "嗯, 朝着架构方向走吧..." ...

  4. 建站始末——(转载)

    本篇内容会有些长,希望各位看官可以认真的阅读下去,我相信肯定会有收获. 写在前面 蝴蝶眨几次眼睛,才学会飞行,夜空洒满了星星,但几颗会落地. --你不知道的事 蝴蝶眨眼睛?星星会落地?当然很多人会认为 ...

  5. 《小马哥讲Spring核心编程思想》-第一章学习笔记(1)

    <小马哥讲Spring核心编程思想>-第一章学习笔记(1) 一.课程介绍 1.为什么要学习spring? 2.深入学习spring的难点有哪些? 3.课程的设计思路是怎样的? 二.内容综述 ...

  6. 笔者很懒 | 4000字写写IT项目经理的“能力mvp”

    本文说明 [笔者简介]近3年软件开发项目管理经验,做过小项目的需求分析,也负责过千万项目的项目管理.需求开发工作.有项目管理.需求开发.内部培训.体系搭建.EPG过程改进等工作经历. 本文罗列笔者在工 ...

  7. [01]关于TDD、BDD和DDD的一些看法

    在实际的项目中,我们可能随时面对各种不同的需求,它的各个方面的要素决定了我们所采用的开发模式. 比如,它的复杂度如何?所有的需求是否足够清晰?开发人员对相关的业务是否足够了解?项目的工期是否合理?种种 ...

  8. 【转】浅谈TDD、BDD、ATDD、DDD的区别

    四个开发模式意思: TDD:测试驱动开发(Test-Driven Development) BDD:行为驱动开发(Behavior Driven Development) ATDD:验收测试驱动开发( ...

  9. TDD、BDD、ATDD、DDD 软件开发模式

    四个开发模式意思: TDD:测试驱动开发(Test-Driven Development) BDD:行为驱动开发(Behavior Driven Development) ATDD:验收测试驱动开发( ...

最新文章

  1. Razor:从aspx到cshtml常见错误及正确书写方法
  2. [HNOI2009]无归岛
  3. 多线程编程:return、pthread_exit()、exit()函数区别
  4. Eclipse中tomcat更改部署路径 deply path
  5. Linux 磁盘分区 Fdisk
  6. AsyncTask的基础讲解
  7. 迪杰斯特拉算法(最短路径)
  8. thinkphp 获取客户端ip地址方法
  9. 流程图动画效果html,jQuery创意线条步骤流程图动画特效
  10. Luogu1514 引水入城
  11. calibre的使用技巧
  12. latex 首行不缩进,第二行开始缩进,悬挂缩进的LaTeX实现
  13. 网络安全实验:CCProxy缓冲区溢出攻击
  14. JetsonNano国产套件成功部署YoloV5手把手图解教程
  15. Ubuntu安装MySQL(RPM包安装)
  16. 5个文献免费下载神器
  17. 设置Vmware虚拟机自动调整窗口大小、自动调整分辨率/界面大小
  18. 高仿163网站广告弹出层(每天定时24小时弹出一次)
  19. 乐鑫esp8266学习rtos3.0笔记第5篇:基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架,支持esp8266和esp32!(附带链接)
  20. 2022年A特种设备相关管理(电梯)复训题库及答案

热门文章

  1. Const Correctness in C++
  2. 洛谷P1410 子序列【玄学DP】【绿】
  3. 解决yog连接mysql出现2058的问题
  4. 【vishwaCTF】misc题解wp
  5. 《花开半夏》--3 叶向荣(1)
  6. 从另外一个角度解释AUC
  7. 计算机网络代表着第几次革命,互联网是第几次信息革命
  8. Win10/Ubuntu20.04编译ros2_documentation-foxy过程
  9. 【问题总结】怎么确定多元隐函数谁是自变量谁是因变量?
  10. 正式赛1004 打猎的故事