spring statemachine的企业可用级开发指南1-说些废话
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1、背景
????在我打算學(xué)習(xí)spring statemachine的時(shí)候,我?guī)缀蹩催^了所有網(wǎng)上的中文教程,基本上都處于淺嘗輒止的階段,有幾篇講的比較深入的,都只是堆代碼,具體用在什么地方,都語焉不詳,我打算把我一路摸索的過程記錄下來,方便大家能繼續(xù)前行。
2、spring statemachine是干啥用的
????spirng statemachine是干啥用的,這個(gè)其實(shí)是個(gè)問題來的,但很多的教程的問題也在這,一上來就是告訴你有這么個(gè)玩意,然后就是開始怎么安裝,怎么運(yùn)行,功能有哪些,特性列起來,但就不告訴你這個(gè)東西能干啥,所以我打算在把spring statemachine跑起來之前,先說下spring statemachin能干啥。讓我們先看下狀態(tài)機(jī)的概念。
????有限狀態(tài)機(jī)(英語:finite-state machine,縮寫:FSM),簡稱狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型。應(yīng)用FSM模型可以幫助對(duì)象生命周期的狀態(tài)的順序以及導(dǎo)致狀態(tài)變化的事件進(jìn)行管理。將狀態(tài)和事件控制從不同的業(yè)務(wù)Service方法的if else中抽離出來。FSM的應(yīng)用范圍很廣,對(duì)于有復(fù)雜狀態(tài)流,擴(kuò)展性要求比較高的場(chǎng)景都可以使用該模型。下面是狀態(tài)機(jī)模型中的4個(gè)要素,即現(xiàn)態(tài)、條件、動(dòng)作、次態(tài)。
現(xiàn)態(tài):是指當(dāng)前所處的狀態(tài)。
條件:又稱為“事件”。當(dāng)一個(gè)條件被滿足,將會(huì)觸發(fā)一個(gè)動(dòng)作,或者執(zhí)行一次狀態(tài)的遷移。
動(dòng)作:條件滿足后執(zhí)行的動(dòng)作。動(dòng)作執(zhí)行完畢后,可以遷移到新的狀態(tài),也可以仍舊保持原狀態(tài)。動(dòng)作不是必需的,當(dāng)條件滿足后,也可以不執(zhí)行任何動(dòng)作,直接遷移到新狀態(tài)。
次態(tài):條件滿足后要遷往的新狀態(tài)。“次態(tài)”是相對(duì)于“現(xiàn)態(tài)”而言的,“次態(tài)”一旦被激活,就轉(zhuǎn)變成新的“現(xiàn)態(tài)”了。
? ? 這是狀態(tài)機(jī)的定義,這個(gè)我不打算多說,因?yàn)楦拍钚缘臇|西,諸位請(qǐng)自行搜索,那么在實(shí)際應(yīng)用中,狀態(tài)機(jī)會(huì)應(yīng)用在什么地方呢?不知道大家怎么想,我在接觸到狀態(tài)機(jī)的時(shí)候,第一時(shí)間想到的就是訂單和審批公文,這是我在工作中實(shí)際遇到的場(chǎng)景,所以我學(xué)習(xí)spring statemachine的主要?jiǎng)恿σ彩菫榱四芴幚磉@兩種情況。因?yàn)橛唵魏蛯徟亩加泻芏嗟牧鞒?#xff0c;每個(gè)流程都會(huì)產(chǎn)生狀態(tài)的變化,而且流程是這種業(yè)務(wù)的主軸,其他都是圍繞這個(gè)流程和狀態(tài)變化來考慮的,所以看起來蠻適合用狀態(tài)機(jī)來做。
? ? 那是不是一定要用狀態(tài)機(jī)來做呢,這可不一定,因?yàn)樵跊]有狀態(tài)機(jī)之前的訂單流程大家也能實(shí)現(xiàn),這世界缺了誰都正常運(yùn)轉(zhuǎn),所以狀態(tài)機(jī)不是必須的,在可以用狀態(tài)機(jī)解決這種流程和狀態(tài)變化的場(chǎng)景下,為什么要用,這是另外一個(gè)問題,因?yàn)榭梢杂煤蜎Q定用之間,還有個(gè)問題,那就是用這個(gè)有啥好處呢?
3、spring statemachine的好處
? ? 在做軟件項(xiàng)目的時(shí)候,我們會(huì)以各種各樣的角度看一個(gè)項(xiàng)目,比如OOP,萬物皆對(duì)象,一個(gè)訂單就是一個(gè)對(duì)象,所謂的狀態(tài)變化,無非就是訂單這個(gè)對(duì)象的變量在不停的變化,變化的過程就是對(duì)象的方法;再比如數(shù)據(jù)庫,萬物無非CRUD的組合,訂單不過就是增刪改查,數(shù)據(jù)庫原子操作的組合罷了。這些角度對(duì)嗎?可以說都對(duì),因?yàn)橛眠@些角度都有人做出了項(xiàng)目,但有些角度對(duì)項(xiàng)目的理解會(huì)比較方便,有些角度就比較費(fèi)勁,比如訂單,如果是訂單的生成查看,用CRUD就是很適合,因?yàn)檫@個(gè)角度很契合;如果是訂單和商品的關(guān)系,訂單和其他業(yè)務(wù)的關(guān)聯(lián),OOP的角度就很適合,因?yàn)橛梅庋b、多態(tài)的視角比較容易看清楚這類業(yè)務(wù)和他們之間的邊界,方便劃分各自的功能。而狀態(tài)機(jī)的角度,就是以狀態(tài)變化和流程運(yùn)轉(zhuǎn)為角度切入看問題,所以對(duì)于流程性為主軸的項(xiàng)目就很適合,所以是不是用spring statemachine,衡量的標(biāo)準(zhǔn)就是,這個(gè)項(xiàng)目的主軸,或者場(chǎng)景是不是一個(gè)流程性、狀態(tài)變化為主的項(xiàng)目,如果是,就可以考慮用spring statemachine了。
? ? 這個(gè)問題其實(shí)還沒回答完,上面說的其實(shí)是在什么情況下用spring? statemachine,但還沒回答好處在哪里。要回答這個(gè)問題,要從軟件項(xiàng)目的一些特質(zhì)說起。上面說了,軟件項(xiàng)目其實(shí)有很多的辦法完成,手段很多,完成的情況也各有優(yōu)劣,那怎么判斷用什么辦法好呢,我覺得答案就是看項(xiàng)目主要解決的問題是什么。軟件項(xiàng)目既不是程序員練手的工具,也不是老板用來蒙錢的門面,它是用來解決問題的,所以能清晰的表達(dá)問題,解決問題的手段就是好的技術(shù)手段,所以,如果一種技術(shù)手段很清晰的表達(dá)了軟件項(xiàng)目的問題和解決方法,那么這就是這個(gè)技術(shù)最大的好處,而狀態(tài)機(jī)對(duì)于流程性、狀態(tài)變化的場(chǎng)景,它就是一個(gè)清晰的表達(dá)方式,這就是它的好處。
? ? 這樣說可能有些朋友會(huì)不以為然,一個(gè)技術(shù)框架的好處難道不是功能強(qiáng)大,使用方便,性能卓越這些東西嗎。我的理解是上面說的這幾點(diǎn)都很重要,但都是次一級(jí)的問題,能清晰的表達(dá)問題和解決問題的,才是核心的好處。在《人月神話》的《沒有銀彈》這篇文章里面就提到過軟件特性的根本困難和次要困難,而對(duì)問題的表達(dá)和解決其實(shí)就是對(duì)需求的準(zhǔn)確描述和實(shí)現(xiàn),這就是軟件開發(fā)的根本困難,所以能夠清晰表達(dá)這個(gè)的技術(shù)框架,就是解決根本困難的好工具,項(xiàng)目技術(shù)選型最重要的好處考量。至于功能、性能這些,都是次要問題,雖然spirng statemachine在次要問題上也并沒有什么缺陷。
? ? 好了,廢話時(shí)間結(jié)束,下一章,我們正式開始第一個(gè)例子,運(yùn)行一個(gè)demo,請(qǐng)大家期待,因?yàn)檫@個(gè)例子真的沒啥用:)
?
轉(zhuǎn)載于:https://my.oschina.net/u/173343/blog/3043965
總結(jié)
以上是生活随笔為你收集整理的spring statemachine的企业可用级开发指南1-说些废话的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文了解 Apache Flink 核心
- 下一篇: (1)计算机的组成及其功能