首页 > 其他分享 >个人对DDD(领域驱动设计)理解,以及对实际开发的优化

个人对DDD(领域驱动设计)理解,以及对实际开发的优化

时间:2023-06-15 15:36:17浏览次数:44  
标签:return 模型 LoginInfo 设计 驱动 优化 DDD

目录

DDD简单介绍

什么是DDD?w我们看看Wiki上怎么说

领域驱动设计(英语:Domain-driven design,缩写 DDD)是一种通过将实现连接到持续进化的模型[1]来满足复杂需求的软件开发方法。领域驱动设计的前提是:

  • 把项目的主要重点放在核心领域(core domain)和域逻辑
  • 把复杂的设计放在有界域(bounded context)的模型上
  • 发起一个创造性的合作之间的技术和域界专家以迭代地完善的概念模式,解决特定领域的问题

领域驱动设计是一种由域模型来驱动着系统设计的思想,不是通过存储数据词典(DB表字段、ES Mapper字段等等)来驱动系统设计。领域模型是对业务模型的抽象,DDD是把业务模型翻译成系统架构设计的一种方式。

个人理解

个人认为完全的遵循某一架构思想来实现一个大型项目是不可能的,正如你也不可能不使用任何架构思想来实现一个大型项目。实际上我们在开发中或多或少都可能已经使用到了DDD的设计思想,正如我们在学习的时候,老师在介绍MVC之前我们也许就已经会将代码结构按照一定的规则区分,等老师讲的时候才发现原来我们用的是MVC的设计思想。

DDD落地到具体开发的优化

根据定义不难发现DDD的核心是域模型。大白话就是相对于普通的模型,域模型还可以附带一些处理自身相关逻辑的方法,对比现实世界,一只鸟有属性(例如:体重,种类,翅膀宽度等等),但是鸟也有一些动作(例如:飞行,叫唤等等),因此这是很容易想象的。
那么在实际开发中,一个用户对象同样也存在属性(username,password,age...),但是也可以赋予它一些行为。下面举一个最常见的用户登陆的例子,大部分介绍DDD的也会举这个例子:

不使用域模型


  @Autowired
  private IUserService iUserService;
   
  // LoginInfo  是一个最普通的Java对象,包含表单上传的username和password的字段,以及一些getter和setter方法。
  @PostMapping("/login")
  public String login(LoginInfo loginInfo){
    // 相信大部分人都是这样处理的: 在 IUserService 中编写校验用户合法性的代码,然后返回校验结果最后返回一个Token给前端。实例代码简化处理。
    if (iUserService.checkUserEffect(loginInfo)){
      return "token";
    }
    return "fail";
  }

代码逻辑本身并无任何问题,也一目了然。但是随着项目的成长,登陆的同时可能需要做很多额外的操作,并且随着定义的Service的数量上升,往往也会出现不知道该去哪个Service找具体的方法的情况。那么看看域模型如何处理。

  // 于非域模型的最大区别是 LoginInfo 此时已经是一个模型,因此他除了包含属性之外还可以执行一些行为。
  @PostMapping("/login")
  public String login(LoginInfo loginInfo){
    if (loginInfo.doCheckEffect()){
      return "token";
    }
    return "fail";
  }

通过这样的方式,让系统更符合显示世界,也将方法正确的划分到类型。

总结

所有的开发思想只是思想而不是标准规范,应该尽量去思索其中适合自己,适合团队,适合公司,适合项目的部分。

标签:return,模型,LoginInfo,设计,驱动,优化,DDD
From: https://www.cnblogs.com/Scarlett-K/p/17482793.html

相关文章

  • 深入了解REST约束,优化你的web应用
    REST是RepresentationalStateTransfer的缩写,是RoyFielding于2000年提出的一种通过HTTP设计松散耦合应用程序的架构风格,其主要应用于Web服务的开发。REST不是强制性的,可以不遵守,但它提供了一种高级设计指南。架构约束REST定义了六种架构约束来构成Web服务。RESTfu......
  • JDBC驱动中的核心代码位置
    mysql-connector-java-5.1.36-src/src/com/mysql/jdbc/MysqlIO.java+getResultSetprotectedResultSetImplgetResultSet(StatementImplcallingStatement,longcolumnCount,intmaxRows,intresultSetType,intresultSetConcurrency,booleanstreamResult......
  • C++ 中 switch 的性能优化
    问题有这样一段代码,编译器会傻傻地做多次compare来找到对应分支吗?#include<stdio.h>#include<stdlib.h>intfunc(inti){return(long)(&i)+i+rand();}inttest(intflag){ inti=0; switch(flag){ case0: i+=func(i); break; case1: i+=f......
  • 【SQL 优化器技术系列】谓词推导
    Oracle2005年出了一个30多页的小册子,《QueryOptimizationinOracleDatabase10gRelease2》,介绍了常见的优化器技术。我是做SQL执行的,优化部分只了解皮毛,从没有系统学习过。本系列逐个学习和介绍,自我提升,也帮助他人。谓词推导(Transitivepredicategeneration)听上去高大上......
  • 【SQL 优化器技术系列】谓词下推和上拉
    Oracle2005年出了一个30多页的小册子,《QueryOptimizationinOracleDatabase10gRelease2》,介绍了常见的优化器技术。我是做SQL执行的,优化部分只了解皮毛,从没有系统学习过。本系列逐个学习和介绍,自我提升,也帮助他人。一个复杂query里可能包含多个视图和子查询(下称语句块......
  • 【SQL 优化器技术系列】 外连接消除
    Oracle2005年出了一个30多页的小册子,《QueryOptimizationinOracleDatabase10gRelease2》,介绍了常见的优化器技术。我是做SQL执行的,优化部分只了解皮毛,从没有系统学习过。本系列逐个学习和介绍,自我提升,也帮助他人。外连接消除就是将一个outerjoin转换成innerjoin。......
  • 测试驱动开发全功略
    {关键字}测试驱动开发/TestDrivenDevelopment/TDD测试用例/TestCase/TC设计/Design重构/Refactoring{TDD的目标}CleanCodeThatWorks这句话的含义是,事实上我们只做两件事情:让代码奏效(Work)和让代码洁净(Clean),前者是把事情做对,后者是把事情做好。想想看,其实我们平时所做的所有......
  • 优化算法——人工蜂群算法(ABC)
    一、人工蜂群算法的介绍  人工蜂群算法(ArtificialBeeColony,ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群......
  • GPU驱动和编程模型
    N卡cuda和nivdia驱动CUDA是一种并行计算平台和编程模型,用于在GPU上运行高性能计算应用程序。CUDA深度学习框架是建立在CUDA平台之上的深度学习框架,其中包括:TensorFlow:由Google开发的开源深度学习框架,支持CPU和GPU加速。TensorFlow使用CUDA作为其GPU加速后端,可以在NVIDIAGP......
  • Unity大场景优化
    在Unity中,你可以使用视距剔除(LOD)和对象池等技术来解决场景中远离摄像机的物体隐藏和性能优化的问题。视距剔除(LOD):视距剔除是一种根据摄像机与物体之间的距离,动态地调整物体的细节级别或替代模型的技术。这意味着当物体远离摄像机时,可以使用较低的细节模型替代它们,从而减少渲染......