当前位置: 首页 > article >正文

DDD 和 TDD

领域驱动设计(DDD)

DDD 是一种软件开发方法,强调通过与领域专家的密切合作来构建一个反映业务逻辑的模型。其核心思想是将业务逻辑和技术实现紧密结合,以便更好地解决复杂的业务问题。

 DDD 的关键概念:

1. 领域模型 :反映业务逻辑的抽象模型。

2. 实体 :具有唯一标识的对象。

3. 值对象 :没有唯一标识的对象,通常是不可变的。

4. 聚合 :一组相关对象的集合,由一个根实体控制。

5. 仓储(Repository) :用于持久化聚合的接口。

6. 服务 :封装业务逻辑的操作。

7. 界限上下文(Bounded Context) :定义模型适用的范围。

测试驱动开发(TDD)

TDD 是一种软件开发过程,强调在编写功能代码之前先编写测试代码。其目标是通过测试来驱动设计和开发,确保代码的正确性和可维护性。

 TDD 的步骤:

1. 编写测试 :在实现功能之前,编写一个失败的测试。

2. 实现功能 :编写最少的代码以通过测试。

3. 重构代码 :优化代码结构,同时确保测试通过。

结合 DDD 和 TDD

在实际开发中,可以结合 DDD 和 TDD 来提高软件质量:

1. 使用 DDD 进行领域建模 :通过与领域专家合作,构建一个准确的领域模型。

2. 使用 TDD 驱动开发 :在实现领域模型的同时,编写测试来验证模型的正确性。

3. 持续重构 :在开发过程中,不断重构代码以提高可读性和可维护性。

案例:

实现一个登录功能,我们可以结合领域驱动设计(DDD)和测试驱动开发(TDD)的原则来设计和实现。以下是一个简单的示例,展示如何在 Go 项目中实现登录功能。

领域模型设计

首先,我们定义一个用户实体和相关的领域服务。

package domaintype User struct {    ID       int64    Username string    Password string // 在实际应用中,密码应加密存储}type UserRepository interface {    FindByUsername(username string) (*User, error)}type UserService struct {    repo UserRepository}func NewUserService(repo UserRepository) *UserService {return &UserService{repo: repo}}func (s *UserService) Login(username, password string) (bool, error) {    user, err := s.repo.FindByUsername(username)if err != nil {return false, err    }if user.Password != password {return false, nil    }return true, nil}

 测试驱动开发

接下来,我们为登录功能编写测试。

package domainimport ("testing""github.com/stretchr/testify/assert")type MockUserRepository struct {    users map[string]*User}func (m *MockUserRepository) FindByUsername(username string) (*User, error) {if user, exists := m.users[username]; exists {return user, nil    }return nil, nil}func TestUserService_Login(t *testing.T) {    repo := &MockUserRepository{        users: map[string]*User{"testuser": {ID: 1, Username: "testuser", Password: "password123"},        },    }    service := NewUserService(repo)    success, err := service.Login("testuser", "password123")    assert.NoError(t, err)    assert.True(t, success)    success, err = service.Login("testuser", "wrongpassword")    assert.NoError(t, err)    assert.False(t, success)    success, err = service.Login("nonexistent", "password123")    assert.NoError(t, err)    assert.False(t, success)}

应用层实现

最后,我们在应用层实现登录功能的接口。

package controllerimport ("net/http""github.com/gin-gonic/gin""your_project/internal/domain")type AuthController struct {    userService *domain.UserService}func NewAuthController(userService *domain.UserService) *AuthController {return &AuthController{userService: userService}}func (c *AuthController) Login(ctx *gin.Context) {var req struct {Username string `json:"username" binding:"required"`Password string `json:"password" binding:"required"`    }if err := ctx.ShouldBindJSON(&req); err != nil {        ctx.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})return    }    success, err := c.userService.Login(req.Username, req.Password)if err != nil || !success {        ctx.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid credentials"})return    }    ctx.JSON(http.StatusOK, gin.H{"message": "Login successful"})}

- 领域模型 :定义了用户实体和登录服务。

- 测试 :使用 testify 库编写单元测试,验证登录逻辑。

- 应用层 :使用 gin 框架实现 HTTP 接口,处理登录请求。​

相关文章:

DDD 和 TDD

领域驱动设计(DDD) DDD 是一种软件开发方法,强调通过与领域专家的密切合作来构建一个反映业务逻辑的模型。其核心思想是将业务逻辑和技术实现紧密结合,以便更好地解决复杂的业务问题。 DDD 的关键概念: 1. 领域模型 …...

LangChain概述

文章目录 为什么需要LangChainLLM应用开发的最后1公里LangChain的2个关键词LangChain的3个场景LangChain的6大模块 为什么需要LangChain 首先想象一个开发者在构建一个LLM应用时的常见场景。当你开始构建一个新项目时,你可能会遇到许多API接口、数据格式和工具。对于…...

Java基于SSM框架的互助学习平台小程序【附源码、文档】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…...

lightweight-charts-python 包 更新 lightweight-charts.js 的方法

lightweight-charts-python 是 lightweight-charts.js 的 python 包装,非常好用 lightweight-charts 更新比较频繁,导致 lightweight-charts-python 内置的 lightweight-charts 经常不是最新的。 新的 lightweight-charts 通常可以获得性能改进和bug修复…...

React第二十七章(Suspense)

Suspense Suspense 是一种异步渲染机制,其核心理念是在组件加载或数据获取过程中,先展示一个占位符(loading state),从而实现更自然流畅的用户界面更新体验。 应用场景 异步组件加载:通过代码分包实现组件…...

C# Dynamic关键字

一、引言:开启动态编程之门 在 C# 的编程世界里,长久以来我们习惯了静态类型语言带来的严谨与稳定。在传统的 C# 编程中,变量的类型在编译时就已经确定,这就像是给每个变量贴上了一个固定的标签,在整个代码执行过程中…...

大一计算机的自学总结:位运算的应用及位图

前言 不仅异或运算有很多骚操作,位运算本身也有很多骚操作。(尤其后几个题,太逆天了) 一、2 的幂 class Solution { public:bool isPowerOfTwo(int n) {return n>0&&n(n&-n);} }; 根据二进制表示数的原理&#…...

解决报错“The layer xxx has never been called and thus has no defined input shape”

解决报错“The layer xxx has never been called and thus has no defined input shape”(这里写自定义目录标题) 报错显示 最近在跑yolo的代码时遇到这样一个错误,显示“the layer {self.name} has never been called”.这个程序闲置了很久,每次一遇到…...

【AI论文】FilmAgent: 一个用于虚拟3D空间中端到端电影制作自动化的多智能体框架

摘要:虚拟电影制作涉及复杂的决策过程,包括剧本编写、虚拟摄影以及演员的精确定位和动作设计。受近期基于语言智能体社会的自动化决策领域进展的启发,本文提出了FilmAgent,这是一个新颖的、基于大型语言模型(LLM&#…...

hive:数据导入,数据导出,加载数据到Hive,复制表结构

hive不建议用insert,因为Hive是建立在Hadoop之上的数据仓库工具,主要用于批处理和大数据分析,而不是为OLTP(在线事务处理)操作设计的。INSERT操作会非常慢 数据导入 命令行界面:建一个文件 查询数据>>复制>>粘贴到新…...

VUE之路由Props、replace、编程式路由导航、重定向

目录 1、路由_props的配置 2、路由_replaces属性 3、编程式路由导航 4、路由重定向 1、路由_props的配置 1)第一种写法,将路由收到的所有params参数作为props传给路由组件 只能适用于params参数 // 创建一个路由器,并暴露出去// 第一步…...

虹科分享 | 汽车NVH小课堂之听音辨故障

随着车主开始关注汽车抖动异响问题,如何根据故障现象快速诊断异响来源,成了汽修人的必修课。 一个比较常用的方法就是靠“听”——“听音辨故障”。那今天,虹科Pico也整理了几个不同类型的异响声音,一起来听听看你能答对几个吧 汽…...

Transfoemr的解码器(Decoder)与分词技术

在自然语言处理(NLP)领域,解码器(Decoder)和分词技术是两个至关重要的概念。解码器是序列生成任务的核心组件,而分词则是将文本数据转换为可处理形式的基础步骤。 一、解码器(Decoder&…...

Django-Admin WebView 集成项目技术规范文档 v2.1

Django-Admin WebView 集成项目技术规范文档 v2.1 系统架构规范 1.1 技术栈要求 前端框架:Flutter: 3.27.1 (空安全版本)Dart: 3.3.1 (支持元编程)webview_flutter: ^4.10.0 (带Hybrid Composition支持)后端要求:Django: 4.2.x LTS (安全支持至2026)Python: 3.11.x (启用PEP …...

【开源免费】基于Vue和SpringBoot的社区智慧养老监护管理平台(附论文)

本文项目编号 T 163 ,文末自助获取源码 \color{red}{T163,文末自助获取源码} T163,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

作業系統:設計與實現-母本

2023 南京大學《作業系統:設計與實現》 課程主頁(含講義):https://jyywiki.cn/OS/2023/ 【Python 实现操作系统模型 [南京大学2023操作系统-P4] (蒋炎岩)-哔哩哔哩】 https://b23.tv/jakxDbh 用Python实现操作系统模型讲义 一、操作系统基础概念 1.1 定义 操作系统(Oper…...

excel如何查找一个表的数据在另外一个表是否存在

比如“Sheet1”有“张三”、“李四”“王五”三个人的数据,“Sheet2”只有“张三”、“李四”的数据。我们通过修改“Sheet1”的“民族”或者其他空的列,修改为“Sheet2”的某一列。这样修改后筛选这个修改的列为空的或者为出错的,就能找到两…...

当AI学会“顿悟”:DeepSeek-R1如何用强化学习突破推理边界?

开篇:一场AI的“青春期叛逆” 你有没有想过,AI模型在学会“推理”之前,可能也经历过一段“中二时期”?比如,解题时乱写一通、语言混搭、答案藏在火星文里……最近,一支名为DeepSeek-AI的团队,就…...

(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计

源码 论文 下载地址: ​​​​c​​​​​​c基于JAVA的网络通讯系统设计与实现(源码系统论文)https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…...

Deepseek的api调用报错乱码问题

最近的deepseek也是很火,但是在调用api的过程中也会出现一些大大小小的问题,所以这里也给出一种问题和他的解决方案,报错的类型如下图所示 API Streaming Failed Command failed with exit code 1: powershell (Get-CimInstance -ClassName W…...

STM32调试手段:重定向printf串口

引言 C语言中经常使用printf来输出调试信息,打印到屏幕。由于在单片机中没有屏幕,但是我们可以重定向printf,把数据打印到串口,从而在电脑端接收调试信息。这是除了debug外,另外一个非常有效的调试手段。 一、什么是pr…...

如何在本地部署deepseek r1模型?

DeepSeek(深度求索)正式发布了其最新推理模型DeepSeek-R1,引发业界广泛关注。这款模型不仅在性能上与OpenAI的GPT-4相媲美,更以其开源策略和创新的训练方法,为AI发展带来了新的可能性。DeepSeek-R1 在后训练阶段大规模…...

【MySQL】悲观锁和乐观锁的原理和应用场景

悲观锁和乐观锁,并不是 MySQL 或者数据库中独有的概念,而是并发编程的基本概念。 主要区别在于,操作共享数据时,“悲观锁”认为数据出现冲突的可能性更大,而“乐观锁”则是认为大部分情况不会出现冲突,进而…...

基于Flask的哔哩哔哩评论数据可视化分析系统的设计与实现

【Flask】基于Flask的哔哩哔哩评论数据可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统可以搜索查看作者、播放量、评论等相关信息,并将相关的分析…...

2218. 从栈中取出 K 个硬币的最大面值和

2218. 从栈中取出 K 个硬币的最大面值和 题目链接&#xff1a;2218. 从栈中取出 K 个硬币的最大面值和 代码如下&#xff1a; class Solution { public:int maxValueOfCoins(vector<vector<int>>& piles, int k) {vector<vector<int>> memo(pile…...

MySQL 用户相关的操作详解

MySQL 5.x 用户操作 创建用户 在 MySQL 5.x 中&#xff0c;使用 GRANT 语句创建用户并授权&#xff1a; 语法 GRANT ALL PRIVILEGES ON *.* TO usernamehost IDENTIFIED BY password;username&#xff1a;用户名 host&#xff1a;指定用户可访问的主机&#xff0c;例如 loca…...

YOLO目标检测4

一. 参考资料 《YOLO目标检测》 by 杨建华博士 本篇文章的主要内容来自于这本书&#xff0c;只是作为学习记录进行分享。 二. 环境搭建 (1) ubuntu20.04 anaconda安装方法 (2) 搭建yolo训练环境 # 首先&#xff0c;我们建议使用Anaconda来创建一个conda的虚拟环境 conda cre…...

​ONES 春节假期服务通知

ONES 春节假期服务通知 灵蛇贺岁&#xff0c;瑞气盈门。感谢大家一直以来对 ONES 的认可与支持&#xff0c;祝您春节快乐&#xff01; 「2025年1月28日 &#xff5e; 2025年2月4日」春节假期期间&#xff0c;我们的值班人员将为您提供如下服务 &#xff1a; 紧急问题 若有紧急问…...

DeepSeek异军突起,重塑AI格局

DeepSeek异军突起&#xff0c;重塑AI格局这两天AI 圈发生了比过年更令人兴奋的事情&#xff0c;“Meta内部反水事件”、“黄仁勋的底盘问题”&#xff0c;以及AI格局的大动荡&#xff0c;一切都是因为那个叫DeepSeek的“中国自主AI”&#xff01;它由幻方量化开发&#xff0c;以…...

Redis部署方式全解析:优缺点大对比

Redis部署方式全解析&#xff1a;优缺点大对比 一、引言 Redis作为一款高性能的内存数据库&#xff0c;在分布式系统、缓存、消息队列等众多场景中都有着广泛的应用。选择合适的Redis部署方式&#xff0c;对于系统的性能、可用性、可扩展性以及成本等方面都有着至关重要的影响…...