状态机

java幂等性的解决方案

北战南征 提交于 2019-11-29 03:16:16
摘自:https://www.cnblogs.com/baizhanshi/p/10449306.html 一、幂等性概念 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数. 更复杂的操作幂等保证是利用唯一交易号(流水号)实现. 我的理解:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。 二、幂等性场景 1、查询操作:查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作; 2、删除操作:删除操作也是幂等的,删除一次和多次删除都是把数据删除。(注意可能返回结果不一样,删除的数据不存在,返回0,删除的数据多条,返回结果多个) ; 3、唯一索引:防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建资金账户多个,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功一个资金账户记录。要点:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可); 4

当我读《游戏编程模式》时我在想什么

谁说我不能喝 提交于 2019-11-28 22:11:37
写在前面 这本书长这样 我还没有看过“GOF”,我所读到的设计模式都是这本书(游戏角度)给出的定义,害怕GOF中的定义过于抽象。 没有在项目代码晃来晃去经历的,或者没有工作至少半年的,不用着急买这本书,因为估计看不懂。 本文用来重点记录“我觉得XX设计模式是什么”,以及“当我在看XX设计模式时,我在想什么” 命令模式 书面定义:“将一个请求封装成一个对象,从而允许你使用不同的请求、队列或日志将客户端参数化,同时支持请求操作的撤销和恢复” 他的举例:按键事件 我的定义:将命令封装成对象,支持撤销和重做 我的举例:(书上已然很好) 想到的问题: 举例用了按XX键执行YY事件,我以为它会讲自定义按键(就是跳是按A,现在我想跳是按B)…… 讲到非常具体的命令,它联系到了下一章的“享元模式”,旁注不让用“单例模式”,想想确实,因为单例模式根本不会有继承 享元模式 书面定义:使用共享以高效地支持大量的细粒度对象 他的举例:森林 我的定义:将共同点分离出来,在另外加上具体点 我的举例:(书上已然很好) 想到的问题: 我第一个想到的就是类的继承,不过文中的举例,都没有涉及到继承 观察者模式 书面定义:“在对象间定义一种一对多的以来关系,以便当某对象的状态改变时,与它存在依赖关系的所有对象都能收到通知并自动进行更新” 他的举例:成就系统 我的定义: 当对象的状态改变时,通知给它所有的关注者 我的举例

状态机与状态机的设计

徘徊边缘 提交于 2019-11-28 09:47:59
状态机就是状态转移图。 关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。 状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。 我们定义一个jobEvent public class JobEvent extends AbstractEvent<JobEventType> { private String jobID; public JobEvent(JobEventType type,String jobID) { super(type); this.jobID=jobID; } public String getJobID() { return jobID; } } JobEventType: package org.apache.hadoop.state; public enum JobEventType { JOB_KILL, JOB_INIT, JOB_START, JOB_SETUP_COMPLETED, JOB

状态机设计模式

怎甘沉沦 提交于 2019-11-28 09:47:43
State模式的定义 State模式的定义 : 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 何时使用 ?   State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.   不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State. 是否使用?   在实际使用,类似开关一样的状态切换是很多的,但有时并不是那么明显,取决于你的经验和对系统的理解深度.   这里要阐述的是"开关切换状态" 和" 一般的状态判断"是有一些区别的, " 一般的状态判断"也是有 if..elseif结构,例如: if (which==1) state="hello"; else if (which==2) state="hi"; else if (which==3) state="bye";   这是一个 " 一般的状态判断",state值的不同是根据which变量来决定的,which和state没有关系.如果改成: if (state

有限状态机设计

孤人 提交于 2019-11-28 09:47:32
数字系统有两大类有限状态机(Finite State Machine,FSM):Moore状态机和Mealy状态机。 Moore状态机   其最大特点是输出只由当前状态确定,与输入无关。Moore状态机的状态图中的每一个状态都包含一个输出信号。这是一个典型的Moore状态机的状态跳转图,x、y、z是输入,a、b、c是输出。      Mealy状态机   它的输出不仅与当前状态有关系,而且与它的输入也有关系,因而在状态图中每条转移边需要包含输入和输出的信息。 状态编码   数字逻辑系统状态机设计中常见的编码方式有:二进制码(Binary码)、格雷码(Gray码)、独热码(One-hot码)以及二一十进制码(BCD码)。   格雷码的特点:相邻的两个码组之间仅有一位不同。 普通二进制码与格雷码之间可以相互转换。   二进制码转换为格雷码:从最右边一位起,一次与左边一位“异或”,作为对应格雷码该位的值,最左边的一位不变(相当于最左边是0)。   格雷码转换为二进制码:从左边第二位起,将每一位与左边一位解码后的值“异或”,作为该解码后的值(最左边的一位依然不变)。   独热码又分为独热1码和独热0码,是一种特殊的二进制编码方式。当任何一种状态有且仅有一个1时,就是独热1码,相反任何一种状态有且仅有一个0时,就是独热0码。 状态机的描述   状态机有三种描述方式:一段式状态机、两段式状态机

简单状态机设计(1)

旧城冷巷雨未停 提交于 2019-11-28 09:47:21
 1.0 序列检测器电路设计   设计一个序列检测器电路,功能是:检测出串行输入数据Sin中的4位二进制序列0101(自左至右输入),当检测到该序列时,输出Out=1;没有检测到该序列时,输出Out=0(注意考虑序列重叠的可能性,如010101,相当于出现两个0101序列)。   经过分析,首先可以确定采用米利型状态机设计该电路。因为该电路在连续收到信号0101时,输出为1,其他情况下输出为0,所以采用米利型状态机。   其次,确定状态机的状态图,该电路必须能记忆所收到的输入数据0、连续收到前两个数据01...可见至少要是个状态,分别用S1,S2,S3,S4,再加上电路初始态S0。根据要求可以画出状态图:                       观察该图可以看出,当状态机处以S2、S4的时候,如果输入Sin = 1,则电路会转移到相同的次态S0,如果输入Sin = 0,则电路会转移到相同的次态S3,且两种情况下输出Out都为0。所以,S2、S4为等价状态,可用S2代替S4,于是得到简化的状态图:       如果用CPLD/FPGA器件实现状态机,则逻辑综合器会自动化简状态机。   利用Verilog HDL描述状态图主要包括:   (1) 利用参数定义语句parameter描述状态机中各个状态的名称,并指定状态编码。   (2)

C#8.0——异步流(AsyncStream)

前提是你 提交于 2019-11-28 07:08:05
原文: C#8.0——异步流(AsyncStream) 异步流(AsyncStream) 原文地址: https://github.com/dotnet/roslyn/blob/master/docs/features/async-streams.md 注意:以下内容最好能根据反编译工具查看异步流相关类生成的代码效果最佳 异步流是可枚举类(Enumerable)的异步变体,它会在遍历下一个元素的时候(Next)会涉及异步操作。只要继承自 IAsyncEnumerable 就能实现。 首先我们来看下这些在 .netcore3.0 新增的异步流 API namespace System.Collections.Generic { public interface IAsyncEnumerable<out T> { IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default); } public interface IAsyncEnumerator<out T> : IAsyncDisposable { T Current { get; } ValueTask<bool> MoveNextAsync(); } } namespace System { public

一位前辈的工作经验

时光怂恿深爱的人放手 提交于 2019-11-28 02:36:02
http://www.cnblogs.com/jianyungsun/archive/2010/12/07/1899533.html 在公司里的几个月,做的项目其实不多,但是收获还是有一些,我觉得收获最大的是 设计 理念的改变,这也是我这段 时间 最想总结的,我会在后面逐渐阐述。 如对此文有疑问或想给作者提 建议 请给作者发email: wangdian@tom.com 1/时序是设计出来的 我的boss有在华为及峻龙工作的背景,自然就给我们讲了一些华为及altera做逻辑的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。在工作这几个月中,给我感触最深的是华为的那句话:时序是设计出来的,不是仿出来的,更不是湊出来的。 在我们公司,每一个项目都有很严格的评审,只有评审通过了,才能做下一步的工作。以做逻辑为例,并不是一上来就开始写代码,而是要先写总体设计方案和逻辑详细设计方案,要等这些方案评审通过,认为可行了,才能进行编码,一般来说这部分工作所占的时间要远大于编码的时间。 总体方案主要是涉及模块划分,一级模块和二级模块的接口信号和时序(我们要求把接口信号的时序波形描述出来)以及将来如何测试设计。在这一级方案中,要保证在今后的设计中时序要收敛到一级模块(最后是在二级模块中)。什么意思呢?我们在做详细设计的时候,对于一些信号的时序肯定会做一些调整的

有限状态机

一世执手 提交于 2019-11-27 08:33:14
 unity中已经包含了自动给定的状态机组件Animator,但是面对不同脚本的触发,往往会使状态冲突,所以我们需要使用自己定义的状态机来解决这个问题     我们在进行游戏的时候,控制的人物会有各种状态,站立,跑动都是状态,那么所有的状态都有一个共同的属性,那就是     他们都是状态 .......我编不下去了 总之我们可以抽象出来一个状态的基类,然后让不同的具体状态去继承这个状态类,那么这个基类里面要有什么呢     我们换状态的时候,新状态要进入,旧状态要退出,在不换状态的时候,则要一直执行当前状态,所以基类中要有三个方法,分别为进入状态,状态持续,退出状态的三个方法,为了区分不同的状态,还要有个状态的标识,可以用数字来标识当前状态是什么     然后打包一个状态事件,包括带有动画机的游戏物体,动画机,一个自定义的有限状态机 代码 代码   然后为了演示,简单定义一个走动的状态 自定义状态机本身要持有一个当前状态对象,一个上一个状态对象,一个当前状态执行时需要的数据,还要有一个转变状态的方法 来源: https://www.cnblogs.com/D25T/p/11354711.html

认识一下Qt状态机QStateMachine

两盒软妹~` 提交于 2019-11-27 02:35:08
文章可能被更新,最新地址: http://www.fearlazy.com/index.php/post/115.html 关于Qt状态机的介绍就懒得说了,网络上一搜一大堆,反正也看不懂。我关心的就是怎么使用,毕竟我只是一个编写应用程序的程序员。简单粗暴的理解一下状态机就是一个管理很多状态的机器。 组成 一个最简单的状态机应该包括状态机(QStateMachine)、状态(QState)和过渡(QAbstractTransition子类)。状态机就相当于一个容器,过渡就是将某一个状态切换到另一个状态(当然也可以不切换)。 使用 1. 状态(QState)设置好此状态下的各对象的属性。 2. 通过过渡指定它的目标状态。 3. 将状态添加到状态机中。 4. 状态机指定一个初始状态,然后调用start启动。 示例代码 从代码中可以看出QState通过assignProperty来关联对象的属性。本例的意思就是在状态1的时候按钮的文本是small,大小为(50,,50)。在状态2时按钮的文本是big,大小为(100,100)。 在这里我们并没有创建QAbstractTransition子类的对象,而是调用QState的addTransition来添加状态的过渡,该函数的返回值就是一个QSignalTransition(QAbstractTransition的子类)对象