领域驱动设计(DDD)实践指南

领域驱动设计(DDD)与Spring Boot JPA实践指南 DDD的基本概念和理念:解释了什么是领域驱动设计,以及它的核心理念,如以领域为中心、统一语言、协作设计等。 DDD的核心概念详解: 战略设计:界限上下文、上下文映射 战术设计:实体、值对象、聚合、领域服务、领域事件、仓储等 Spring Boot和JPA实现DDD的完整流程: 识别界限上下文 构建领域模型(包含完整的Java代码示例) 定义应用服务 创建REST控制器 处理领域事件 项目结构组织 DDD的优缺点分析: 优点:更好反映业务需求、提高代码可维护性、适应业务变化等 缺点:学习曲线陡峭、前 阅读详情

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

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

Java程序员廖志伟

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

优快云

【一、战略设计层】

  1. 领域划分

在领域划分过程中,可以采用Bounded Context(限界上下文)的概念,将系统分解为多个相互独立的业务单元。每个Bounded Context都拥有自己的领域模型、语言和数据库,确保业务逻辑的独立性和可维护性。例如,在电商系统中,可以将订单管理、商品管理和用户管理划分为不同的Bounded Context。

核心域通常涉及系统的核心业务逻辑,如订单处理、库存管理等。支撑域则提供通用功能,如用户认证、支付系统等。通用域则包括日志、缓存等跨领域的基础服务。

  1. 子域拆分原则

在子域拆分时,应遵循以下原则:

  • 单一职责原则:每个子域应只关注一个特定的业务功能,避免职责过重。
  • 高内聚、低耦合:子域之间应保持低耦合,便于独立开发和维护。
  • 领域知识一致性:子域内的术语和概念应保持一致,避免混淆。

例如,在订单管理子域中,可以根据订单类型、订单状态等维度进行进一步拆分,形成订单创建、订单支付、订单取消等子域。

  1. 限界上下文边界定义

限界上下文边界的定义应考虑以下因素:

  • 业务边界:识别业务规则和流程的变更点,作为边界。
  • 数据边界:数据模型和数据存储的变更点,作为边界。
  • 代码边界:代码库和模块的变更点,作为边界。

例如,在电商系统中,订单管理系统可以作为一个独立的限界上下文,其边界包括订单实体、订单服务、订单仓储等。

  1. 术语表构建方法

术语表的构建方法包括:

  • 业务分析:通过业务需求文档、用户访谈等方式,收集领域术语。
  • 专家访谈:与业务专家沟通,获取领域知识的深度理解。
  • 文档审查:分析业务文档、技术文档等,提取领域术语。

为确保术语的一致性,可以采用以下方法:

  • 术语定义:对每个术语进行明确定义,避免歧义。
  • 术语审查:定期审查术语表,更新和维护术语。
  1. 上下文映射模式

上下文映射模式主要包括以下类型:

  • 聚合根映射:将聚合根从源上下文映射到目标上下文。
  • 值对象映射:将值对象从源上下文映射到目标上下文。
  • 服务映射:将领域服务从源上下文映射到目标上下文。

例如,在订单管理上下文中,可以将订单实体的聚合根映射到库存管理上下文中,实现跨上下文的数据共享和业务协作。

【二、战术设计层】

  1. 基础构件

基础构件的设计包括以下方面:

  • 实体标识设计:采用UUID或数据库序列作为实体标识,保证唯一性。
  • 值对象不可变性实现:使用不可变对象来表示数据,避免数据不一致的问题。
  1. 服务架构

服务架构的设计包括以下方面:

  • 领域服务与应用服务区分:领域服务负责业务逻辑处理,应用服务负责应用层面逻辑处理。
  • 工厂模式应用场景:在创建复杂对象时,使用工厂模式简化对象创建过程。
  1. 仓储接口设计(CQRS模式)

CQRS模式的设计包括以下方面:

  • 仓储接口设计:定义仓储接口,隔离数据访问逻辑。
  • CQRS模式实现:实现命令和查询的分离,分别处理。
  1. 事件驱动

事件驱动的实现包括以下方面:

  • 领域事件建模:定义领域事件及其关系。
  • 事件溯源实现:通过事件追踪领域状态的变化。
  • 最终一致性策略:确保系统状态最终一致。

【三、规则体系】

  1. 业务规则

业务规则的设计包括以下方面:

  • 前置条件验证:在执行业务逻辑之前,验证前置条件是否满足。
  • 不变式约束:定义实体或值对象的状态不变性约束。
  • 规则引擎集成:将业务规则集成到系统中,以便动态调整。
  1. 流程规则

流程规则的设计包括以下方面:

  • 状态机设计:使用状态机描述业务流程的状态转换。
  • 工作流引擎对接:将业务流程与工作流引擎集成,实现自动化流程执行。
  • 补偿事务:在分布式系统中,使用补偿事务确保业务一致性。

【四、扩展实践】

  1. 架构集成

架构集成包括以下方面:

  • 六边形架构适配:将六边形架构与DDD结合,实现松耦合和可扩展性。
  • 事件风暴工作坊:通过工作坊促进团队成员对领域模型的理解和共识。
  • 微服务拆分模式:将领域拆分为微服务,提高系统可伸缩性和可维护性。
  1. 效能工具

效能工具包括以下方面:

  • 代码生成框架:自动生成代码,减少手动编码工作量。
  • 契约测试工具:确保接口和组件之间的交互符合预期。
  • 可视化建模平台:提供图形化工具,帮助团队可视化领域模型和架构。

通过以上对DDD战略设计层、战术设计层、规则体系和扩展实践的详细描述,我们可以看到DDD是一个系统性、层次化的设计方法,它通过将业务逻辑封装在领域模型中,提高了系统的可维护性和可扩展性。在实际应用中,需要根据具体业务场景和需求,灵活运用DDD的相关知识点,以达到最佳的设计效果。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

领域驱动设计(DDD)详解:从理论到实践的系统化指南 领域驱动设计(Domain-Driven Design,DDD)是一种以业务为核心的设计方法论,旨在解决复杂业务场景下的软件架构难题。本文通过核心概念解析、实战案例拆解及分层架构设计,帮助开发者从零掌握DDD的核心思想与落地技巧。 阅读详情

相关推荐

计算机网络实验——入侵检测系统实验

在图1所示的网络结构中,此方案的具体实施:在路由器Router1的接口1出方向配置入侵检测策略,在收到ICMP ECHO请求包时,丢弃并同步向日志服务器报告警告,此时,终端PC2和PC3无法对终端PC0和PC1执行ping操作,并且日志服务器将记录相应的警告信息;在实验一的基础上,添加扩展分组过滤器,指定需要进行检测的信息流的类别,将扩展分组和对应的入侵检测规则进行绑定,使得只对特定的信息流进行入侵检测。加载指定类别的特征库,这里的指定类别是 ios_ips 类别中的 basic 子类别。

放放的博客 1563

深入理解领域驱动设计(DDD)——从概念到实践的完整指南

领域驱动设计(DDD)是由Eric Evans在其同名著作中提出的一种方法论,主要解决的是如何在复杂业务领域中通过高效的建模来帮助开发团队理解业务,进而设计出高质量的系统。DDD强调以业务为导向,通过领域模型来驱动开发,而不是简单的技术架构或数据库设计。// 聚合根// 获取聚合根的唯一标识// 保证一致性的业务逻辑在上面的代码中,Order是聚合根,OrderItem是聚合的一部分。外部系统通过Order来访问和操作OrderItem,而不能直接操作OrderItem。

一碗黄焖鸡三碗米饭的博客 1796

数分实战(01):Global_Superstore数据集解析与商业洞察

本文以Global_Superstore零售数据集为例,手把手指导数据分析实战全流程。从数据清洗、探索性分析到深度商业洞察,详细解析了如何通过Python处理缺失值与异常值,进行销售利润分析、客户细分与地理分析,并探讨了折扣与利润的微妙关系。文章旨在帮助读者建立数据分析思维框架,从数据中挖掘可指导实际业务决策的核心洞察。

weixin_28487433的博客 343

Laravel 12 中实践领域驱动设计(DDD)的完整指南

本文介绍了如何在Laravel 12中实践领域驱动设计(DDD),构建可维护且业务专注的应用程序。主要内容包括: 项目结构规划 采用分层架构:Domain(核心业务)、Application(用例协调)、Infrastructure(技术实现)和UI(用户界面) 包含聚合根、实体、值对象等核心DDD组件 关键实现步骤 配置项目自动加载路径 创建领域模型(如Order聚合根)和值对象(如Money) 定义仓储接口并实现基础设施层(如EloquentOrderRepository) 代码示例 展示了Order聚

深山技术宅的博客 1876

【斯坦福计网CS144项目】环境配置 & Lab0: ByteStream

前言 感觉学了不少 C++ 编程的知识和技术但比较缺少实践,于是打算找一些项目跟着做一做。 首先安利一个自学网站 CS自学指南,北大的同学做的,汇总了很多国内外高校 CS 相关的高质量公开课,其中大部分是有课程项目的。翻了翻感觉 Stanford 的这门 CS144 计网课的 Lab 比较有趣,难度也不错,就是它了! 课程网址:CS 144: Introduction to Computer Networking 我跟的是 2021 Fall 学期的版本。 准备工作 在上面的网站中先把 8 个实验的文档(

アルタイル 8165

OpenMMLab实战指南:从环境搭建到首个检测模型运行

本文是一份详细的OpenMMLab实战指南,重点介绍了如何从零开始搭建环境并运行首个目标检测模型。内容涵盖Miniconda环境配置、PyTorch与CUDA版本匹配、使用MIM工具安装MMCV和MMDetection的核心步骤,并通过RTMDet-tiny模型演示了完整的推理流程,帮助开发者高效入门这一计算机视觉开源算法体系。

weixin_28678151的博客 159

在PHP中实践领域驱动设计(DDD)的完整指南,融合最佳实践和实战经验

本文介绍了在PHP中实践领域驱动设计(DDD)的核心方法。主要内容包括:1)分层架构的领域层、值对象和应用服务层实现;2)关键实践策略如聚合设计原则、仓储模式实现和领域事件驱动;3)现代架构模式集成如CQRS和事件溯源;4)项目结构组织示例。文章通过代码片段展示了如何构建符合DDD原则的PHP应用,强调业务逻辑封装、领域对象职责划分以及基础设施与领域层的解耦。这些实践有助于构建可维护、高内聚的PHP应用程序。

深山技术宅的博客 1042

《C#零基础入门之百识百例》(七十一)委托介绍 -- 战士升级示例

委托的存在是因为,我们有时候需要将一个函数作为另一个函数的参数,这时就要用的委托(Delegate)机制。委托用关键字`delegate`声明,他实际上定义了一种“函数类型”,明确规定了函数参数类型和返回值类型。

陈言必行 -- Unity游戏开发领域优质博主 2111

《实现领域驱动设计》——DDD理念落地的实践指南

《实现领域驱动设计》——DDD理念落地的实践指南 去发现同类优质开源项目:https://gitcode.com/ 《实现领域驱动设计》是一本书籍资源,专为希望深入了解并应用领域驱动设计(DDD)的软件开发者、架构师而作。本书由Vaughn Vernon撰写,并由DDD之父Eric Evans作序力荐,是帮助开发者真正理解和实施DDD思想的权威指南。 内容概述 本书分为两个主要部分——战略层面和战...

gitblog_06731的博客 934

上海计算机学会2020年5月月赛C++乙组T2经济普查

中国正在以前所未有的力度推进脱贫攻坚,国家计划在2020年使得在现行标准下的贫困人口实现全面脱贫,为此,需要对居民的经济状况进行普查。 题目描述 给定一个正整数n,表示人口数量。一开始,每个居民拥有的财产记为a1​,a2​,⋯,an​,财产可能发生两种变化: 一种来源于个体,由某个居民的经济活动而产生。在某个时刻,某个居民的财产会直接变成某个数值,可能升高也可能降低。 一种来源于政策,在某个时刻,国家会对财产低于某个标准线全部的居民,实施政策支持,使得他们的财产全部正好到达标准线。 给定这些变

长春高老师编程 911

智能手表 BOM 表与版本管理记录

试产与量产阶段 智能手表 BOM 表与版本管理记录

hoony123的博客 1053

DDD领域驱动设计:从理论到实践的核心指南

领域驱动设计(DDD)是一种应对复杂业务系统的软件设计方法论,其核心在于通过通用语言和领域模型实现业务与技术的对齐。从技术原理看,DDD通过战略设计(限界上下文划分)和战术设计(聚合根、领域服务等模式)构建高内聚、低耦合的系统架构。在工程实践中,这种模式特别适合电商、金融等业务逻辑复杂的领域,能有效应对需求频繁变更的挑战。以微服务架构为例,DDD的限界上下文天然形成服务边界,结合事件风暴等协作技术,可快速建立准确的业务模型。本文通过订单系统等典型案例,详解如何避免过度设计、实现模型与代码的有效映射。

weixin_30654419的博客 391

Lammps不同亲疏水性粗糙表面的润湿行为模拟(包含in文件)

Lammps粗糙表面的润湿行为模拟(包含in文件)前言—润湿行为模拟一、物理模型构建二、具体in文件—in文件内循环亲疏水性三、具体in文件—分子模板构建初始模型以及平衡态模拟四、全部代码(基地粗糙表面只提供data文件) 前言—润湿行为模拟 润湿现象:当液体与固体接触时,液体的附着层将沿固体表面延伸。当接触角 θ\rm \thetaθ 为锐角时,液体润湿固体,若θ为零时,液体将展延到全部固体表面上。润湿现象的产生与液体和固体的性质有关。(来自百度百科) 润湿行为的本质是固液之间的相互作用,也就是分子间的范

Rockyoung 7094

Node.js领域驱动设计(DDD)框架实践指南

本指南旨在帮助您快速理解并上手`node-ts/ddd`这一基于Node.js的领域驱动设计框架。通过本指南,我们将一起探索其核心结构、启动流程以及关键配置,让您能够高效地在项目中应用DDD原则。 ## 1. 项目目录结构及介绍 `node-ts/ddd`项目采用了一种清晰而组织良好的目录布局,旨在支持洋葱架构,这有助于分离关注点并简化复杂系统。以下是项目的基本目录结构概述: - **`CO

gitblog_00681的博客 936

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深度学习工具包 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不是银弹,它适用于复杂的业务场景。在实践中,需要团队共同努力,不断探索和改进。《领域驱动设计:软件核心复杂性应对之道》- Eric Evans《实现领域驱动设计》- Vaughn Vernon关注我,了解更多技术干货!

kkc_s的博客 643

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

探索DDD Guestbook:ASP.NET Core领域驱动设计的终极实践指南

DDD Guestbook是一个基于ASP.NET Core构建的领域驱动设计(DDD)示例项目,旨在展示如何使用.NET Core构建符合SOLID原则的DDD应用程序。本指南将带您了解这个项目的核心架构和实现方式,帮助您快速掌握领域驱动设计的实践要点。 ## 什么是领域驱动设计? 领域驱动设计(DDD)是一种软件开发方法,它强调将业务领域的概念和规则融入到软件设计中。通过DDD,开发人员可

gitblog_01024的博客 662

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值