Python WebむンタヌフェヌスでのKAFSMの経隓

はじめに


最近、1぀のプログラムにWebむンタヌフェむスを添付する必芁がありたした。

より正確には、Webむンタヌフェむスはすでに存圚しおいたせんでしたが、䞀方向にしか機胜せず、プログラムコアの結果を提䟛しおいたした。 そしお、双方向性を導入する必芁がありたした。



元の圢匏のプログラムは、XMLファむルで蚘述されたスキヌムの特定のブロックの衚珟をグラフィカル衚珟に倉換したした。 このプログラムのコアはXMLファむルを読み取り、これらのファむルに蚘述されおいるブロック図ブロックをオブゞェクトに衚瀺し、これらのオブゞェクトから画像を描画しおブラりザヌで衚瀺したした。



新しい芁件に埓っお、むンタラクティブな線集を远加する必芁がありたした。 そしおこれは、リンク、フォヌムを远加し、゚ラヌを凊理し、それらに関するメッセヌゞを発行し、フォヌムに入力されたデヌタを確認し、履歎を移動できるようにするブラりザヌボタンを考慮する必芁があるこずを意味したす。 そしお最も重芁なこずは、これらすべおを混同しないでください。



フロヌチャヌトを描く耇雑なプログラムの習慣がありたす。 プログラムの䜍眮を特定できる状態、プログラムが応答するむベントボタンを抌すなど、およびある状態から別の状態ぞの遷移が衚珟されおいるモヌドで動䜜するプログラムの堎合、有限状態マシンたたは宇宙船の抂念は理想的です;海倖では、これはFSMたたはFinitステヌトマシン。 か぀おDOSの䞋でも、SC状態図の図を描いたずきだけ、1぀の掗緎されたプログラムのメニュヌがわかりたした。



宇宙船ステヌトマシンずは


それが䜕であるかを知っおいる人は、このセクションを安党にスキップできたす。



KA、これはオヌトマトンの操䜜の蚘述に察するそのようなアプロヌチです。 それは、図に描かれた状態を、内偎に碑文が描かれた円の圢で瀺し、遷移は円の状態を結ぶ矢印の圢で描かれたす。 矢印は、同じ状態に戻るのず同じトリックを実行できたす。 通垞、矢印にも名称がありたす。



実際、宇宙船の仕事は、ある状態から別の状態ぞの移行で構成されおいたす。



この堎合、宇宙船アプロヌチのアプリケヌションは䜕を提䟛できたすか


この堎合、これはWebむンタヌフェヌスの操䜜を説明するためのものです



-読みやすいむンタヌフェヌス状態図を描くこずができたす。

-この図で敎理されたコヌドを曞くこずができたす。

-コヌドからチャヌトぞ、たたはその逆に簡単に移動できたす。

-状態ずアクションを理解/远加/削陀しやすい。

-むンタヌフェむスのすべおの遷移を比范的簡単にカバヌできるため、テストが簡単になりたす。

-状態テヌブルを簡単に䜜成できるため、テストが簡単になりたす。



氎曜日


この゜フトりェアの開発時には、次の゜フトりェアが䜿甚されたした。

蚀語Python 2.5.4

WebサヌバヌCherrypy 3.1.1



コヌドの実装ず操䜜


KAコヌド線成


cherrypyがWebサヌバヌずしお䜿甚されたずいう事実により、コヌドの線成に関するいく぀かの芁件が決たりたした。



コヌドは次のように線成されたした。Webむンタヌフェヌス党䜓がHomePageクラスに実装されおいたす。

WebむンタヌフェむスずKA、indexメ゜ッドの䞡方の節点



KAはHomePageクラスにも実装されおいたす。 宇宙船のコヌドは3぀の郚分に分けるこずができたす。



1. indexメ゜ッドのコヌド。 ブラりザから「tostate」パラメヌタを受け取り、制埡メ゜ッドを呌び出しお、宇宙船の制埡ルヌプを実装したす。



2.宇宙船の制埡方法。 fsm_transitionself、to_state、fsm_process_methodsself、fsm_data



3. KAデヌタディクショナリself.fsm_trans。



4.宇宙船のむンタヌフェヌスメ゜ッド。 これらは、宇宙船のある状態から別の状態ぞの移行時に呌び出され、これらの移行䞭に必芁な特定のアクションを実行するメ゜ッドです。



KAデヌタ蟞曞


宇宙船デヌタディクショナリを䜿甚しお、コヌド操䜜の説明を開始するこずをお勧めしたす。 ここにありたす



 self.fsm_trans = {
     1
     'init_logo'{'type' 'Show'、 'methods'[self.fsm_logo_show]}、
     2
     「logo_logo」{「タむプ」「衚瀺」、「メ゜ッド」[self.fsm_logo_show]}、
 .......
     6
     「pg1_prj_select_page」{「タむプ」「衚瀺」、「メ゜ッド」[self.fsm_project_set_dir、
                                                 self.fsm_diag_files_rm、
                                                 self.fsm_project_page_algor_start、
                                                 self.fsm_set_cur_page_algor_first_page、
                                                 self.fsm_set_cur_block_first_block_of_page、
                                                 self.fsm_create_cur_page_diag_files、
                                                 self.fsm_page_show]}、
 .....

     29
     'f3_pg_block_edit_check_pg_block_edit'{'type' 'Act'、 'methods'
                                                [self.fsm_pg_block_edit、
                                                  self.fsm_diag_files_rm、
                                                  self.fsm_create_cur_page_diag_files、
                                                  self.fsm_page_cur_save、
                                                  self.fsm_go_to_page]}、
 .....




蟞曞キヌ これは、元の状態ず次の状態の2぀の状態の名前で構成される文字列です。 初期状態は、スペヌスクラフトによっおself.fsm_prev_state倉数に蚘憶され、次はブラりザのリク゚ストパラメヌタから取埗されたす。 たずえば、「1」で瀺される遷移の堎合、初期状態は「init」、次は「logo」、キヌは「init」+「_」+「logo」ずしお取埗されたす



ここでもキヌは蟞曞です。 「タむプ」ず「メ゜ッド」の2぀のキヌがありたす。



キヌ「タむプ」は、次の状態のタむプを瀺したす。 「衚瀺」ず「実行」の2぀の状態タむプがありたす。 タむプ「衚瀺」は、これが生成されたHTMLペヌゞの衚瀺状態であり、ブラりザからの次のリク゚ストを埅っおいるこずを意味したす。 タむプ「Act」は、この状態を停止する必芁がないこずを意味したす。 次の状態に進む必芁がありたす。



宇宙船のメ゜ッドのむンタヌフェヌス名の配列は、「methods」キヌによっお芋぀けられたす。 実際、これは、ある状態から別の状態ぞの移行䞭に実行する必芁がある䞀連の有甚なアクションです。 さらに、タむプ 'Show'の堎合、配列の最埌のメ゜ッドは生成されたHTMLペヌゞを返し、タむプ 'Act'の堎合-目的の状態の名前を返したす。



indexメ゜ッドのCAコヌド


 1 @ cherrypy.expose
 2 defむンデックスself、block = ''、tostate = ''、page = ''、project = ''、** data
     .......
 3詊行
 4FSMは次の状態に進む
 5 fsm_data = self.fsm_transitionself.http_param ['tostate']
 6「tostate」パラメヌタヌがこの状態に察しお有効でない堎合
 KeyError、error_detailを陀く7
 8 return self.fsm_error_show 'KeyError' + strerror_detail
 9 processing_result = self.fsm_process_methodsfsm_data
 10がTrueの堎合
 11タむプが 'Show'の堎合、HTMLペヌゞを返す 
 12 fsm_data ['type'] == 'Show'の堎合
 13 return processing_result
 14タむプが「Act」の堎合、FSMは次の状態に
 15状態の名前はprocessing_resultにありたす
 16 fsm_data ['type'] == 'Act'の堎合
 17 fsm_data = self.fsm_transitionprocessing_result
 18 processing_result = self.fsm_process_methodsfsm_data
   




このメ゜ッドは、リク゚ストから「tostate」パラメヌタヌを取埗したす。 その埌、5行目のself.fsm_transitionメ゜ッドは、状態タむプShow | ACtず実行甚のメ゜ッドの配列を含むデヌタディクショナリからディクショナリを返したす。



キヌ゚ラヌの堎合、すなわち この状態から目的の状態に切り替えるこずはできたせんが、䟋倖ずしお、SCは「゚ラヌ」状態に切り替わりたす。 たずえば、ブラりザが履歎に沿っおいく぀かのステップを返され、任意のリンクをクリックした堎合、重芁な゚ラヌが発生する可胜性がありたす。 この堎合、

HTMLブラりザヌによっお衚瀺されるペヌゞは宇宙船の状態に察応しおおらず、リク゚ストには珟圚の状態からの遷移が存圚すべきでない状態ぞの遷移が必芁な堎合がありたす。



9行目では、self.fsm_process_methodsfsm_dataメ゜ッドは遷移メ゜ッドの配列を凊理し、最埌のメ゜ッドがメ゜ッド配列から返した倀を返したす。 「Show」タむプの堎合、これはペヌゞのHTMLコヌドであり、「index」メ゜ッドはそれを返し、サヌバヌはそれをブラりザヌに枡したす。

タむプが「Act」の堎合、これは次の状態の名前です。17行目で宇宙船を次の状態に倉換し、18行目で遷移メ゜ッドを凊理したす。



宇宙船の制埡方法


 FSMメ゜ッド
 def fsm_transitionself、to_state
     「」
     FSMの状態を状態に倉曎したす
    決定事項を提䟛する
    匕数
     to_state-移動先の州
    戻り倀
     「」
     叀い状態を蚘憶する
     self.fsm_prev_state = self.fsm_state
     self.fsm_state = to_state
     蟞曞から戻り倀を取埗
    キヌ= strself.fsm_prev_state+ '_' + strself.fsm_state
     self.fsm_return = self.fsm_trans [キヌ]
     self.fsm_returnを返す

 def fsm_process_methodsself、fsm_data
     「」
     fsm_data蟞曞を取埗し、関数を凊理し、
     htmalたたは次の状態を返す
    匕数
     fsm_data-self.fsm_transitionの戻り倀から取埗した蟞曞
     self.fsm_trans蟞曞から取埗されたす
    戻り倀
    ケヌス 'タむプ'のhtmlテキスト '衚瀺'
    ケヌス 'type'の次の状態の名前 'Act'
     「」
     last_func = lenfsm_data ['methods']
     i = 0
     fsm_data ['methods']のメ゜ッドの堎合
         i + = 1
         i == last_funcの堎合
             return method最埌の関数は戻り倀を返す
        メ゜ッド




ここでは、すべおが些现なこずだず思いたす。



むンタヌフェむスメ゜ッドの凊理方法の遞択に぀いお


メ゜ッドを配列に栌玍する特別な理由はありたせん。 遷移ごずに、ネストされたむンタヌフェむスメ゜ッドが呌び出される独自のメ゜ッドを持぀こずは完党に可胜です。



䞊蚘の凊理方法は、コヌドを読みやすくするために、むンタヌフェむス関数ぞのすべおの呌び出しを1぀の堎所で同じネストレベルにするために、意図的に遞択されたした。 実装されたコヌドでは、宇宙船の印刷されたチャヌトを取埗し、宇宙船のデヌタディクショナリのコヌドを䜿甚しお、1぀からの遷移に察しお実行されるアクションのチェヌンを確認できたす。

別の状態。



おわりに


蚭蚈に宇宙船を䜿甚したアプロヌチを適甚するこずで、柔軟で読みやすく、透明で簡単にサポヌトできるコヌドを曞くこずができたず思いたす。



付録宇宙船図の䟋実際の図の断片


画像







All Articles