领域驱动设计实践精粹

AWS入门实践-如何在AWS云上创建一个内外网隔离的生产环境 在 AWS 上建立一个内外网分离的生产环境,可以减少应用服务的暴露面,有效的保证你的应用服务器的安全。通常我们会将web应用放在外网的子网内,数据库服务器等放在内网的子网。我们将按照下图来部署动手实践环境,实现在public subnet的EC2虚拟机可以直接通过互联网可以访问,在Private subnet的EC2虚拟机不能通过互联网直接访问,但是却可以在内部来访问互联网安装应用等等。 阅读详情

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

一、战略设计层

领域划分

领域划分是领域驱动设计的基石,它要求开发者深入理解业务,将系统分解为多个相互关联的领域。在实际操作中,可以通过以下步骤进行领域划分:

  1. 业务分析:通过访谈、问卷调查等方式收集业务需求,理解业务流程。
  2. 领域模型构建:根据业务需求,构建领域模型,包括实体、值对象、聚合、领域服务、领域事件等。
  3. 领域边界识别:识别不同领域之间的边界,确保领域内概念的一致性。
核心域/支撑域/通用域识别

在领域划分的基础上,进一步识别核心域、支撑域和通用域:

  • 核心域:核心域是业务价值的核心,通常包含复杂的业务逻辑和规则。例如,在电子商务系统中,核心域可能包括商品管理、订单管理、支付管理等。
  • 支撑域:支撑域为核心域提供辅助服务,如用户认证、数据存储、日志记录等。支撑域的设计应尽量通用,以便服务于多个核心域。
  • 通用域:通用域提供系统通用的功能,如日志记录、配置管理、缓存管理等。通用域的设计应遵循单一职责原则,避免功能过于复杂。
子域拆分原则

子域是领域中更为细分的业务模块。在拆分子域时,应遵循以下原则:

  • 单一职责原则:每个子域应只负责一项业务功能,避免功能过于复杂。
  • 聚合原则:子域内的对象应具有高内聚、低耦合的特点,确保子域内对象之间的协作关系清晰。
限界上下文边界定义

限界上下文是领域中的一个逻辑边界,它定义了领域中特定的业务规则和边界。在定义限界上下文边界时,可以采用以下方法:

  • Bounded Context Mapping:使用统一语言描述边界内的业务概念,确保团队成员对领域概念的理解一致。
  • Collaboration Mapping:定义与其他上下文的关系,如合作关系、客户-供应商等,确保不同上下文之间的协作顺畅。
统一语言

统一语言是领域专家、开发者和设计师共同使用的语言,用于描述领域的业务概念和规则。构建统一语言的方法包括:

  • Domain Dictionary:定义领域中的术语和概念,确保团队成员对术语的理解一致。
  • Model-Driven Development:使用模型来表示领域知识,提高开发效率。
跨团队语义对齐

跨团队语义对齐确保不同团队对领域概念的理解一致。对齐方法包括:

  • Collaboration Workshops:团队间的协作研讨会,共同讨论领域模型和业务规则。
  • Unified Modeling Language (UML):使用UML图来沟通,确保团队成员对模型的理解一致。
上下文映射模式

上下文映射模式包括:

  • Customer-Supplier Relationship:定义客户与供应商之间的交互,确保不同上下文之间的协作顺畅。
  • Partner Collaboration:定义合作伙伴之间的合作关系,确保不同上下文之间的协作顺畅。

二、战术设计层

基础构件
实体标识设计

实体标识用于唯一标识一个实体。在实际操作中,可以采用以下方法设计实体标识:

  • UUID:使用UUID作为实体标识,确保实体标识的唯一性。
  • Database Sequence:使用数据库序列生成实体标识,确保实体标识的连续性。
值对象不可变性实现

值对象是不可变的,一旦创建就不能被修改。在实际操作中,可以采用以下方法实现值对象的不可变性:

  • Immutable Class Design:设计不可变类,确保类的实例在创建后不能被修改。
聚合根一致性边界

聚合根是一组具有内聚性的对象,其行为由聚合根统一管理。一致性边界定义了聚合根的外部接口。在实际操作中,可以采用以下方法定义聚合根的一致性边界:

  • 定义聚合根的属性和方法:确保聚合根的属性和方法与业务逻辑相关。
  • 封装聚合根内部对象:确保聚合根内部对象对外不可见,避免外部对象直接访问内部对象。
服务架构
领域服务与应用服务区分

领域服务是业务逻辑的执行者,而应用服务是外部系统的接口。在实际操作中,可以采用以下方法区分领域服务与应用服务:

  • Business Logic vs. External Interface:明确业务逻辑与外部接口的界限,确保领域服务的独立性。
工厂模式应用场景

工厂模式用于创建复杂的对象。在DDD中,工厂模式可用于创建领域对象。在实际操作中,可以采用以下方法应用工厂模式:

  • 定义工厂接口:定义工厂接口,封装创建对象的过程。
  • 实现具体工厂类:根据具体需求实现具体工厂类,负责创建对象。
仓储接口设计(CQRS模式)

CQRS(Command Query Responsibility Segregation)模式将命令和查询分离。仓储接口设计包括:

  • Command Handling:处理业务命令,确保业务逻辑的正确执行。
  • Query Handling:处理查询请求,提供高效的数据查询服务。
事件驱动
领域事件建模

领域事件是业务状态发生变化的信号。在实际操作中,可以采用以下方法进行领域事件建模:

  • Event Sourcing:使用事件来持久化业务状态,确保业务状态的完整性和一致性。
事件溯源实现

事件溯源是一种数据存储策略,它使用事件流来重建业务状态。在实际操作中,可以采用以下方法实现事件溯源:

  • Event Stream Storage:存储事件流,确保事件流的完整性和一致性。
最终一致性策略

最终一致性策略确保系统在经历一定时间后达到一致性。在实际操作中,可以采用以下策略实现最终一致性:

  • Gossip Protocol:使用Gossip协议同步状态,确保系统状态的一致性。

三、规则体系

业务规则
前置条件验证

前置条件验证确保业务规则在执行前满足特定条件。在实际操作中,可以采用以下方法进行前置条件验证:

  • 定义前置条件:明确业务规则执行前需要满足的条件。
  • 验证前置条件:在业务规则执行前,验证前置条件是否满足。
不变式约束

不变式约束确保业务状态在变化时保持一致性。在实际操作中,可以采用以下方法实现不变式约束:

  • 定义不变式:明确业务状态变化时需要满足的不变式。
  • 检查不变式:在业务状态变化时,检查不变式是否满足。
规则引擎集成

规则引擎用于执行和监控业务规则。在实际操作中,可以采用以下方法集成规则引擎:

  • 定义规则:使用规则引擎提供的语言定义业务规则。
  • 执行规则:使用规则引擎执行业务规则,确保业务逻辑的正确执行。
流程规则
状态机设计

状态机用于表示业务流程中的状态转换。在实际操作中,可以采用以下方法设计状态机:

  • 定义状态:明确业务流程中的状态。
  • 定义转换:明确状态之间的转换条件。
工作流引擎对接

工作流引擎用于执行和监控业务流程。在实际操作中,可以采用以下方法对接工作流引擎:

  • 定义工作流:使用工作流引擎提供的语言定义业务流程。
  • 执行工作流:使用工作流引擎执行业务流程,确保业务流程的正确执行。
Saga事务补偿

Saga事务是一种分布式事务,用于补偿因网络或系统故障导致的事务失败。在实际操作中,可以采用以下方法实现Saga事务:

  • 定义补偿操作:明确事务失败时需要执行的补偿操作。
  • 执行补偿操作:在事务失败时,执行补偿操作,确保业务状态的一致性。

四、扩展实践

架构集成
六边形架构适配

六边形架构是一种设计模式,它将业务逻辑与外部系统隔离。在实际操作中,可以采用以下方法适配六边形架构:

  • 定义业务逻辑边界:明确业务逻辑的边界,确保业务逻辑与外部系统隔离。
  • 定义外部系统接口:定义外部系统接口,确保业务逻辑与外部系统交互。
事件风暴工作坊

事件风暴工作坊是一种协作会议,用于设计领域事件。在实际操作中,可以采用以下方法进行事件风暴工作坊:

  • 邀请相关团队成员:邀请相关团队成员参与事件风暴工作坊。
  • 讨论领域事件:共同讨论领域事件,明确领域事件的类型和触发条件。
微服务拆分模式

微服务拆分模式将大型系统拆分为多个独立的服务。在实际操作中,可以采用以下方法进行微服务拆分:

  • 识别业务边界:识别业务边界,将系统拆分为多个独立的服务。
  • 定义服务接口:定义服务接口,确保服务之间的协作。
效能工具
代码生成框架

代码生成框架用于自动生成代码,提高开发效率。在实际操作中,可以采用以下方法使用代码生成框架:

  • 定义代码模板:定义代码模板,确保生成的代码符合规范。
  • 生成代码:使用代码生成框架生成代码,提高开发效率。
契约测试工具

契约测试工具用于测试接口和组件的合同。在实际操作中,可以采用以下方法使用契约测试工具:

  • 定义契约:使用契约测试工具定义接口和组件的合同。
  • 执行测试:使用契约测试工具执行测试,确保接口和组件符合合同。
可视化建模平台

可视化建模平台用于创建和可视化领域模型。在实际操作中,可以采用以下方法使用可视化建模平台:

  • 创建领域模型:使用可视化建模平台创建领域模型。
  • 可视化模型:使用可视化建模平台可视化领域模型,提高团队沟通效率。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

- 💂 博客主页: Java程序员廖志伟
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号: SeniorRD

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

CentOS 7下kkFileView 4.4.0离线部署全攻略(含LibreOffice 7.5配置避坑指南) 本文详细介绍了在CentOS 7环境下离线部署kkFileView 4.4.0的全流程,包括LibreOffice 7.5的配置避坑指南、中文字体解决方案以及企业级运维实践。通过本指南,用户可以在内网环境中快速搭建稳定可靠的文档在线预览服务,提升办公效率。 阅读详情

相关推荐

机器人视觉实战:用OpenCV搞定手眼标定(附完整C++代码)

本文详细介绍了使用OpenCV实现机器人视觉中的手眼标定技术,包括核心算法、工业场景优化及完整C++代码示例。通过解析坐标系转换问题,提供从数据采集到标定验证的全流程解决方案,帮助开发者在复杂工业环境中实现高精度机械臂与视觉系统的协同作业。

weixin_29306571的博客 482

DDD实践核心:领域驱动设计精粹

限界上下文是领域模型在软件中的实际实现,它定义了领域模型的边界。限界上下文应与业务场景紧密相关,避免过度设计。业务场景识别:识别业务场景,将领域模型划分为多个限界上下文,每个上下文对应一个特定的业务场景。上下文边界设计:设计上下文边界,确保边界内的领域模型保持一致性,边界外则与外部系统解耦。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 979

深入解析EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置

本文深入解析了EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置,详细介绍了六种核心控制模式(如PPM、CSP、CSV、CST)的应用场景及实战技巧。通过EtherCAT和DS402协议的高效配合,实现工业自动化中伺服电机的精准控制,提升设备性能与稳定性。

h0i1j2k3l的博客 1175

领域驱动设计(DDD)实践精粹

数据一致性:确保限界上下文内部的数据是一致的。服务隔离:限界上下文之间应保持服务隔离,避免相互影响。技术栈一致性:限界上下文内部应使用相同的技术栈,以简化开发和维护。

JavaCodePro的博客 1048

Python爬虫实战:抓取天气数据并生成可视化图表(完整可复制代码)

工具/库核心作用选型理由requests发送HTTP请求,获取天气网页内容语法简单,上手快,支持Headers配置(反爬)解析HTML页面,提取目标天气数据无需懂复杂XPath,API直观,快速定位标签pandas数据清洗、整理(如日期/温度格式化)一键处理数据格式,与matplotlib无缝适配matplotlib生成可视化图表(折线图/饼图/柱状图)Python主流可视化库,定制性强,支持保存高清图生成随机User-Agent,应对反爬自动更新UA池,避免手动维护。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 910

【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)

ShaderGraph是Unity中的一个可视化工具,用于创建和编辑图形着色器。其意义在于简化编写复杂着色器的过程,减少对具体编程语言的依赖,使艺术家和设计师可以更方便地创建各种美术效果。使用ShaderGraph可以通过图形界面设置着色器属性,包括颜色、纹理、光照等,并在视窗预览中即时显示结果,从而快速迭代和调整着色器。使用ShaderGraph需要先安装Unity 2018.1或以上版本,并添加ShaderGraph插件。打开ShaderGraph面板后,可以通过拖放节点并连接它们来创建着色器。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4万+

领域驱动设计:软件核心复杂性应对之道_领域驱动设计入门正确姿势

刚工作那会儿就尝试学习过领域驱动设计ddd,由于姿势不正确(买了本Eric Evans的英文原版领域驱动设计 : 软件核心复杂性应对之道(英文版)),导致了果断弃坑。。最近复盘和总结过往的一些项目代码设计,隐约觉得ddd比较契合自己对于一些业务代码设计问题的思考,所以打算重新入坑。到今天为止,算是有点入坑的感觉了,所以简单总结下这次的入坑姿势(其实主要是自己看到的一些比较适合入门的学习资料分享一下...

weixin_39819283的博客 179

MathType公式使用技巧汇总——Mathtype怎么在word中编辑公式?论文中公式有哪技巧?有哪些注意事项?论文中的公式怎么写?

如果word中到公式编号(2-1)中间的符号如下图........ .......类似与省略号的,这是手动打的空格,公式和编号的位置都是手动敲空格操作的,这种就只是使用MathType写了公式而已,格式上还是很不方便的。**如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。而第二种,是公式里面带的括号符号,他是可以随着公式结构自适应变化的。这时需要将公式插入到一行文字的某处,

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 5万+

DDD该怎么学

2006年,国内的互联网才刚刚萌芽,人们甚至还不习惯网购,大多数在校生都在宿舍里刷魔兽世界副本。但企业软件开发却得到了蓬勃发展,各种公司和事业单位都纷纷进行信息化转型。然...

dotNET跨平台 714

15、基于最优传输的协作多视图聚类框架

本文提出了一种基于最优传输理论的协作多视图聚类框架,通过引入协作学习机制在不同视图间建立先验交互,以提升共识聚类的质量。框架包含两种新方法:协作共识投影方法(CoCP)和基于新表示的协作共识方法(CoCNR)。CoCP在全局空间中整合多视图信息并进行共识投影,而CoCNR则通过协作编码生成新的数据表示以实现更优聚类。方法利用熵正则化的Wasserstein距离与Wasserstein重心,有效捕捉数据分布间的几何结构,并通过聚合步骤获得统一模型。实验结果表明,所提方法在多个数据集上均优于现有方法,具有良好的

gpt4scribbler的博客 86

第一讲:halcon模板匹配捆绑测量矩形检测芯片针脚

使用halcon模板匹配捆绑测量矩形,检测位置发生变换的芯片针脚缺陷。

uiopmn1的博客 2995

温故知新——领域驱动设计

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「225」篇原创敬上大家好,我是Z哥。这两天正好有空,花了一下午的时间重新翻阅了一遍《领域驱动设计精粹》,结合最近一阵子的新项目开发,有了一些新的感受和理解。这就是所谓的“温故而知新”吧,在这里分享给大家。分享的这些点,大多是在践行「领域驱动设计(DDD)」时的关键点,有助于「DDD」的落地。...

Zachary的博客 198

YOLOv10改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

本文记录的是基于MobileNet V3的YOLOv10目标检测轻量化改进方法研究。的模型结构是通过得来的,其中的基础模块结合了的深度可分离卷积、的线性瓶颈和倒置残差结构以及MnasNet中基于挤压和激励的轻量级注意力模块,使模型在性能、效率和灵活性方面都具有显著的优势。本文在替换骨干网络中配置了原论文中的small和large2种模型,以满足不同的需求。

Limiiiing的博客 515

C#封神之路:从语言精粹到架构实战的深度进阶指南

在软件开发领域,掌握一门主流编程语言及其生态是构建核心竞争力的基础。C#作为.NET平台的主力语言,其强大的类型系统、高效的运行时和丰富的框架支持,使其在企业级应用、游戏开发和云原生服务中占据重要地位。理解编程语言的底层原理,如内存管理、并发模型和编译过程,是编写高性能、可维护代码的关键。这些技术价值最终体现在构建稳定、可扩展的系统架构上,满足现代应用对高并发、低延迟和快速迭代的需求。本文聚焦于C#高级特性和.NET平台实战,通过系统化的学习路径,帮助开发者深入掌握异步编程、LINQ、依赖注入等核心概念,并

weixin_34187862的博客 407

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

领域驱动设计精粹感想

刚开始接触《领域驱动设计精粹》是来自技术群的几名小伙伴都在大力推荐这本书,但是当时的我自己并没有很在意,只是觉得可能那几名小伙伴只是主观臆想那本书特别好罢了。不过,我在阅读公众号的技术文章与技术博客时,里面的文章都有谈及这本书。这一下激发我的好奇心,心想这是啥神书,为啥这么多推崇,于是就在网上选购了这本书。 《领域驱动设计精粹》刚开始接触时,阅读起来还是不很容易理解的,因为这本书是从国外翻译过来的,很多名词晦涩难懂,比如限界上下文,领域事件,子域,大泥球等等,还要很多图都是英文的,它们的...

小树苗的博客 2405

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

领域驱动设计精粹

领域核心实现细节:限界上下文应围绕领域核心业务逻辑,确保所有相关实体和值对象都在上下文内部。边界清晰实现细节:边界定义应明确界定哪些实体和值对象属于该上下文,避免上下文之间的交叉。

JavaCodePro的博客 1145

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

如何评价《领域驱动设计精粹》?为什么说它是拯救烂代码的“最后解药”?

十年前,Eric Evans 的《领域驱动设计》给出了答案,但 600 页的巨著劝退无数人……今天,我用 1 篇浓缩《领域驱动设计精粹》的实战解析,带你直击 DDD 最硬核的。PS:由于篇幅有限,笔记无法全部为大家展示出来,就以截图主要内容的形式让大家参考?第二章 运用限界上下文与通用语言进行战略设计。规则一:在聚合边界内保护业务规则不变性。第四章 运用上下文映射进行战略设计。运用限界上下文与通用语言进行战略设计。5.1应用场景-如何持续。2.优秀设计、糟糕设计和有效设计。

java_beautiful的博客 860

【领域驱动设计精粹-小结】

这是我画的的 DDD 思维导图,把领域驱动设计的核心内容梳理得清清楚楚!今天就用最接地气的方式,带大家快速过一遍 DDD 的精髓。希望这篇总结能帮你快速理解 DDD 的精髓。如果你还没试过 DDD,不妨从 Vaughn Vernon 的书开始,一步步实践起来!通过战略设计划清边界,战术设计搞定细节,再配合事件风暴、敏捷开发等工具,你也能轻松驾驭复杂业务系统!,让开发者和业务专家用同一种语言沟通,避免“你说你的,我写我的”尴尬局面。提到 DDD,必须认识。DDD 的核心目标是。

严文文 Chris 499

领域驱动设计(DDD):软件设计的精粹

DDD 是领域驱动设计(Domain-Driven Design)的缩写。它是一种软件设计方法,旨在帮助开发人员更好地理解和建模复杂的业务领域。DDD 的核心思想是将业务领域视为一个独立的系统,并使用领域模型来描述该系统。领域模型是业务领域的抽象表示,它描述了业务领域中的概念、关系和规则。领域模型是 DDD 的核心概念之一。它是业务领域的抽象表示,它描述了业务领域中的概念、关系和规则。领域模型可以用于软件设计,以帮助我们更好地理解业务领域,并建立满足需求的软件系统。

明飞的博客 1589

领域驱动设计精粹:从核心概念到微服务架构实战

领域驱动设计(DDD)作为一种应对软件复杂性的核心方法论,其本质是通过建立统一的业务语言和清晰的模型边界,将复杂的业务领域映射为可维护的软件系统。其核心原理围绕战略设计(如限界上下文划分)与战术设计(如聚合、实体、值对象)展开,旨在解决大型系统中业务逻辑分散、团队沟通成本高昂的根本痛点。在技术价值层面,DDD为构建高内聚、低耦合的微服务架构提供了坚实的理论基础,是实现服务自治和清晰边界的有效工具。特别是在微服务、云原生和事件驱动架构等现代技术场景中,DDD的聚合设计、领域事件等模式,成为保障系统可扩展性与一

weixin_30335353的博客 422

系统架构书单推荐(一)领域驱动设计与面向对象

想寻找 “到底什么是软件架构” 这一问题的答案,Mark Richards, Neal Ford 两位大师在该书中从自身视角对软件架构进行了定义说明,并详细描述的不同的应用架构风格及其多维度的指标分析。推荐理由:黑天鹅事件、《三体》中的射手和农场主假说......在混乱的表象之上,我们应该如何追本溯源、直达问题的本质,相信这本书能带给你一些醍醐灌顶的收获。:该书技术思想领域的开创性作品,归纳总结了技术的定义,详细解释了技术的进化机制,并且构建了一个完整的关于技术的理论体系。

系统工程实验室 1217
上一篇: ShardingSphere核心解析
下一篇: 领域驱动设计:深度解析与实践
Java廖志伟
博客等级 码龄2年 3609粉丝 1517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值