亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

發布時間:2021-06-15 10:00:42 來源:億速云 閱讀:357 作者:小新 欄目:web開發

這篇文章主要介紹typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

本文就提供一種思路,通過狀態機來簡化復雜的 if else 代碼邏輯。

讀完本文,你會了解到:

  • 什么是狀態機

  • 什么是狀態自動機

  • typescript 源碼是怎么利用狀態機使流程更清晰的

  • 詞法分析中的狀態機

  • 業務代碼中如何使用狀態機

什么是狀態機

當處理的情況特別多,我們把每種情況的處理邏輯封裝成一個狀態,然后不同情況之間的轉換變成狀態的轉換。這種代碼組織形式就是狀態機。

當每個狀態知道輸入某一段內容時轉到哪一個狀態,在一個循環內自動進行狀態的流轉和不同狀態的處理,這種叫做狀態自動機(automation),如果一個狀態在一種輸入下只有一個后續狀態,這種就叫做確定性有限狀態自動機(DFA)。

狀態之間的流轉可以通過狀態轉換圖來表示。

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

typescript 源碼中的狀態機

typescript compiler 就是通過狀態機來組織整個編譯流程的:

首先 tsc 劃分了很多狀態,每種狀態處理一種邏輯。比如:

  • CreateProgram 把源碼 parse 成 ast

  • SyntaxDiagnostics 處理語法錯誤

  • SemanticDiagnostics 處理語義錯誤

  • Emit 生成目標代碼

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

typescript 就通過這種狀態的修改來完成不同處理邏輯的流轉,如果處理到結束狀態就代表流程結束。

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

這樣使得整體流程可以很輕易的擴展和修改,比如想擴展一個階段,只要增加一個狀態,想修改某種狀態的處理邏輯,只需要修改下狀態機的該狀態的轉向。而不是大量的  if else 混雜在一起,難以擴展和修改。

可以看到,狀態機使得 typescript 的編譯步驟可以靈活的擴展和修改。

詞法分析中的狀態機

其實狀態機最常用的地方是用于詞法分析,因為每個 token 都是一種處理情況,自然會有很多 if else。

像下面這樣用 if else 來做分詞自然也可以,這是 wenyan 的詞法分析邏輯,但是代碼很難維護。

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

更好的做法是使用狀態機(DFA)來做分詞,把每一種 token 的處理封裝成一個狀態。通過邊界條件的判斷來做狀態流轉,比如某個 wxml parser  分了這些狀態:

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

每種狀態處理一種情況的 token 的識別:

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

通過狀態的變化驅動處理邏輯的流轉:

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

這樣不斷的進行各狀態之間的流轉,當處理到字符串的末尾的時候,就完成了所有的分詞。

業務代碼中的狀態機

業務代碼中當遇到各種 if else  的判斷的時候同樣可以用狀態機來優化。把每種情況封裝成一個狀態,通過某一種條件觸發狀態的流轉,然后在狀態機里面選擇不同的狀態處理邏輯進行處理。

typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯

不管是游戲中不同狀態做不同的處理邏輯,還是在 ui 項目中不同狀態做不同的渲染,當代碼邏輯復雜時,難免會有很多 if  else,這時候都可以用狀態機的思路來做優化。

這樣,當后續擴展處理邏輯、修改不同條件下的處理邏輯都變得簡單和清晰很多。

總結

我們首先明確了狀態機的概念:通過不同狀態封裝不同情況的處理邏輯,通過狀態的修改來完成處理邏輯之間的流轉。

如果每種狀態都知道下一個狀態是什么,在一個循環內自動完成狀態流轉的狀態機,就是狀態自動機,當狀態為有限個時,就是有限狀態自動機(DFA)。

typescript compiler  就是通過狀態自動機來進行處理,封裝了很多個狀態,每個狀態知道下一個狀態是什么,直到處理到終止狀態,就結束編譯。

詞法分析中一般會使用有限狀態自動機(DFA)來處理,不同 token  用不同的狀態來處理,通過輸入字符的不同來做狀態的流轉,處理完字符串就完成了分詞。

業務代碼中也經常會有不同情況做不同的處理,這些情況在一定的條件時會做轉換的場景,比如類似開始、暫停、結束、重新開始這種。這種代碼就很適合用狀態機來優化,不然會有很多的  if else。

總之,當邏輯可以劃分為不同的情況,各種情況之間會相互轉換的時候就可以用狀態機來優化,能夠免去大量的 if  else,并且代碼的可讀性、可擴展性、可維護性都會有一個很大的提升。

以上是“typescript源碼中怎么用狀態機簡化代碼中復雜的If Else邏輯”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芒康县| 霍城县| 迭部县| 昂仁县| 哈尔滨市| 盐城市| 资阳市| 孝昌县| 宁河县| 张家口市| 精河县| 凤冈县| 溆浦县| 长岭县| 藁城市| 邵东县| 泽普县| 庆云县| 稻城县| 松桃| 容城县| 黑龙江省| 乐平市| 抚州市| 边坝县| 汨罗市| 马鞍山市| 湖州市| 龙口市| 城步| 昌邑市| 郧西县| 沈阳市| 越西县| 遂川县| 尚义县| 祁阳县| 忻州市| 明星| 云霄县| 乌苏市|