龙空技术网

使用函数怎么实现状态机程序?

成长开发者 244

前言:

目前小伙伴们对“状态机 代码”可能比较注重,大家都需要分析一些“状态机 代码”的相关文章。那么小编同时在网摘上搜集了一些对于“状态机 代码””的相关文章,希望看官们能喜欢,同学们一起来了解一下吧!

2022年06月08日 日更 123/ 100 天

01. 今天接着来看,函数的骚操作。不使用 switch 实现状态机代码。我们先用 switch 实现,然后使用函数实现,两厢对比着学习一下。

02.先看 switch 的实现代码

/* 使用枚举传递状态 */enum TextProcessingMode {    Text,    Marker,    Code}class TextProcessor {    private mode: TextProcessingMode = TextProcessingMode.Text;    private result: string[] = [];    private codeSample: string[] = [];    processText(lines: string[]): string[] {        this.result = [];        this.mode = TextProcessingMode.Text;        for(let line of lines) {            this.processLine(line);        }        return this.result;    }    private processLine(line: string): void {        switch(this.mode) {            case TextProcessingMode.Text:                this.processTextLine(line);                break;            case TextProcessingMode.Marker:                this.processMarkerLine(line);                break;            case TextProcessingMode.Code:                this.processCodeLine(line);                break;        }    }    private processTextLine(line: string): void {        this.result.push(line);        if(line.startsWith("<!--")) {            this.loadCodeSample(line);            this.mode = TextProcessingMode.Marker;        }    }    private processMarkerLine(line: string): void {        this.result.push(line);        if(line.startsWith("```ts")) {            this.result =  this.result.concat(this.codeSample);            this.mode = TextProcessingMode.Code;        }    }    private processCodeLine(line: string): void {        if(line.startsWith("```")) {            this.result.push(line);            this.mode = TextProcessingMode.Text;        }    }    private loadCodeSample(line: string){        /** */    }}

03. 函数实现

class TextProcessor {    private result: string[] = [];    private processLine: (line: string) => void = this.processTextLine;    private codeSample: string[] = [];    processText(lines: string[]): string[] {        this.result = [];        this.processLine = this.processTextLine;        for (const line of lines) {            this.processLine(line);        }        return this.result;    }    private processTextLine(line: string): void {        this.result.push(line);        if(line.startsWith("<!--")) {            this.loadCodeSample(line);            this.processLine = this.processMarkerLine;        }    }    private processMarkerLine(line: string): void {        this.result.push(line);        if(line.startsWith("```ts")) {            this.result = this.result.concat(this.codeSample);            this.processLine = this.processCodeLine;        }    }    private processCodeLine(line: string): void {        if(line.startsWith("```")) {            this.result.push(line);            this.processLine = this.processTextLine;        }    }    private loadCodeSample(line: string) {        /** */    }}

04. 比较函数式实现和普通 switch 实现两种方式。函数式实现时,省略了状态转移的属性传递,在实现同样功能上,函数式的代码更少。所以,能用函数式实现的地方,统统使用函数式吧。

我是【明哥我来】,坚持输出技术、副业和生活感悟,欢迎关注,一起走向财富自由。

标签: #状态机 代码