finite-state machine(FSM),有限状态机;又称有限状态自动机(finite-state automation:FSA)。
表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。
有限状态机(有时称为有限状态Automaton)是可以使用硬件或软件实现的计算模型,可用于模拟顺序逻辑和一些
计算机程序。有限状态自动机会生成常规语言。有限状态机可用于模拟许多领域的问题,包括数学,人工智能,
游戏和语言学。
有两种类型的有限状态机(FSMs):确定性有限状态机,通常称为确定性有限自动机,以及非确定性有限状态机,
通常被称为非确定性有限自动机。状态机在视觉上表示的方式有轻微的变化,但它们背后的想法源于相同的计算思想。
我们一般讨论的有限状态机就是确定性有限状态机(deterministic finite automaton:DFA)。
有限状态机包含五个概念:

对应五元素,一个DFA的软件表达可以是:
type oDfa struct {
currentState string
inputOpt interface{}
transaction func() bool
targetState string
}
type DFA struct {
starteState string
stateSet []oDfa
}
在实际实现时,需要考虑的地方会比较多:

为了完整的把业务状态和它们之间的迁移关系表现出来,需要整理一份下面这样的的表格:

DDD的战术设计6个要素:值对象、实体、聚合、领域服务、仓储、工厂 每个要素的描述链接: 值对象:值对象 实体:实体 聚合:聚合 领域服务:领域服务 仓储:仓储 工厂:工厂
分层架构一般是:UI层、应用层、领域层、基础设施层 UI层,可以理解为接口层 应用层,承接用户业务需求,串联领域功能特性 领域层,包含所有的领域对象、领域逻辑、领域流程 基础设施层,业务领域之外,给业务完成需要的支撑能力 这四层的关系是,UI层面向外部用户呈现、APP层面向用户服务、领域层则是业务底层逻辑以及这些业务逻辑实现的功能、基础设施是为领域层提供支撑。 依赖关系是:
在进行战术落地到分层架构前所需的前提条件是:
将前期分析的DDD要素,落地为分成架构的代码,可以遵循以下步骤:
上面步骤中,需要详细说明几点: 1.
包括: 定系统、找用户、问目的、画场景、设功能 这个过程是一步一步把需求进行细化,明确,完整,以及可测的一个过程。
在定系统时,需要先描述出需求背景。再根据需求背景,结合需求新旧系统的区别,确定系统边界。
这个过程的第一步就是背景描述,这个背景包括:
在描述背景时,需要约束,描述的是问题,而不是解决方案。但是用户一般都是给的解决方案,所以在一开始就要识别出来哪些是用户给的方案,哪些是用户提的需求。例子:
做一套信息管理系统,这个系统中有一个采购流程,最后的审批人是仓库管理员。
仓库管理员提出: 希望在审批采购流程时,可以让采购单可编辑
软件业务员就说:你负责采购单审核,为什么要编辑这个采购单呢?
仓库管理员就提出:如果担心我修改这个采购单,那就提供编辑的同时,把保持按钮给灰掉,禁止保存修改就可以了。
然后业务就回去让开发,去做个需求了。那么这个需求就成了开发人员茶余饭后吐槽的白痴需求了。
为了说明第三点,例子:
作为餐饮行业,用户提出能够网上进行订餐(点单),客人在预定事件到酒店就餐消费。
作为一个餐饮门店,,它的系统边界和作为一个餐饮集团公司总部分析这个需求时系统边界是不一样的。
作为集团公司可能就要包含门店选择这些餐饮门店所不具备的内容。
这个过程需要通过描述软件未实现的流程,就是此时系统内的软件都没有实现,仅描述在系统中的交互过程。需要注意的是:
需求分为三个层次:
上面的例子在真实场景中,存在一个问题,不能通过一直问“为什么”来挖掘用户的内在需求,因为“为什么”存在质疑的含义,所以跟用户打交道还是需要市场人员有技巧的交流。
另外目的分类:
最终在问目的步骤需要输出的是每一个业务目的、管理目的或者维护目的的need和want两层,可以通用描述为:
为了达到
最后,问目的的时候,要足够细致,这样后面步骤的画场景才能画的完整。
在画场景中,我们通过模型图来把每一个需求的前置条件、交互流程、后置达成目标都明确出来。形成可验收的用例。 一般我们可以选择时序图来画场景。过程中,需要对整个流程、参数进行细化,包括完整的三个部分:
这个画场景的过程还需要把系统在特定场景下的非功能需求挖掘出来。每个非功能指标都是在具体的场景下的。
通过前面的画场景,得到了用户的不同使用场景,以及具体的使用用例集。现在需要把不同的场景从业务领域提供的功能角度进行一次聚合。 聚合后形成这次需求涉及的功能列表。功能列表可以写成:as-for-do形式,其中do可以是多个场景聚合的内容。 之所以要做这个动作原因目前考虑有两方面,一是,当前的需求可能是对原有功能的增改动作,所以需要维护之前的功能描述文档;二是, 通过聚合梳理出的功能,更能表现业务领域模型,利于后面的软件设计。因此对于列出的功能,需要排优先级进行深度开发,也就是先完成最大价值的功能。 此时还有一个角度是,在没有顺序约束时,我们也可以选择可以决定软件架构骨架的功能进行优先开发。
在面对一个新的问题域,需要进入这个问题域进行方案设计时。周毅展示了一种方法论,我觉得这个方法可以充分发挥个人的经验和思维力,很适合经验丰富的人来使用。
进入新领域做设计可以分为三个大步骤来进行:
因为对于业务领域还不是清楚,此时的抽象设计,需要建立在理论和系统控制层面。 比如对于系统部署领域的例子
或者描述为预期系统结构(偏向于静态元素和关系)
最后整个系统的逻辑结构自洽了,那么再将进行下一步,与实现进行匹配。
在具有一个逻辑自洽的设计之后,再将这个设计中的内容与现实业务以及可用实现进行结合。 然后形成设计方案 /* 这部分还没有看到周毅的实例,没有比较明确的理解 */