DDD实践精髓:战略与战术

DDD学习笔记与实战 简单点就是一种格式话术,通过这种话术来为各个定义好的领域增加定语,宾语甚至从句。比如:为了(员工考勤计算)的目的来设计(考勤)系统。实现这个系统需要有(员工的请假,员工的考勤)的功能。因为员工请假和考勤在业务上还可以进行划分,所以为了(员工请假)的目的来设计(请假)系统。实现这个系统需要有(创建请假单,修改请假单,审批,发布请假单)的功能。到此我们发现功能不可拆分,过度拆分会引起运维上的困难,所以我们认为员工请假。 阅读详情

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

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

Java程序员廖志伟

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

优快云

一、引言

领域驱动设计(DDD)是一种深度挖掘业务逻辑并以此为核心构建软件系统的方法论。它通过将业务逻辑与系统架构紧密结合,旨在提升软件的可维护性、可扩展性和业务价值。在当今复杂多变的业务环境中,DDD已成为软件开发领域的一种主流实践。

二、战略设计层

领域划分

领域划分是DDD的核心环节,它将业务逻辑划分为不同的领域。

  • 核心域/支撑域/通用域识别:核心域是业务逻辑最密集的部分,支撑域提供辅助服务,通用域是跨领域的通用服务。例如,在一个电子商务系统中,核心域可能是订单管理,支撑域可能是用户管理和库存管理,通用域可能是日志记录和消息队列。
  • 子域拆分原则:子域的拆分应基于业务逻辑的紧密相关性,保持高内聚、低耦合。例如,订单管理可以拆分为订单创建、订单修改、订单取消等子域。
  • 限界上下文边界定义:限界上下文是领域模型的边界,它定义了业务逻辑的有效范围。例如,在一个订单系统中,限界上下文可以是订单服务、库存服务、支付服务等。

统一语言

统一语言是DDD中的一项关键实践,它确保所有团队成员对领域模型有共同的理解。

  • 术语表构建方法:通过创建术语表来标准化领域内的术语,减少沟通成本。例如,可以建立核心域、支撑域和通用域的术语表,以及每个子域的术语表。
  • 跨团队语义对齐:通过研讨会和会议等方式,确保跨团队对领域模型的语义有统一的理解。例如,可以定期举行领域研讨会,邀请不同团队的技术专家共同讨论领域模型。
  • 上下文映射模式:根据业务关系,如合作关系、客户-供应商等,映射不同的上下文之间的关系。例如,可以将订单服务与库存服务映射为合作关系。

三、战术设计层

基础构件

基础构件是构建领域模型的基础。

  • 实体标识设计:使用UUID或数据库序列为实体提供唯一标识。例如,可以使用UUID生成库(如Java中的UUID类)生成实体的唯一标识。
  • 值对象不可变性实现:值对象一旦创建,其值不可改变,以确保数据的一致性。例如,可以使用不可变类(如Java中的final关键字)来实现值对象的不可变性。
  • 聚合根一致性边界:聚合根负责维护聚合内的一致性。例如,可以定义聚合根的方法,确保聚合内对象的一致性。

服务架构

服务架构是DDD中的一部分,它定义了如何将业务逻辑划分为服务。

  • 领域服务与应用服务区分:领域服务处理业务逻辑,应用服务处理外部请求。例如,可以定义领域服务接口,并实现具体的服务类。
  • 工厂模式应用场景:工厂模式用于创建复杂对象,如聚合根。例如,可以定义一个工厂类,根据参数创建不同的聚合根实例。
  • 仓储接口设计:仓储接口设计采用CQRS模式,将查询和命令分离。例如,可以定义一个查询接口和一个命令接口,分别处理查询和命令。

事件驱动

事件驱动是DDD中的一种架构风格,它强调事件作为业务状态变化的主要载体。

  • 领域事件建模:领域事件描述业务状态的变化。例如,可以定义一个订单创建事件,包含订单信息。
  • 事件溯源实现:事件溯源允许系统从事件流中重建状态。例如,可以存储事件日志,并按照时间顺序处理事件。
  • 最终一致性策略:确保系统在不同组件间达到最终的一致性。例如,可以使用事件总线将事件传递给不同的组件,并确保组件处理事件的一致性。

四、规则体系

业务规则

业务规则是领域模型的一部分,它们定义了业务逻辑。

  • 前置条件验证:确保执行业务操作前满足必要条件。例如,在创建订单前,需要验证用户是否已登录。
  • 不变式约束:定义领域对象的合法状态。例如,订单状态只能是创建、支付、发货、完成等。
  • 规则引擎集成:将业务规则与业务逻辑分离,提高可维护性。例如,可以使用规则引擎(如 Drools)来管理业务规则。

流程规则

流程规则定义了业务流程的执行。

  • 状态机设计:使用状态机来表示业务流程的状态转换。例如,可以使用状态机图来描述订单状态的变化。
  • 工作流引擎对接:与工作流引擎集成,实现复杂流程的管理。例如,可以使用工作流引擎(如 Activiti)来管理订单流程。
  • Saga事务补偿:处理长事务中可能出现的失败情况。例如,可以使用 Saga 事务来确保事务的完整性。

五、扩展实践

架构集成

  • 六边形架构适配:六边形架构提供了一种灵活的架构风格,适合DDD实践。例如,可以将领域服务、基础设施服务、外部系统等分别封装在六边形的各个角落。
  • 事件风暴工作坊:通过工作坊的方式,鼓励团队成员参与领域模型的设计。例如,可以组织事件风暴工作坊,让团队成员共同讨论领域模型和业务规则。
  • 微服务拆分模式:将领域模型拆分为微服务,提高系统的可扩展性。例如,可以将订单管理、库存管理、支付管理等拆分为独立的微服务。

效能工具

  • 代码生成框架:自动化生成代码,提高开发效率。例如,可以使用代码生成框架(如 MyBatis Generator)来生成数据库访问代码。
  • 契约测试工具:确保服务之间的契约得到遵守。例如,可以使用契约测试工具(如 WireMock)来模拟服务接口,并验证服务的响应。
  • 可视化建模平台:帮助团队成员更好地理解领域模型。例如,可以使用 UML 工具(如 Enterprise Architect)来绘制领域模型图。

六、总结

领域驱动设计(DDD)提供了一种深入理解业务领域并构建系统的方法论。通过战略设计层和战术设计层的实践,结合规则体系和扩展实践,DDD能够帮助开发团队构建出可维护、可扩展且具有业务价值的软件系统。在实施DDD时,需要根据具体的项目需求和团队情况,灵活运用DDD的原则和实践,以实现最佳的开发效果。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

DailyMart01:一起来玩DDD吧? 大家好呀,我是飘渺!截至目前,我已在公众号和知识星球上发布了多个系列文章,涵盖了SpringBoot老鸟系列、SpringCloud微服务系列、运维监控系列、分库分表系列和Kubernetes云原生系列。尽管每个系列的重点各有不同,它们都关注微服务架构的各个方面和技术要点。然而,随着时间的推移和技术版本的更新,一些曾推荐的技术组件和观点已经不再适用。 例如,Swagger接口管理工具已久未更新,S... 阅读详情

相关推荐

DDD实现领域驱动设计

ddd实现,有兴趣的同学可以看,一起研究交流,大家一起研究

实现DDD:一文讲清楚什么是DDD(领域驱动设计)

通过上述文章,我们把DDD的基本概念已经介绍完毕,后续我们将针对每个章节进行详细说明和实战举例。

wdj_yyds的博客 1043

实现领域驱动设计(DDD之父作序力荐 让DDD思想真正落地的首创巨著)

领域驱动设计(DDD)是教我们如何做好软件的,同时也是教我们如何更好地使用面向对象技术的。它为我们提供了设计软件的全新视角,同时也给开发者留下了一大难题:如何将领域驱动设计付诸实践?Vaughn Vernon 的这本《实现领域驱动设计》为我们给出了全面的解答。   《实现领域驱动设计》分别从战略和战术层面详尽地讨论了如何实现DDD,其中包含了大量的最佳实践、设计准则和对一些问题的折中性讨论。《实现领域驱动设计》共分为14 章,在DDD 战略部分,《实现领域驱动设计》向我们讲解了领域、限界上下文、上下文映射图和架构等内容,战术部分包括实体、值对象、领域服务、领域事件、聚合和资源库等内容。一个虚构的案例研究贯穿全书,这对于实例讲解DDD 实现来说非常有用。   《实现领域驱动设计》在DDD 的思想和实现之间建立起了一座桥梁,架构师和程序员均可阅读,同时也可以作为一本DDD 参考书。

长文多图一步步讲清楚:DDD理论、建模与代码实现全流程

本文第一提出并回答了六个问题,第二介绍了DDD相关基本概念,第三介绍了DDD分析七大步骤,第四介绍了代码分层结构,希望本文对大家有所帮助。欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习。

JAVA前线技术专栏 2078

优化QT QML中RTSP流播放延迟:海康摄像头实时监控实践

本文详细探讨了在QT QML中优化海康摄像头RTSP流播放延迟的实践方法。通过调整MediaPlayer缓冲策略、硬件加速、解码器优选等五大技巧,显著降低实时监控场景下的延迟问题。文章还提供了海康摄像头RTSP连接实战代码和避坑指南,帮助开发者快速实现高效流媒体播放。

weixin_28363123的博客 557

拯救者Y9000P 2022双系统实战:Ubuntu22.04分区优化与驱动避坑指南

本文提供联想拯救者Y9000P 2022款安装Ubuntu 22.04双系统的详细实战指南。重点讲解针对该机型的磁盘分区优化方案、NVIDIA显卡驱动安装避坑技巧,以及安装后的网络、时间同步等必备配置,帮助用户高效完成双系统部署并提升使用体验。

weixin_29208327的博客 425

领域驱动设计实践精要

限界上下文边界定义确保了领域模型在不同团队间的清晰性和一致性。统一语言:通过定义领域术语表,确保团队成员使用相同的术语来描述业务概念。可以使用自然语言处理(NLP)技术来识别和标准化术语。术语表构建方法:构建术语表可以通过领域专家会议、工作坊和迭代审查的方式进行。可以使用术语管理工具,如Terminology Server。跨团队语义对齐:通过定期的沟通和协作,如代码审查、跨团队会议和文档共享,确保团队成员对术语的理解一致。上下文映射模式:上下文映射模式包括服务映射、数据映射和接口映射。

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

YonSuite如何新增用户并分配角色角色授权图文教程

用友YonSuite产品基础教学

ct341688的博客 622

DDD-战略设计 vs 战术设计

战略设计和战术设计是**领域驱动设计(DDD)**中不可缺少的两个关键部分。它们共同作用,确保在复杂业务领域中,系统既具备高层次的架构规划,又能落实到细节的领域模型实现。两者相辅相成,缺一不可。

分享技术人生的学习笔记和过往心得,与志同道合者共同进步 1167

车企常用架构、通信设计、需求管理工具全汇总

车辆技术是个系统工程,比较大,需要多人协作。“协作”往往需要工具参与,才能保证协作过程的高效、有条不紊。 【文章系转载,出处见图片水印】 今天我们就来捋一捋汽车行业常用的架构、网络开发工具~ Preevision 大名鼎鼎的Preevision,来自大名鼎鼎的Vector。 个人觉得,它是Vector公司最牛逼、最神秘、最高高在上的产品,犹如空谷回响、千里传音,但是很少看到它真正落地。 它最引以为傲的,或许是在给客户做介绍的时候,说“我们甚至能够精确到每一根线束的长度”,但是反观.

MaveDiao的博客 3491

利用pytorch长短期记忆网络LSTM实现股票预测分析

长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。LSTM主要就是加入了三个门控:第一个开关遗忘门:负责控制继续保存长期状态c;第二个开关输入门:负责控制把即时状态输入到长期状态c;第三个开关输出门:负责控制是否把长期状态c作为当前的LSTM的输出。

优快云 精品推荐 1万+

DDD:领域驱动设计 - 驾驭复杂业务系统的架构艺术

DDD:领域驱动设计 - 驾驭复杂业务系统的架构艺术

weixin_46619605的博客 2375

36. 在 SAP Integration Suite 里打通入站 HTTP:iFlow 端点鉴权、角色授权与多节点 403 排障实战

本文探讨了SAP Cloud Integration中HTTP入站连接的认证与授权机制。在Cloud Foundry环境下,认证(证明身份)和授权(权限控制)需分开处理:认证可采用Basic、OAuth或mTLS等方式,授权则通过角色实现。文章详细解析了两种主流配置路径:基于IdP用户的Basic认证(需配置Role Collection)和基于OAuth Client/Service Instance的系统调用(通过Service Key管理权限)。特别指出ABAP系统在多节点环境下可能因cookie编码

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 322

DDD实践精髓:战略与战术设计

不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。接下来,我将为大家呈现正文内容。例如,在订单管理子域中,可以定义“订单创建”、“订单取消”和“订单发货”等事件。

AIHacksCash的博客 1076

SAP BTP ABAP RAP 开发对象命名规范与落地实践

摘要:SAP BTP ABAP开发中的命名规范实践 在企业级ABAP开发中,命名规范是提升交付效率的工程化手段。SAP推荐采用[/<namespace>/][<prefix>]_<object_name>_[<suffix>]的结构化命名框架,解决多对象、多团队的协同问题。关键实践包括:使用组织专属命名空间避免冲突;通过prefix区分同类型对象的不同语义(如UI_/API_);object_name体现业务语义而非技术细节;suffix表达次级差异。在具体对

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1437

微博scheme

微博scheme

qq_42278595的博客 320

DDD实践精髓解析

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

JavaCodePro的博客 731

深度学习工具包 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")

DDD技术实现精髓解析

不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。通过以上对DDD各层级的详细技术实现细节的补充,可以使文章更具专业性和技术深度,为开发者提供更全面的DDD知识体系。

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

从理论到实践:DDD落地挑战与解决方案综合分析

问题描述将一个庞大、复杂的业务领域分解为一组内聚、明确的限界上下文,是一项极具挑战性的任务。团队常常在“如何划线”上挣扎,导致划分出的上下文要么过大(依然是小泥球),要么过小(增加了不必要的集成复杂性),或者内聚性差。深度分析限界上下文是DDD的核心模式,它提供了一个明确的语言和模型边界。在这个边界内,特定的领域模型是统一且无歧义的 5。例如,“订单”这个概念,在“销售”上下文中可能关注价格和客户信息,而在“仓储”上下文中则更关注库存和配送状态 9。

qq_29328443的博客 1113

android 蓝牙通讯demo

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

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

限界上下文的定义需要确保模型的一致性和完整性。在实际操作中,可以使用领域模型图来展示限界上下文的边界,并使用边界标记来区分不同上下文。

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

领域驱动设计(DDD)实战精髓

限界上下文是DDD中的一个核心概念,它定义了领域模型在代码中的边界,确保代码的模块化和可维护性。技术实现细节:边界定义:使用代码模块、组件或服务来定义限界上下文的边界。接口定义:为限界上下文定义清晰的接口,确保外部系统可以通过接口与限界上下文交互。

MoneyHacksPro的博客 889

DDD本质论:从哲学到数学,再到工程实践的完整指南之实践篇

本文探讨了如何将DDD(领域驱动设计)理论通过Nop平台实现工程化落地。Nop平台基于可逆计算理论,将DDD战略与战术设计转化为"可逆计算+DSL图册+差量"的统一工程范式,使DDD从依赖经验转变为可编排、可验证的工程科学。平台通过模块化目录和DSL图册物理化限界上下文,提供统一的消息和RPC抽象实现跨上下文协作,并采用Xpl模板语言实现反腐层。六边形架构通过BizModel和XMeta模型派生描述式契约,保持领域模型纯洁性,并通过Delta机制非侵入式补充实现细节。Nop平台的最小化信

canonical的博客 1385
上一篇: 领域驱动设计核心解析
下一篇: Spring框架核心技术解析
Java廖志伟
博客等级 码龄2年 3609粉丝 1517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值