Day01 - 缘起:怎麽了?为什麽?如何掌握过於自由的程序码?
以订单、RPG 角色的移动,这 2 个例子,描述在复杂的软件应用、系统中,会面临的挑战。
以及我们尝试如何去克服这个困难
- 透过储存 boolean
flag
进变数,记忆状态- 透过一系列
if / else
判断状态、进行防呆)
解释了 Day1 这个解决方案带来了什麽困扰及难题
- 状态不具描述性、可读性低
- 违反开放封闭原则
- 透过一系列
if / else
判断状态、进行防呆,当新增、修改功能时
- 要回去改动旧功能的程序码
- 每新增一个状态
flag
,除错复杂度就大幅提升- 状态描述性下降、可读性降低
- 沟通成本提升
- 必须注意逻辑之间的连动性、相依性
- 容易漏思考东西
- 容易产生冗余的逻辑语句
- 换个角度观察
- 独立的状态
- 旧状态 → 新状态,有明确的转移路径
今天我们就要藉着这个新的角度下去讨论,接续之前的两个例子
1.RPG 游戏的角色移动
2.交易系统的订单进度
我们可以发现这两个商业需求其实都是针对一个个体、实体(entity)或是物件(object)出发
订单进度是针对「订单」进行追踪,不同的进度会采取对应的行动。
同样 RPG 角色中,我们的前进、後退、跳跃、匍匐这些行为,也都时针对玩家选取的「角色」操纵。
前面两天都有提及状态一词,但我们还没有对这个字有严谨的定义。
英文中的 state 及 status 都被翻译为状态,既然我们要研究的项目是:有限状态机(Finite State Machine),我想我们有必要对「状态」一词进行厘清。
State: the particular condition that someone or something is in at a specific time.
Status: the situation at a particular time during a process.
by What is the difference between state and status?
state: the physical or mental condition that someone or something is in
status: a situation at a particular time, especially in an argument, discussion etc.
by StackExchange: "Status" vs. "state"
state表示一个确定的状态集中的某个状态(比如水的三态)
status表示一种笼统的情形(比如你的生活状态、工作状态),不存在确定的状态集。
by 知乎:程序代码中,怎么区分status和state?
综合以上 3 组解释,我们可以发现
状态(state):比较偏向实际、实体的状况或条件 (condition)。比如:水的三态,气态、液态、固态
状态(status):比较偏向一段期间的情况或形势 (situation)。比如:冷战状态、工作状态
而 State 一词,在 Wiki (Computer Science)中的解释
在 IT 或 CS 的领域中,如果有一个系统被设计来记忆先前的事件、使用者的互动等。这个被记忆起来的资讯,我们称为状态。而我们也称这个系统是有状态的(stateful)。
所以在前面两个例子中,我们必须透过 flag 记忆订单目前所在阶段是什麽、才能根据此采取对应的行动;
RPG 角色的操控,也需要记起上一个行为是什麽,来决定下个行为,是不是合法的(俯卧不能直接跳起)
因此前述所指称的「状态」会比较趋近英文中的 "State",在这边要跟读者们界定,在本系列文中的「状态」一词,除非有另外特别解释,否则皆应指为 "State" 。
在第 1 点的对象、实体或是物件,解释完 State 之後,也想在此厘清
在 CS 的领域里,Object 可以是一个变数、一种资料结构、一个函式、一个方法,换句话说,是一种储存在记忆体里面的值,被识别符(identifier,这里我们比较常听的是 key 或是 property name 等)参照
by Wiki:Object(computer science
真实世界中的物件都有 2 个特徵,他们都有状态(state)及行为(behavior),比如狗有状态(姓名、颜色、品种..)及行为(汪汪叫、摇尾巴...)
by Oracle - Java document :What Is an Object?
我想,以目前所知,现在所指的物件、主体、个体或对象,是会比较关注在这个 Object 底下的状态;一个主体底下包含的各种状态。(角色的状态是跑、跳、匍匐着等)
- 换个角度观察
- 独立的状态
- 旧状态 → 新状态,有明确的转移路径
能不能直接使用以下的程序码?不要像第一天还要回头做过多的防呆检查...
if(state == '跳跃中') // 画出跳跃
if(state == '匍匐中') // 画出匍匐
因为状态与状态间是彼此独立的(玩家不能同时是跳跃中跟匍匐中),而且状态转移有明确的路径。
如果是匍匐中,下一个状态就不能是跳跃中,只可以是站立
我们能不能设计一个函式让状态间彼此不相干扰
let nextState = f(previusState)
假设我们设计出这个 function 之後,能明确切分 state 跟 state 间的关系,也让我们不必再回去原本状态底下添加 if/else
防呆,但...
我们发现其实还有个不足之处,就像是 Oracle 对物件的定义是 「状态」及「行为」。我们发现这个状态的转移呀,不单单只依靠 previusState
。
举例而言,我们的规格书说
除了 previusState
之外,我们还必须注意操纵者的「行为」,或是说 监听这些 keyboard (按键)的「事件」。
所以说那我们明天就继续来探索这个世界或是行为吧
nextState = f(previusState)
及其不足之处。
出於书本 Chapter 1. Introduction to Ethical Hacking 骇客...
惯例 这篇先解题分享。 怕来不及打完,这样比较好修改...科科 Remove Duplicates ...
前言 那 JavaScript 中有一个东西叫做闭包 (Closure),Python 也会有吗?所...
前情提要 先帮大家回味一下,第一天我说了些哪些内容: 之前跟她装熟很失败,现在决心要打掉重练 啊,可...
在产品网站上,常常会见到付费价格的页面,其实 Tailwind 也是有像 Bootstrap 一样...