领域建模分析

17、系统分析中的领域建模与用例建模 本文深入探讨了系统分析中的领域建模与用例建模方法,并结合多个实际案例(如房地产多重上市服务系统、春假旅游社交网络子系统、即时快递服务系统和实时血糖监测系统)详细阐述了如何通过类图、状态机图、活动图和系统序列图等工具对系统需求进行建模。同时,文章还介绍了用例描述的不同详细级别、CRUD 技术在验证用例中的应用,以及这些建模工具的集成使用,旨在为系统设计与开发提供全面的需求分析基础。 阅读详情

关于借书场景的领域建模,我从以下几个方面进行分析(尽量简洁不讲废话,呵呵):


1.分析模型静态结构:
我分析一个领域模型的静态结构的思路一般是:先找出我们需要关心的对象,对于借书这个场景,我们关心的有:
1)Account(账号):Id(账号唯一标识,自动生成), Number(卡号), Owner(账号当前拥有者用户信息), BorrowedBooks(账号当前借到的书)
2)Book(书本):Id(唯一标识,自动生成),BookInfo(值对象,包含书本基本信息),Count(表示当前库存数量)
3)BorrowHistory(借书历史、借书日志):AccountId(借书账号),BookId(书本Id),Count(数量,表示借了几本),BorrowTime(借书时间)
4)BorrowedBook(借到的书):BookId(书本Id),Count(书本数量)
通过上面的分析,那么模型的静态结构就很容易画出来了。

-----------------------------------------------------------------------------------------------------------------
2.按面向过程的思维实现逻辑:
这种分析思路是最容易的,因为我们不用考虑对象之间如何交互,我们只需要考虑场景结束后,每个对象会发生什么变化即可。所以,按照这个思路,我们得出借书这个场景发生后有以下几个对象会发生变化:

  • Book的Count属性会变化(减少,因为书本被借出);
  • Account的BorrowedBooks属性会增多(因为借到书);
  • BorrowHistory会被创建,因为发生了一次借书的操作;

上面这3步在经典DDD中,我们通常会设计一个领域服务来完成,比如叫BorrowBookService

可以发现,其实面向过程的分析思路是一种面向结果的分析方法;我们只需要考虑一个交互过程的结果改变了哪些对象的什么状态即可,而对象之间到底如何交互的我们不用显式的建模出来;所以这种建模方法相对简单,因为我们考虑的东西比下面第三种要少一样东西,那就是对象之间的交互。

-----------------------------------------------------------------------------------------------------------------
3.按面向对象的思维实现逻辑:
也许有人会说,上面的面向过程的建模思路不是真正的OO,因为对象之间没有交互,对象只是一个data,只是一个对数据的封装而已。
那么,如果要让对象之间体现出交互,那我们该如何分析呢?我觉得最关键的是要把握一点:我们分析的时候要时刻按照“谁通知谁做什么事情,或谁被通知做什么事情”这个思路来分析;

好,那按照这个思路,那么对上面的对象:Account,Book,BorrowedHistory,我们如何来分析呢?

首先假设我们已经设计好了这个软件,然后有一个界面显示在屏幕上,然后用户用它的卡号(account.Number)登陆了系统,然后用户通过查询选择了几本书,然后点击“借书”按钮。整个借书场景就是从这个“借书”按钮开始启动。另外,整个借书场景的参与者信息有:accountId,bookId,count,表示哪个账号对哪本书借了几本。
好,那么,“借书”按钮被点击后,应该有一个对象被激活,先不管该对象是什么,我们只要知道该对象会做一件事情,就是:

?
var borrower = repository.load<Account>(accountId); //将借书人账号load到内存
var book = repository.load<Book>(bookId); //将书本对象load到内存
borrower.BorrowBook(book, count); //启动账号的借书行为

  

接下来borrower.BorrowBook方法内部会发生什么呢?想想现实世界怎么发生的就知道了,你去图书馆借书,你肯定告诉管理员说“我要借这几本书”,这句话潜在的意思是,请你把这几本书借给我,谢谢,呵呵。

那就很明白了,应该有一个对象,如图书馆管理员(administrator),他有借出书(LendBook)的职责行为,那么上面的BorrowBook方法内看起来就是如下这样:

?
borrower.BorrowBook(book, count)
{
     //通知图书馆管理员把指定的书借给我count本,this就是我,呵呵
     administrator.LendBook( this , book, count);
 
     //管理员把书借出来后,更新账号自己的当前借到的书的信息
     var borrowedBook = _borrowedBooks.SingleOrDefault(x => x.BookId == book.Id);
     if  (borrowedBook == null )
     {
         borrowedBooks.Add( new  BorrowedBook(book, count));
     }
     else
     {
         borrowedBook.AddBookCount(count);
     }
}

接下来我们可以考虑administrator.LendBook这个行为做了什么?

?
administrator.LendBook(account, book, count)
{
     //通知书本减少其库存数量
     book.DecreaseCount(count); //方法内部需要检查库存数量是否足够,如果不够需要抛异常;
 
     //这里应该要记录借书记录了,因为译本书是否被借出的衡量标准是图书馆管理员说了算的,当他
     //用扫描仪对该本书进行了扫描并确认后,就表示该本书确定被借出去了,所以我们可以在这里做
     //创建借书记录的逻辑。
     var borrowHistory = new  BorrowHistory(account, book, count, DateTime.Now);
     //下面理想情况下我们不希望在这里保存borrowHistory,但是如果光是new一个BorrowHistory对象出来,
     //是没办法被持久化出来的,必须通过某种方式通知框架保存new出来的这个对象,
     //如果用经典的ddd,那如何保存borrowHistory呢?后面我会谈到一些关于这个的思考。
}

好,上面的分析我想应该很清晰地表达了对象之间如何交互,从而完成整个借书场景。但是,上面提到“借书”按钮被点击后,应该有一个对象被激活。那么这个对象会是什么呢?

我觉得你可以设计一个BorrowBookService领域服务,也可以设计一个BorrowBookContext场景类,它有一个Interaction(交互的意思)方法:

?
borrowBookContext.Interaction(Guid accountId, Guid bookId, int  count)
{
     var borrower = repository.load<Account>(accountId); //将借书人账号load到内存
     var book = repository.load<Book>(bookId); //将书本对象load到内存
     borrower.BorrowBook(book, count); //启动账号的借书行为
}

  

所以,整个交互的过程就是:

  1. 软件使用者(user)通知系统(system)我要借书;
  2. 系统于是创建一个BorrowBookContext场景对象,并通知该场景对象启动交互过程(Interaction);
  3. borrowBookContext通知仓储(repository)将account,book这两个对象从内存激活,通过load方法实现;
  4. 然后通知借书账号执行其借书行为,其实此时借书账号是扮演了IBorrower角色(即借书人的角色),所以严格来讲,BorrowBook这个行为是属于IBorrower这个角色的;
  5. 然后borrower通知administrator把书借出来;
  6. 然后administrator通知book减少其余额;
  7. 然后administrator创建借书记录,即产生借书日志;

从上可以明显的看出,每一个交互都是对象a通知对象b做什么,这是关键;上面的分析和代码充分体现了“对象交互”,也许这样的代码才是更OO吧,呵呵。

再加一些补充:
  1. 因为,现实生活中,你去图书馆借书,那执行借出书的那个管理员(administrator)代表的就是图书馆。甚至我们可以这样想,假设现在有一个自动借书机或借书网站,你插入你的借书卡(网站用户登录),然后输入要借的书,然后点击确定,然后书本就自动从借书机里吐出来了,呵呵。如果是网站,那就是会自动邮寄过来(当然还要输入寄送地址,呵呵)。所以,从这个分析可以知道,其实图书馆管理员不重要,它其实代表的是图书馆,而图书馆本质上就是提供借书服务。当然,因为我们上面只考虑的借书的场景,我们有没有想过books这个集合放在哪个对象上比较合适呢?我觉得很显而易见把,那就是图书馆,即library.Books,图书馆维护了所有的书本信息;所以,从整体来看,图书馆也有状态。
  2. 有时我们认为产生借书日志不是核心领域逻辑,因为并不是所有的图书借阅系统都需要记录借书记录,那这样的话,我们可以在应用层(也就是我上面的BorrowBookContext中)生成借书记录;
  3. 虽然按照OO的思路去领域建模出来的结果看起来很舒服,但实际上不是很实用,我个人认为属于中看不中用的设计,呵呵。因为这样的设计虽然做到了对象与对象之间的交互,但实际上当我们在面对并发和数据一致性时,都会引入事务。像上面的分析,我们知道一次借书,至少会影响3个聚合根的修改或新增,那意味着一次事务会跨3个聚合根。一旦引入事务,那在当用户访问量大,并发高的情况下,系统可用性是很差的;所以,国外DDD专家才推荐,一次事务只更新一个聚合根,那如果要遵守这样的规定,那如何实现上面的一次要修改3个聚合根的需求呢?呵呵,为了解决这个问题,我们需要通过saga了,就是类似于一个流程管理器的东西。引入saga,相当于实现了聚合根与聚合根之间的异步通信,而不是直接调用聚合根的方法通知其做事情;上面的设计的最大问题就是都是某个聚合根直接调用另一个聚合根的方法通知其做事情。实际上每个聚合根都自己内部维护了其一致性,聚合根之间完全可以通过异步的方式实现交互。saga就是用来实现聚合根之间异步交互的一种技术。saga就是将方法调用修改为:publish-subscribe,以及command的模式,呵呵。学习Saga的一个例子可以看看这篇文章:http://msdn.microsoft.com/en-us/library/jj591569.aspx
13、系统分析中的领域建模与相关技术 本文详细探讨了系统分析中的领域建模及相关技术,以桑迪亚医疗设备的实时葡萄糖监测系统为例,介绍了系统需求分析、用例建模、问题域中‘事物’的识别方法,以及实体-关系图、领域模型类图和状态机图的应用。通过这些技术和工具,可以更好地理解系统需求和业务逻辑,为系统设计与开发提供坚实基础。 阅读详情

相关推荐

16、系统分析中的领域建模与状态机图应用

本文深入探讨了系统分析中的领域建模与状态机图的应用。通过领域模型类图和实体-关系图(ERD),可以准确描述问题域中的事物和关系,为系统设计提供清晰框架。同时,状态机图用于模拟对象的状态变化,帮助理解业务流程和系统行为。文章还介绍了相关的建模技术、最佳实践以及实际应用案例,为系统开发提供了实用指导。

web39explorer的博客 61

DDD微服务架构设计第九课 远程医疗和智能温控DDD设计实践

19 远程智慧医疗平台(微服务+人工智能)的设计过程 前面我通过一系列案例讲解了在实际项目中是如何落地 DDD 的。这一讲,我再从更高的层面来讲解,DDD 如何从战略层面规划一个智能系统的建设。 在本专栏的一开篇我就谈到了,领域驱动设计是软件核心复杂性的应对之道。在一个业务单一的系统中,领域驱动设计的优势并不大,反倒使得设计开发比较麻烦,没有那么敏捷而直接。然而,随着软件业不断发展,现在的软件系统规模越来越大,面对互联网的大型、综合性业务系统越来越多。业务与技术的双重复杂性,带给软件开发团队前所未有的严峻

fegus的博客 965

15、系统分析中的领域建模与状态机图

本文探讨了系统分析中的领域建模和状态机图的应用,重点分析了RMO系统的领域模型类图以及SaleItem和InventoryItem类的状态机图开发过程。通过实例讲解了如何识别对象状态、构建状态转换关系、处理并发路径以及优化状态机逻辑。文章还强调了状态机图在需求分析、系统设计和测试验证中的重要性,为复杂系统的开发和维护提供了有效支持。

web39explorer的博客 58

DDD领域驱动设计-经典四层架构划分 + DDD建模分析过程

DDD经典四层模型架构划分以及建模分析过程

lqs_user的博客 1万+

FPGA实现16x16点阵汉字滚动显示:Verilog代码与Quartus仿真详解

本文详细介绍了如何使用FPGA实现16x16点阵汉字滚动显示,包括Verilog代码设计、Quartus仿真及硬件连接技巧。通过字模数据存储和扫描控制逻辑,实现汉字的动态显示效果,并提供了优化建议和常见问题解决方案,适合FPGA开发者和硬件爱好者学习参考。

weixin_29172963的博客 354

IEEE LaTeX模板中algorithm排版避坑指南:如何优雅地嵌入算法描述?

本文详细解析了在IEEE LaTeX模板中优雅排版algorithm的实用技巧,包括基础配置、高级自定义及常见问题解决方案。通过嵌套环境与[H]参数的应用,帮助研究者克服IEEEtran模板对算法排版的限制,实现专业且美观的算法呈现。

weixin_28340315的博客 408

DDD[领域驱动模型]

领域驱动设计`DDD`占据着非常重要的位置,可以说`DDD`是应用架构设计的核心。`DDD`是一套综合软件系统分析和设计的面向对象建模方法。 过去系统分析和系统设计都是分离的,正如“系统分析师” 和“系统设计师” 两种职称考试一样,这样割裂的结果导致,需求分析的结果无法直接进行设计编程,而能够进行编程运行的代码却扭曲需求,导致客户运行软件后才发现很多功能不是自己想要的,而且软件不能快速跟随需求变化。 DDD则打破了这种隔阂,提出了领域模型概念,统一了分析和设计编程,使得软件能够更灵活快速跟随需求变化。

程序猿进阶 2082

MEG预处理-Brainstorm

Brainstorm下载和安装 去Brainstorm官网进行下载:打开网页后,点击左侧Download;在跳出来的界面中进行简单的注册,注册完成后可以进行下载 解压后得到“brainstorm3”的文件夹,里面包含Brainstorm工具包的所有文件,把这个文件夹放在某个路径如"E:\matlab_tools\brainstorm3"即可 同样在某个路径建立空的文件夹命名为:brainstorm_db用于工具包运行过程中自动存储生成的文件,所以这个文件中生成的数据不要手动移动删除 在Matlab中,把.

AxeChen的博客 6127

【死磕DDD】聊聊领域建模方法论

领域建模方法论企业架构法CBM 组件化业务模型面向服务架构设计SOA面向服务架构模型用例分析法四色建模法Event Storming事件风暴 企业架构法 CBM 组件化业务模型 图中纵着的一个个其实就是子域和界限上下文,横着的可能是一些策略层、控制层和执行层,里面又有一项一项的内容,这些内容在我们领域设计里面可以对应到一个个聚合,那就有了很多聚合也有了很多子系统。 如果说聚合太细了,我们不可能写的那么细,那你也许就是一个个的微服务、一个个模块。 面向服务架构设计 SOA面向服务架构模型 SOA是一切以总

qq_45455361的博客 4445

【技能---ubuntu20.04更换国内镜像源】

安装好ubuntu20.04后,在下载软件等安装包的时候,速度特别的慢,为此就想着更换一下镜像源,以此来增加下载的速度!!!下面是换源的具体流程!!!提示:以下是本篇文章正文内容,下面案例可供参考以上到这里就更换完软件源了,如有不足之处,请大家斧正!!!

fyc300的博客 1万+

【箱子之字形摆放】python实现-附ChatGPT解析

箱子之形摆放有一批箱子(形式为宁符串,设为str) ,要求将这批箱子按以之形的顺序摆放在宽度为n的空地,请输出箱子的摆放结果。例如:箱子为ABCDEFG,空地宽度为3,摆放结果如图:则输出结果为:AFGBECD输入一行字符串,通过空格分制,前面部分为字母或数字组成的字符串str,表示;后面部分为一个数字n,表示。ABCDEFG 3箱子摆放结果,如题目示例所示AFGBECD。

sinat_29950703的博客 371

谈谈领域建模

转自:http://www.fanyilun.me/2018/04/08/%E8%B0%88%E8%B0%88%E9%A2%86%E5%9F%9F%E5%BB%BA%E6%A8%A1/ 哥们写的很用心,建议看原文 1 前言   最近工作中,我对于模型的设计,尤其是“领域模型”的设计有一些思考和讨论。这篇文章总结了我对领域建模的看法和方法论,也相当于汇总了各位大师对领域建模的不同思想。   领域建模的目标,是解决复杂业务中软件开发的一系列问题。领域建模也是实现这个目标的一条路径,一种方法论。在实践.

maoyeqiu的专栏 2989

【openGauss实战1】openGauss基于CentOS8的部署

基于openGauss数据库在CentOS8上的安装实践。

IT邦德 3050

系统需求分析与领域建模

架构设计 系统需求的分析与设计1. 软件开发概述2. 系统需求分析总体过程3. 系统需求分析案例3.1 领域划分3.2 业务用例 1. 软件开发概述 常见软件开发流程 需求阶段 需求调研 - 产出:业务需求说明书 需求分析 - 产出:需求分析说明出,可行性分析报告 业务建模 - 产出:业务用例(用例图) 系统建模 - 产出:系统用例(时序图) 数据建模 - 产出:数据库设计(ER图) 设计阶段 架构设计-网络拓扑图 领域划分-划分边界 接口拆分-接口文档,sdk 概要设计 详细设计 实现阶段 项

靖节先生的博客 4449

STM32电机PID速度控制

2.3 STM32电机PID速度控制 之前的文章,完成了直流减速电机的PWM控制、电机测速。本篇文章,将实现电机的速度闭环控制。 在公众号:小白学移动机器人,发送:速度PID,即可获得本篇文章的STM32工程文件以及相关资料。 2.3.1 解决的问题 解决带编码器直流电机的速度闭环问题。 2.3.2 PID理论 将偏差的比例、积分、微分,通过线性组合构成控制量,用控制量对被控对象进行控制,这样的控制器称为PID控制器。在连续空间中,我们通常探讨模拟PID的控制原理,如图所示: 我们这里用电机速度控制为例,

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 6万+

电商数据采集实战——多平台价格监控、比价分析与智能告警系统

在电商竞争日益激烈的今天,价格监控与比价分析已成为品牌商、渠道商和消费者的核心需求。对于品牌商而言,需要监控各渠道售价是否低于指导价(破价监控);对于消费者而言,希望在最佳时机以最低价购入心仪商品;对于数据分析师而言,价格波动数据是洞察市场趋势的金矿。然而,电商数据采集面临三大核心挑战:本文将基于 Python + Scrapy + Playwright + Redis + ClickHouse 技术栈,构建一套完整的电商价格监控与比价系统。架构分层说明:电商平台的反爬手段层出不穷,采集系统必须具备多层次的

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 136

系统分析与设计-领域建模之对象状态

系统分析与设计-领域建模之对象状态 文章目录系统分析与设计-领域建模之对象状态使用 UMLet 建模使用 UML State Model,对每个订单对象生命周期建模 使用 UMLet 建模 Asg-RH.pdf: 使用类图,分别对 Asg_RH 文档中 Make Reservation 用例以及 Payment 用例开展领域建模。然后,根据上述模型,给出建议的数据表以及主要字段,特别是主键和外键...

C486C的博客 665

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

系统分析与设计--领域建模-对象状态

系统分析与设计–领域建模-对象状态 1、使用类图,分别对 Asg_RH 文档中 Make Reservation 用例以及 Payment 用例开展领域建模。然后,根据上述模型,给出建议的数据表以及主要字段,特别是主键和外键 注意事项: 对象必须是名词、特别是技术名词、报表、描述类的处理; 关联必须有多重性、部分有名称与导航方向 属性要注意计算字段 数据建模,为了简化描述仅需要给出表清...

hellowangld的博客 701

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

[架构之路-215]- 系统分析-领域建模基本概念

领域,在软件工程中,是相对于计算机域而言的,就是用计算机技术来解决问题的领域,又称为问题域。即问题域是指被开发系统的应用领域,即在客观世界中由该系统处理的业务范围。也就是说,问题域或领域是相对计算机域而言的!!!计算机领域的“类”称为“设计类”,与具体编程语言相关的类称为“实现类”按照类的方法,针对问题领域进行抽象,得到的”类“,称为”概念类“。概念类,不需要计算机编程的知识和技能,只需要有“类”的思想,对现实世界的某个业务领域进行抽象即可。领域模型是对领域内的概念类或现实世界中对象的可视化表示。

文火冰糖(王文兵)的博客 2351

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

领域建模分析方法

领域模型之间的联系,我们要怎么理解呢? 以上面这位某人A为例,本次我们所要提取的特征,是父亲。父亲与母亲,丈夫与配偶,关系是1对1的。也就是一夫一妻制。父亲与孩子,关系是1对N的,一位父亲,可以有一个孩子,也可以有多个孩子。母亲与孩子的关系,也是1对N的。所以这一家三口之间的联系,可以简单用这张图来表示: 当然领域模型的图形化还有很多种方式,例如UML类图、状态图、时序图等,这边就不一一介绍。 1.2 为什么要学习领域模型 “基础设施决定上层建筑” —— 马克思。 老祖宗教导我..

lzf的博客 2146

业务分析/领域建模的主要内容

模型(Model)通常由2部分组成: 1)元素(Element) 2)(元素间的)关系(Relationship) 因此,领域建模(Domain Modeling)/业务分析的主要就是: 1)寻找业务对象(Business Object) 2)恰当建立这些对象间的关系 — 请参考小唐前面的BLOG 业务分析并不深奥!

Yew(魔教教主鬼谷子)的专栏 694

系统分析与设计homework6——领域建模与状态建模

系统分析与设计homework6 练习资源:Asg-RH.pdf 使用 UMLet 建模 工欲善其事,必先利其器 总结领域建模与状态建模图的得分细节 每个图表必须有标题 领域建模必须包括一个以上的箭头与关系 领域建模要区分是计算出的属性还是原有的属性,通过计算出的属性用 / 表示 领域建模对象必须是名词 领域建模注意两个对象的关系,是一对多还是多对一等等 领域建模还要注意子类与父类的关...

dick的博客 393
上一篇: 如何打败CAP定理
下一篇: DDD领域模型设计
dongdong_java
博客等级 码龄16年 87粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值