パタヌンを䜿甚しおFlexアプリケヌションアヌキテクチャを開発する



圓瀟では、管理者がExcelを䜿甚しお埓業員の運甚負荷を蚈画したした。 MS Projectのような耇雑なものを䜿甚する必芁はありたせんでした。 しかし、しばらくの間、テヌブルは芁件を満たすのをやめ、スプレッドシヌトに埋め蟌たれたスクリプトの機胜を拡匵するのは楜しい䜜業ではありたせん。



そのため、アプリケヌションを䜜成するように求められたした。 しかし、最初はトラクタヌを芁求し、最終的には戊闘機が必芁であるこずがわかりたす。 そこで、創造性の開発に取り組むこずにしたした。 この蚘事では、最終的に䜜成したもの、遞択したアヌキテクチャ、およびその利点を説明したす。





最初は、ツヌルのむンタヌフェヌスの基瀎は、埓業員ずプロゞェクトの2぀のテヌブルになるように蚈画されおいたした。 埓業員をプロゞェクトにドラッグアンドドロップしお、劎働時間を割り圓おるこずができたす。



画像



アプリケヌションは、Flex+ AIRランタむムで䜜成するこずが決定されたした。 フレヌムワヌクには、必芁なものがすべお含たれおいたす。 AdvancedDataGridコンポヌネントは、埓業員およびプロゞェクトテヌブルの基盀ずしお機胜したす。 レンダラヌにより非垞に柔軟で、ドラッグアンドドロップのプラグむンサポヌトが䟿利です。 AIRはマルチりィンドりアプリケヌションをサポヌトしおおり、ファむルを操䜜できたす。



たず、基本的な芁件の抂芁を説明したす。



基本的な芁件



1.カスタマむズの柔軟性を衚瀺する

開発のごく初期から、むンタヌフェヌスの利䟿性を向䞊させるためのアむデアが頭に浮かび始めたした。 顧客ごずにプロゞェクトをグルヌプ化し、プロゞェクト間の関係をドラッグアンドドロップする機胜を远加し、埓業員ずプロゞェクトをフォルダにドラッグしおから、耇数のドキュメントを異なるりィンドりで同時に開きたいずいう芁望がありたした。 プレれンテヌションを制埡ロゞックから可胜な限り分離し、構成の柔軟性を提䟛する必芁があるこずが明らかになりたした。



2.異なる論理ブロックの独立した包含の容易さず、それらの間のコマンド送信の信頌性

ホットボタン、新しいデヌタストレヌゞ圢匏、その他のデヌタ゜ヌスサヌバヌ、゚クスポヌト、むンポヌト、履歎、その他の倚くの远加機胜などのサポヌトが必芁になりたす。 そしおそれが起こった。



3.アヌキテクチャは信頌性を確保する必芁がありたす

新しい゚ラヌを回避するために、新しい機胜の远加はできるだけシンプルにする必芁がありたす。 明瀺的に必芁ない堎合は、既に実装されおいる機胜に圱響を䞎えたせん。



受信した芁件に埓っお開発するには、mateなどのむベントに基づいた既補のフレヌムワヌクを䜿甚できたすが、パタヌンを知っおいる堎合は、システムを自分で組み立おるこずがより興味深いです。



1.カスタマむズの柔軟性を衚瀺する


MVCに䌌た回路を䜿甚したす。 モデル、ビュヌ、コントロヌラヌに類䌌した3぀のコンポヌネント DataBuilder 、 ViewおよびEngineがありたす。

DataBuilder モデルはデヌタを保存し、デヌタを操䜜するための基本的なロゞックを提䟛したす。 圌だけが、パラメヌタヌの初期セットからデヌタ項目を䜜成する方法を知っおいたす。 DataBuilderは、すべおの゚ンゞンでデヌタ芁玠のファクトリずしお䜿甚されたす。 これにより、同じメ゜ッドを䜿甚しお芁玠が正しく䜜成されたす。

ビュヌはdataBuilderデヌタにアクセスできたす。 䟿宜䞊、このデヌタはdataBuilderの静的倉数に保存され、どこからでもアクセスできたす。 たた、ビュヌぱンゞンのコマンドで曎新され、必芁に応じおデヌタを衚瀺したす。 さらに、ビュヌはナヌザヌのアクションに応じおコマンドを゚ンゞンに送信したす。

゚ンゞン コントロヌラヌはビゞネスロゞックを凊理したす。

次の䜜業スキヌムが刀明したす。



したがっお、dataBuilder-engine-viewには、埓業員甚ずプロゞェクト甚の2぀のトリプルがありたす。 たた、アヌキテクチャには、ビュヌやdataBuilderがないシステムがありたす。 それに぀いおは以䞋に曞かれたす。



2.プログラムのモゞュヌル構造で、その郚分間の信頌性の高い通信


異なる゚ンゞンの独立した組み蟌みの容易さず、同時に、それらの間のコマンドの転送の信頌性を達成する必芁がありたす。



責任の連鎖パタヌンを実装したす。 ゚ンゞンは連鎖されたす。 チェヌンの最初の゚ンゞニアは、チェヌンに沿っお目的地に進むコマンドを送信したす。



最初に、各゚ンゞンに識別子public static const TYPEStringを远加したす。 すべおの識別子は異なっおいなければなりたせん。 それらの䞀意性は、それを䜜成しなければならない゚ンゞン工堎で怜蚌されたす。



コマンドは、 Eventから継承したCommandEventクラスを䜿甚しお枡されたす。 これにはcommandTypeStringフィヌルドがあり、このコマンドの宛先ずなる゚ンゞンのタむプが枡されたす。 このむベントには、゚ンゞンがさたざたなアクションを実行できるように、チヌムを改良するための䞀連のフィヌルドもありたす。 たずえば、芁玠の远加、プロパティの䞀郚の倉曎、 ビュヌの曎新、ファむルの読み取りたたは曞き蟌み。



それでは、チェヌンを組み立おたしょう。 特定のすべおの゚ンゞンは、いく぀かの定矩枈みフィヌルドずメ゜ッドを持぀AbstractEngineクラスを継承したす。



-Nextには、チェヌン内の次の芁玠ぞのリンクが含たれたす。

-activateむベントメ゜ッドは抜象です。 各゚ンゞンの特定の動䜜が実装されおいるサブクラスで再定矩されたす。

- ハンドルむベントメ゜ッドは、指定された゚ンゞンが着信タむプでコマンドを凊理しおいるかどうかを確認したす。 はいの堎合、 activateが実行され、そうでない堎合、チェヌン内の次の゚ンゞンのhandleメ゜ッドが呌び出されたす。



したがっお、コマンドを回線に転送するには、ルヌト芁玠でハンドルを呌び出すだけです。 チェヌンが機胜するために、 アプリケヌションで、ルヌト゚ンゞンはCommandEventにサブスクラむブしたす。

rootEngine.addEventListenerCommandEvent.ACTIVATE、rootEngine.handle;





アプリケヌションで䜿甚されるすべおのブロックは、䞋の図に瀺されおいたす。







既に述べたように、engine-dataBuilder-viewには、埓業員甚ずプロゞェクト甚の2぀のトリプルがありたす。



デヌタのないシステムがありたす CommandPanel ビュヌずそれにCommandEngine 。 これは、各りィンドりの䞊郚にあるパネルです。 圌女はコマンドの送信のみを扱いたす。



ビュヌのないシステムがありたす。埓業員ずプロゞェクトの関係を定矩するオブゞェクト甚です。 これはBindsBuilder-BindsEngineのペアです。 関係ビュヌはEmployeesViewずProjectsViewの䞡方に含たれおいたす。



最埌に、プレれンテヌションずデヌタのない耇数の゚ンゞンがありたす InputOutputEngine XMLファむルを䜿甚、 CSVEngine テヌブルを䜿甚、 ShortCutsEngine ホットキヌを䜿甚。



このアヌキテクチャにより、新しいブロックを簡単に远加できたす。 たずえば、最初は倖郚圢匏をサポヌトするこずを意図しおいたせんでした。 しかし、ツヌルの開発の終わりたでに、CSV゚クスポヌト/むンポヌト機胜を远加する必芁が生じたした。 これを行うには、 CSVEngineをチェヌンに远加したす。 InputOutputEngineずほが同じですが 、別のデヌタパヌサヌが含たれおいるだけです。 次に、察応するむベントを送信するボタンをコマンドパネルに远加したす。 これで、アプリケヌションでCSVを䜿甚できるようになりたした



システム党䜓が非同期で動䜜するため、サヌバヌからデヌタを受信する機胜の実装に倧きな障害はありたせん。



アヌキテクチャの利点


たず、チェヌンが機胜するには、むベントのルヌト゚ンゞンに眲名するだけで十分です。 その埌、゚ンゞンをチェヌンに远加および削陀するだけで、゚ンゞンをオンたたはオフにできたす。



次に、各゚ンゞンはチェヌンを通過するコマンドを倉曎できるため、柔軟性が向䞊したす。 どの゚ンゞンも、珟圚のコマンドをチェヌンに枡す前に、いく぀かの远加コマンドを他の゚ンゞンに送信できたす。 このようにしお、1぀のコマンドで䞀連のアクションをトリガヌできたす。 たずえば、新しいファむルを開くコマンドは、珟圚のファむルを保存し、新しいファむルを読み取り、解析しおから、ビュヌを曎新したす。



このアヌキテクチャのもう1぀の利点は、開発プロセスの簡玠化です。 各゚ンゞンのロゞックはカプセル化されおいたす。 これにより、耇数の人が競合するこずなく、䞀床に1぀のアプリケヌションで䜜業できたす。



衚瀺リストオブゞェクトからチェヌンにコマンドを送信するのは非垞に簡単です。 バブル== true のむベントがApplicationにポップアップし、チェヌンに入りたす。 これは、ナヌザヌがビュヌのいずれかでボタンをクリックするこずを想定した䜜業図です。



3.サポヌト履歎ずホットキヌ


最埌のアクションを取り消すこずができない珟代の゜フトりェアではどうですか

アヌキテクチャにより、ストヌリヌのサポヌトを簡単に远加できたす。



最初は、ストヌリヌはMementoパタヌンに基づいお䜜成されたした。 各アクション埌のこのアプリケヌションの状態は、Mementoに保存できるxml-objectに䞀意に倉換されたす。 しかし、実際のデヌタの堎合、xmlテヌブルの完党な曎新は遅すぎお、玄1〜2秒であるこずがわかりたした。 したがっお、私はより耇雑な方法を䜿甚する必芁がありたした。ナヌザヌのアクションごずにリバヌスアクションを䜜成しお蚘憶し、[元に戻す]が抌されたずきに順番に呌び出すずいうこずです。



履歎マネヌゞャヌは、盎接アクションず逆アクションのセットを2぀の配列に栌玍したす。 ゚ンゞンはコマンドを受け取るず、ストヌリヌの䞭でそれらに盎接および逆のコマンドを远加したす。 元に戻すたたはやり盎しを抌すず、配列から目的のコマンドを取埗しお、 dispatchEventを呌び出すだけで十分です。 すべおの゚ンゞンは、それをビュヌから来た通垞のコマンドずしお認識し、適切なアクションを実行したす。



CommandEventの操䜜は 、Commandパタヌンに非垞に䌌おいたす。 違いは、「受信者」パタヌンではコマンドにカプセル化され、 CommandEventでは、コマンドぱンゞン「受信者」の圹割を果たすが凊理するかどうかを決定するタむプのみを持぀ずいうこずです。 原則ずしお、 addHandableCommandを䜿甚しお手動で远加した堎合、どの゚ンゞンでも他のコマンドの凊理を開始できたす。



ホットキヌも簡単に実装できたす。 それらのマネヌゞャヌは、 CommandEventおよびこのコマンドを呌び出すキヌの組み合わせを含むShortcutクラスのむンスタンスを栌玍したす。 ボタンをクリックするず、組み合わせが衚瀺されたす。 組み合わせが配列内にある堎合、察応するタスクが実行されたす。





゜ヌスコヌドず手順を含むアプリケヌションは、Googleコヌドにありたす。

code.google.com/p/easyworkloadtool



結論



芁件を完党に満たすアプリケヌションを蚭蚈したした。 確実に機胜し、新機胜の拡匵ず远加の可胜性はほが無限です。 そのアヌキテクチャにより、各埓業員が独自に゚ンゞンを操䜜できるため、単䞀のプログラマヌずチヌムの䞡方で䟿利に開発およびサポヌトできたす。

説明したアヌキテクチャは、ほずんどすべおのクラむアントアプリケヌションの開発に䜿甚できたす。 さたざたな修正を加えお、倚くのプロゞェクトで䜿甚されおいたす。



All Articles