前言:
目前小伙伴们对“状态机 代码”可能比较注重,大家都需要分析一些“状态机 代码”的相关文章。那么小编同时在网摘上搜集了一些对于“状态机 代码””的相关文章,希望看官们能喜欢,同学们一起来了解一下吧!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 实现两种方式。函数式实现时,省略了状态转移的属性传递,在实现同样功能上,函数式的代码更少。所以,能用函数式实现的地方,统统使用函数式吧。
我是【明哥我来】,坚持输出技术、副业和生活感悟,欢迎关注,一起走向财富自由。
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #状态机 代码