Day03 - 个体、对象以及状态

小回顾

Day01 - 缘起:怎麽了?为什麽?如何掌握过於自由的程序码?

订单RPG 角色的移动,这 2 个例子,描述在复杂的软件应用、系统中,会面临的挑战。
以及我们尝试如何去克服这个困难

  • 透过储存 boolean flag 进变数,记忆状态
  • 透过一系列 if / else 判断状态、进行防呆)

Day02 - 观察:自由的程序码?有什麽蛛丝马迹、现象?

解释了 Day1 这个解决方案带来了什麽困扰及难题

  • 状态不具描述性、可读性低
  • 违反开放封闭原则
  • 透过一系列 if / else 判断状态、进行防呆,当新增、修改功能时
    1. 要回去改动旧功能的程序码
    2. 每新增一个状态 flag ,除错复杂度就大幅提升
    3. 状态描述性下降、可读性降低
    4. 沟通成本提升
    5. 必须注意逻辑之间的连动性、相依性
    6. 容易漏思考东西
    7. 容易产生冗余的逻辑语句
  • 换个角度观察
    1. 独立的状态
    2. 旧状态 → 新状态,有明确的转移路径

1. 个体、对象

今天我们就要藉着这个新的角度下去讨论,接续之前的两个例子

1.RPG 游戏的角色移动
2.交易系统的订单进度

我们可以发现这两个商业需求其实都是针对一个个体、实体(entity)或是物件(object)出发

主体 : 订单

订单进度是针对「订单」进行追踪,不同的进度会采取对应的行动。

主体 : 角色

同样 RPG 角色中,我们的前进、後退、跳跃、匍匐这些行为,也都时针对玩家选取的「角色」操纵。

2. 状态(state)?状态(status)?

前面两天都有提及状态一词,但我们还没有对这个字有严谨的定义。

英文中的 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" 。

3. 物件(Object)

在第 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 底下的状态;一个主体底下包含的各种状态。(角色的状态是跑、跳、匍匐着等)

前一天最後观察到的重点

  • 换个角度观察
    1. 独立的状态
    2. 旧状态 → 新状态,有明确的转移路径

能不能直接使用以下的程序码?不要像第一天还要回头做过多的防呆检查...

if(state == '跳跃中')  // 画出跳跃
if(state == '匍匐中')  // 画出匍匐

因为状态与状态间是彼此独立的(玩家不能同时是跳跃中跟匍匐中),而且状态转移有明确的路径。

如果是匍匐中,下一个状态就不能是跳跃中,只可以是站立

我们能不能设计一个函式让状态间彼此不相干扰

let nextState =  f(previusState) 

假设我们设计出这个 function 之後,能明确切分 state 跟 state 间的关系,也让我们不必再回去原本状态底下添加 if/else 防呆,但...

我们发现其实还有个不足之处,就像是 Oracle 对物件的定义是 「状态」及「行为」。我们发现这个状态的转移呀,不单单只依靠 previusState

举例而言,我们的规格书说

  • 按下 ⇦、⇨ 可控制玩家移动
  • 按下 B 是跳跃
  • 长按 ⇩ 是匍匐前进 → 放开 ⇩ 是起身

除了 previusState 之外,我们还必须注意操纵者的「行为」,或是说 监听这些 keyboard (按键)的「事件」。

所以说那我们明天就继续来探索这个世界或是行为吧


小节

  • 状态:如果有一个系统被设计来记忆先前的事件、使用者的互动等。状态是指这个被记忆起来的资讯。比较偏向实际、实体的状况或条件 (condition)。比如:水的三态,气态、液态、固态
  • 物件:物件都有 2 个特徵,他们都有状态(state)及行为(behavior),比如狗有状态(姓名、颜色、品种..)及行为(汪汪叫、摇尾巴...)
  • 状态转移的函式 nextState = f(previusState) 及其不足之处。

参考文献


<<:  NNI的特性及核心功能

>>:  程序码流程规划之...日记文

Day 2 - 谈谈伦理骇客

出於书本 Chapter 1. Introduction to Ethical Hacking 骇客...

Rails基本介绍(一)一个实体 && Remove Duplicates from Sorted Array && Remove Element

惯例 这篇先解题分享。 怕来不及打完,这样比较好修改...科科 Remove Duplicates ...

从 JavaScript 角度学 Python(28) - 闭包(Closure)

前言 那 JavaScript 中有一个东西叫做闭包 (Closure),Python 也会有吗?所...

追求JS小姊姊系列 Day2 -- 谁说难搞的女生没朋友?

前情提要 先帮大家回味一下,第一天我说了些哪些内容: 之前跟她装熟很失败,现在决心要打掉重练 啊,可...

Day 27 - [实战练习] Pricing Sections

在产品网站上,常常会见到付费价格的页面,其实 Tailwind 也是有像 Bootstrap 一样...