ddd扬帆

news2024/11/25 14:27:35

简介

读取了一篇“产品代码都给你看了,可别再说不会DDD”较为清晰了解了:领域驱动设计,整洁架构和事件驱动架构的架构思想落地实践,特做记录读后感,可以直接跳到正文阅读原文


正文

以下正文...

构建自己的软件大厦

在我工作将近10年的那段时间,我开始总结自己先前所参加过的所有软件项目。虽然我一直工作于一家对代码质量很是讲究的软件公司,然而遗憾的是在我所参加过的项目中,没有一个是我满意的。我开始思索这里面的原因,总结下来至少有以下几点:

  • 软件项目通常都是团队项目,其中每个开发者的思路可能是不同的,导致后进者无法领会到前人的思路,在沟通不畅的情况下,软件架构可能很快腐化;
  • 多数软件项目受限于交付进度,很多时候为了按时上线不得不做出很多技术上的妥协,烂代码由此产生,日积月累,由量变到质变,以至于后来变成了一座无人敢改的“屎山”;
  • 项目中的成员经验不同,编程能力良莠不齐,项目管理者不可能让新人们学够了才开始贡献代码,于是不同水平的代码揉杂在一起;
  • 软件的需求千变万化,后进需求有可能导致软件架构的整体重构,但是这种整体重构往往是管理者们无法认可的,于是只在表面上修修补补,最终代码变成了“四不像”。

在一个逐利的商业化世界里,以上原因似乎都无可厚非,但是就个人而言,这样的软件完全不是我想要的。我希望绕开那些现实的甚至世俗的桎梏,像作家写书一样,开发出一套能让自己心仪的软件作品,构建出属于自己的软件大厦。于是,3年之后,我开发出了码如云(码如云 - 免费的一物一码管理平台(设备巡检,固定资产,物品标签,调查问卷等)),一个基于二维码的一物一码管理平台。

虽然码如云不是商业软件,但是却一直按照“可用的商业软件”的标准来完成开发,因为只有这样,我才能督促自己将其当做一件正儿八经的软件产品来对待,而不是一个“演示用的Demo系统”。

由于没有了前文提到的众多使软件变烂的因素的影响,我可以完全根据自己的计划决定什么时候做什么事情,特别是需要对既有代码进行修改的时候。算法实现不满意了,改;模型设计不满意了,改;有新需求需要添加,改。比如,在项目原本都快上线的最后2个月,我发现代码中的分组(Group)模型的设计过于简单——当时只允许创建单层分组,无法满足实际的业务场景。于是,我暂停了项目上线的筹备,花时间将分组模型从单层改为多层。由于分组概念贯穿于整个码如云的业务模型中,因此此次重构的影响范围非常大,但是由于项目代码一直保持着比较好的可扩展性,整个改造过程仅花了不到2周时间就完成了,并且全部是业余时间完成(事实上整个码如云的开发过程都是在业余时间完成的)。又比如,前端CSS编写方式一开始使用的是Vue.js的“Scoped CSS”方式,在项目都开始了将近1年左右的时候,我觉得这种方式不爽了,于是停下了所有的工作,又花时间将“Scoped CSS”改为了“CSS Module”的方式。

码如云全程采用了领域驱动设计,整洁架构和事件驱动架构的架构思想完成开发。

领域驱动设计(Domain Driven Design,DDD)的概念最早诞生于2004年左右,诞生之后并未大量普及,近年来随着微服务的兴起而重新进入人们的视野,发展到现在(2023年)依然炙手可热。在如今这场对DDD的追捧中,有肯定,有批评,有务实,有浮夸,一些针锋相对的争论甚至骂战依旧在各个微信群中不断上演。我在2013年便翻译了《实现领域驱动设计》一书,那时微服务的概念还没出来,DDD也基本上被束之高阁于少数软件架构师的范围内。当时,我在国外的某个论坛上看到这本书,然后找到了网上的免费试读章节,读完真是有种相见恨晚的感觉。下来我立即将该书推荐给了之前搞过DDD的同事张逸(后来《解构领域驱动设计》的作者),他居然花了大几百元从国外邮购了本书的英文原版,后来也是在他引荐下我得以与出版社合作翻译该书。

如今,行业里有种声音将DDD称为“玄学”,即把DDD当做是一门虚无缥缈不知所云的学问。事实上,DDD本身不是“玄学”,而是被不少人解读成了“玄学”,在他们心中,DDD作为一种高高在上的”哲学思想”而存在着,你要是将其与具体的编程语言或者技术框架稍微沾点边呢,他们都说你太低级,不配谈论DDD。作为典型的务实派,我是反对这种做法的。在我看来软件是很具体很实在的东西,与之相关的理论或者工具也应该具有同样的属性,DDD也不例外,搞DDD的终点应该是可以工作的软件代码,而不是天花乱坠的概念浮夸。我自认是能够清楚地认识DDD价值的人,在码如云的开发过程中,我成功地将DDD落地,我也希望向软件同行们证明:DDD能落地,DDD不玄乎,DDD很具体,DDD与编程强相关。为此,我也撰写了一系列DDD落地文章供同行们参考。

整洁架构(Clean Architecture)是我近年来一直推崇并实践的软件思想。在我看来,整洁架构DDD在很多方面都有共通之处,比如都强调对系统中不同组件之间的解耦,以及各组件之间边界的清晰性,在DDD中这被称为”技术复杂度和业务复杂度的分离“。在码如云代码中,虽然我并没有按照《架构整洁之道》书中所写那样追求完全的整洁架构目标,但是在结合了项目实际的情况后,我尽可能地实现了整洁架构,比如在核心的领域模型中,我做到了仅仅依赖于Spring框架的4个注解,除此之外不再对任何框架有任何依赖。此外,事件驱动架构(Event Driven Architecture,EDA)也是我特别关注的软件架构,其特别适合于系统组件之间的解耦以及关注点的分离。通常来说,软件系统有浅系统深系统之分。浅系统表示对业务用例的处理流程比较短;而深系统则表示对一个业务操作的处理可能导致一连串的后续动作,从而使得业务链条变长。对于深系统而言,如果将业务闭环中的所有操作都放在同一个业务用例中处理,那么系统中将出现大量的紧耦合,此时便可使用事件驱动架构将各个业务操作解耦开来。

无论是DDD,整洁架构,还是事件驱动架构,它们都只是工具而已,其目的都只有一个——做好软件。

曾经有人说,Github上多数的项目都死于前100次提交。我比较幸运,能从头到尾将这件事做成,前后1万多次提交,总共20多万行代码。我也还清楚地记得,在将码如云第一次搬上线的那个星期六的下午,没有咖啡,没有小酒,我只是长长的舒了一口气,暗暗为自己几年前许下的诺言做了个了结,然后像往常一样带女儿出去散步了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】C++11——可变参数模板和emplace

可变参数模板的定义方式可变参数模板的传值计算可变参数模板参数个数参数包展开方式递归展开参数包逗号表达式展开参数包 emplace插入 可变参数模板是C11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板。 在…

(a)Spring注解式开发,注册组件的@Repository,@Service,@Controller,@Component使用及说明

注解扫描原理 通过反射机制获取注解 Target(value {ElementType.TYPE})// 设置Component注解可以出现的位置,以上代表表示Component注解只能用在类和接口上 Retention(value RetentionPolicy.RUNTIME)// 设置Component注解的保持性策略,以上代表Comp…

社区团购美团和多多买菜小程序购物车

概述 微信小程序购物车列表demo 详细 需求 显示食物名称、价格、数量。 点击相应商品增加按钮,购买数量增加1,点击食物减少按钮,购买数量减一 显示购买总数和总金额 查看当前购买的商品 效果图(数据来自本地模拟) 目录结构 实现过程 主要wxml <view classfoods>…

工具篇 | H2数据库的使用和入门

引言 1.1 H2数据库概述 1.1.1 定义和特点 H2数据库是一款以 Java编写的轻量级关系型数据库。由于其小巧、灵活并且易于集成&#xff0c;H2经常被用作开发和测试环境中的便利数据库解决方案。除此之外&#xff0c;H2也适合作为生产环境中的嵌入式数据库。它不仅支持标准的SQL…

饮料生产线Modbus协议转换网关的应用介绍

在饮料生产线设备数据采集和控制系统中&#xff0c;MODBUS网关是一种非常重要的设备。它可以将不同设备之间的通讯协议转换为统一的MODBUS协议&#xff0c;从而实现数据采集和指令下达。在本文中&#xff0c;我们将介绍如何使用MODBUS网关采集饮料生产线设备数据并下达指令。 在…

知识库搭建保姆级教程,如何从0到1完成知识库搭建

在这个信息爆炸的时代&#xff0c;如何获取、整理和应用知识成为了我们个体价值和企业核心竞争力打造的重要表现&#xff0c;搭建一个高效的知识库可以提升我们企业的竞争力&#xff0c;必要时还能快速切换赛道&#xff0c;开展一个新的领域。 今天我们将结合HelpLook 来与你一…

基于C++实现的3D野外赛车驾驶游戏源码+项目文档+汇报PPT

项目介绍&#xff1a;本项目实现了一个户外场景下的赛车游戏&#xff0c;可以通过键盘控制赛车的移动&#xff0c;视角为第二人称视角。场景中有汽车&#xff0c;建筑&#xff0c;道路&#xff0c;天空等物体&#xff0c;拥有光照和阴影的效果。通过粒子系统模拟尾气效果&#…

Kubernetes组件和架构简介

目录 一.概念简介 1.含义&#xff1a; 2.主要功能&#xff1a; 3.相关概念&#xff1a; 二.组件和架构介绍 1.master&#xff1a;集群的控制平面&#xff0c;管理集群 2.node&#xff1a;集群的数据平面&#xff0c;为容器提供工作环境 3.kubernetes简单架构图解 一.概…

Windows迁移文件的快速方法

文章目录 1.简单比较2.传输方法介绍&#xff1a;有线&#xff08;直连网络&#xff09;3.传输方法介绍&#xff1a;无线热点传输4. 共享文件夹的设置5.挂载共享文件夹 1.简单比较 方法传输速度有线传输接近900Mb无线热点传输接近500MbU盘传输基本上不超过100Mb 2.传输方法介绍…

小程序-uniapp:URL Link / 适用于在移动端 从短信、邮件、微信外网页 等场景打开小程序任意页面

一、背景介绍 小程序URL Scheme、URL Link是微信小程序后台生成的一种地址&#xff0c;适用于从短信、邮件、微信外网页 等场景打开小程序任意页面。所以&#xff0c;适用性极强。可与微信扫码携带参数跳转到小程序指定页面技术互补 若在微信外打开&#xff0c;用户可以在浏览…

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…

2023-Chrome插件推荐

Chrome插件推荐 一键管理扩展 链接 https://chromewebstore.google.com/detail/lboblnfejcmcaplhnbkkfcienhlhpnni 介绍 一键开启、禁用Chrome插件。 Checker Plus for Gmail™ 链接 https://jasonsavard.com/zh-CN/Checker-Plus-for-Gmail https://chromewebstore.goo…

ElementUI之首页导航与左侧菜单

目录 一、Mock 1.1 什么是Mock.js 1.2 安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js使用 1.3.1 定义测试数据文件 1.3.2 mock拦截Ajax请求 1.3.3 界面代码优化 二、总线 2.1 定义 2.2 类型分类 2.3 前期准备 2.4 配置组件与路由关系 2.4.1 配置…

计算机毕业设计 基于微信小程序的校园商铺系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2023 “华为杯” 中国研究生数学建模竞赛(A题)深度剖析|数学建模完整代码+建模过程全解全析

华为杯数学建模A题 当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们一起看看研赛的A题呀&#xff01; …

络安全开发和音视频开发哪个方向更有前景?

网络安全开发和音视频开发哪个方向更有前景&#xff1f; 随着互联网和移动互联网的飞速发展&#xff0c;音视频应用已经成为人们日常生活和工作中不可或缺的一部分。 从视频会议、在线教育、直播、短视频到游戏&#xff0c;音视频技术的应用场景越来越广泛&#xff0c;市场需求…

面试必杀技:Jmeter性能测试攻略大全(第二弹)

1. JMeter介绍与安装 JMeter介绍 JMeter是Apache组织开发的基于Java的压力测试工具。具有开源免费、框架灵活、多平台支持等优势。除了压力测试外&#xff0c;JMeter也可以应用的接口测试上。JMeter下载、安装及启动 下载&#xff1a; 访问JMeter官网&#xff1a;https://j…

机器学习——seaborn实用画图方法简介

0、seaborn简介: 前言:下面的总结只是介绍seaborn有哪些方法和属性,至于具体使用,通过下面给出的名称稍作查找即可。重点应该关注本文介绍的seaborn的使用方法seaborn与机器学习的关系: 知识图谱 0.1、了解即可的知识: seaborn:在matplotlib的基础上画一些更好看的图,在…

快速排序与代码

快速排序&#xff08;Quicksort&#xff09;是一种常用的排序算法&#xff0c;它基于分治的思想。 时间复杂度&#xff1a;O&#xff08;nlogn&#xff09; 空间复杂度&#xff1a;O&#xff08;logn&#xff09; 快速排序的基本思想如下&#xff1a; 选择一个元素作为基准&a…

Android Jetpack组件架构 :LiveData的使用和原理

Android Jetpack组件架构&#xff1a; LiveDate的使用和原理 导言 继Lifecycle组件之后我们接下来要介绍的就是LiveDate组件&#xff0c;所谓LiveDate字面意思上就是有声明的数据&#xff0c;当数据有改动时该组件可以感知到这个操作并将该事件通知到其观察者&#xff0c;这样…