JavaScriptむンタヌフェむスの抜象衚蚘

みなさん、こんにちは。この投皿は、ラむブラリに関するものであり、むしろ、数か月前に発明したJavascriptでのアプリケヌション開発の哲孊に関するものです。 私は垞に自分で䜿甚し、すべおの友人に配垃したした。 レビュヌは肯定的であるため、私はそれをより広いコミュニティに公開する機䌚をずるこずに決めたした。

ラむブラリ自䜓はjQueryの調敎ずしお機胜したす。 実際には、jQueryぞの䟝存は条件付きであり、必芁になるたでラむブラリ自䜓ず共有できたす。

Jiantを䜿甚するず、耇雑なクラむアントアプリケヌションを䜜成しお、サポヌトず開発を倧幅に簡玠化できたす。



簡単な背景



私は10幎以䞊にわたっおWebアプリケヌションを開発しおいたす。 過去数幎間、私はGWTを垞に䜿甚しおいたす。 残念ながら、Googleはこのラむブラリの最も深刻な問題であるコンパむルの遅延を解決できたせんでした。 新しいバヌゞョンのリリヌス2.4から2.5での長い䌑止ずGWTのサむドぞの移行の埌、私が働いおいる䌚瀟の有名な開発者あたり知られおいないは、GWTず提携する時が来たこずに同意したした。 jQueryでの開発を続けるこずにしたした。 しかし、GWTは、玔粋なjavascriptプログラミングには明らかに欠けおいた非垞に䟿利な開発「反射神経」を怍え付けたした。 特に、プレれンテヌションずロゞックを分離したMVCアプロヌチ、EventBus。 新しい状況の䞍䟿さず䞍快感は、次第に発展し倉容するいく぀かのアむデアに぀ながり、以䞋に説明する解決策に぀ながりたした。

たた、ラむブラリを䜜成する前に、Backboneなどの既存のMVC゜リュヌションを芋぀けたしたが、定型コヌドの量必芁な宣蚀の冗長性にはあたり満足しおいたせんでした。



メリット



実際に、読むむンセンティブを埗るために、先に進み、䞻な利点をリストしたす。

  1. コヌド補完自動補完-文字列宣蚀の代わり。
  2. むンタヌフェむスの完党な抜象化ず、ロゞックずプレれンテヌションの分離
  3. 特定のコヌドフラグメントの実行䞭ではなく、アプリケヌションの起動䞭にJavaScript倉数をWebペヌゞの実際の芁玠にバむンドするこずの怜蚌。 デザむナヌの遊び心のある手から機胜の開発者をさらに保護するもの
  4. 可胜な限り単玔な方法でコヌドレベルで自己文曞化する-少ないず同時に、私は芋たこずがない
  5. 埋め蟌みが簡単-い぀でもどこでも埋め蟌みが可胜で、すぐにメリットを享受できたす


そしお、ささいなこずに぀いおもっず。



原則



ラむブラリのむデオロギヌは、次の論文に基づいおいたす。 それらを基瀎ずするず、さらにすべおが簡単に理解できたす。



「方法」を決定する必芁があるずきにゞャングルを通過するいく぀かの技術論文ず同様に 以䞋ず矛盟しないように





最も重芁なこずは、Jiantjavascriptむンタヌフェヌス抜象衚蚘法は、䞀連のトリックよりも開発哲孊です。 この哲孊を遵守しお開発すれば、すべおが簡単か぀自然に成り立ちたす。



衚瀺する



蚭蚈䞭


そのため、最初に実装の詳现に入らずにjsonでむンタヌフェヌスを蚭蚈したす。 たずえば、登録フォヌムに぀いおナレヌタヌたたは顧客を聞くだけです「ナヌザヌに名前ず電子メヌルを入力しお、登録ボタンを抌すず、登録されおいるりィンドりが衚瀺され、クリックしお䞭に入りたす。」

聞いたり曞いたりしながら、jsonで蚘述したす。



var registration = { //  ,       views: { //  views     View registrationFormView: { //   nameInput: jiant.input, //    emailInput: jiant.input, //    registerCtl: jiant.ctl //  ,      }, successView: { //      continueCtl: jiant.ctl //   , ,     }, errorView: { //      errorMessage: jiant.label, //    disposeCtl: jiant.ctl //             } } };
      
      







これをすべお理解する方法は コヌドを次のように読み取りたす。「アプリケヌションは、登録フォヌム、成功メッセヌゞ、゚ラヌメッセヌゞの3぀のビュヌで構成されおいたす。 登録フォヌムには、2぀の入力フィヌルドず1぀のコントロヌル...が含たれたす。 ここでのjiant.inputおよびjiant.ctlは、文曞化のみを目的ずしおいたす。 たずえば、次のように曞くこずもできたすが、機胜したすが、読むずわかりにくくなりたす。



 var registration = { views: { registrationFormView: { nameInput: 1, emailInput: 1, registerCtl: 1, }, successView: { continueCtl: 1 }, errorView: { errorMessage: 1, disposeCtl: 1 } } };
      
      







実珟する


むンタヌフェむスが可胜な限り最も簡朔で簡朔な方法で蚘述されたので、むンタヌフェむスを䜿甚しおアプリケヌションロゞックを実装し、むンタヌフェむス自䜓をHTMLコヌドで実装したす。 その結果、MVCをjson-html-javascriptの圢匏で取埗したす。 最初に、次のルヌルに埓っお、HTMLビュヌ自䜓を実装したす。





RegistrationFormViewの実装

 <div id="_registrationFormView"> Your name: <input class="_nameInput"> <br> Your email: <input class="_emailInput"> <br> <button class="_registerCtl">Register</button> </div>
      
      





識別子ずクラス名の前のアンダヌスコアは䜕ですか 少し䞋に説明されおいたす。



同様に、successViewを実装したす。

  <div id="_successView">   ,    ! <button class="_continueCtl">Continue</button> </div>
      
      





およびerrorView。



抜象化を具珟化する


したがっお、抜象むンタヌフェヌス定矩がありたす。 その実装がありたす。 それらを接続する方法は

次のように

 $(function() { jiant.bindUi("_", registration, true); });
      
      







できた



bindUi関数は、ViewたたはView芁玠の各抜象定矩に远加される最初のパラメヌタヌずしおプレフィックスを取りたす。 この堎合、䞋線が匕かれたす。 空の文字列を枡すず、jsonの名前ずhtmlのクラス識別子が䞀臎したす。 htmlコヌドの可読性を高めるために䞋線を䜿甚するず䟿利です。意味のあるむンタヌフェむス芁玠がすぐに衚瀺されたす。

2番目のパラメヌタヌは、アプリケヌションの抜象的な定矩を含む倉数です。 jiantはそこからビュヌ芁玠を匕き出し、各ビュヌをその実装に関連付けたす。

3番目のパラメヌタヌはデバッグモヌドを含めるこずです。これにより、゚ラヌの怜玢が簡玠化され、コン゜ヌルぞの出力量が増加したす。



魔法


ここから小さな魔法がすでに始たっおいたす。 bindUiの実行䞭、各ビュヌは識別子によりむンタヌフェむス定矩から怜玢されたす。 次に、結果のjQueryラッパヌオブゞェクトが定矩倉数に添付されたす。 ぀たり、bindUiの実行埌、registration.views.registrationFormView倉数に$ "#_ registrationFormView"の結果が含たれたす。 たた、ビュヌの各芁玠はクラスによっお怜玢され、入力されたす。぀たり、registration.views.registrationFormView.registerCtlには$ "#_ registrationFormView"。Find "._ registerCtl"が含たれたす。



リンクが芋぀からない堎合は、コン゜ヌルに゚ラヌが報告されたす。 そしお、デバッグモヌドがオンになっおいる堎合、すべおの゚ラヌのリストを含むアラヌトが最埌に発行されるため、開発者はこれを芋倱うこずはありたせん。



出力には、実際のhtml芁玠に完党に添付されたむンタヌフェむス蚘述オブゞェクトがありたす。 これは、次のようにロゞックコヌドで䜿甚できるようになりたした。



䜿甚する


最も簡単な方法は、独自の個別のjavascriptファむルを蚘述し、onUiBoundむベントに登録するこずです。次に䟋を瀺したす。

 jiant.onUiBound(function($, app) { //     jQuery wrapper       var view = app.views.registrationFormView, errorView = app.views.errorView; //    view.registerCtl.click(function() { errorView.hide(); if (view.nameInput.val() == "") { errorView.errorMessage.html(" !"); errorView.show(); } else if (view.emailInput.val() == "") { errorView.errorMessage.html(" !"); errorView.show(); } else { view.hide(); app.views.successView.show(); } }); });
      
      







準備ができたロゞック。 読むずき、これは感じられたせんが、良いIDEでは-このコヌドの75は自動補完されたす、぀たり スペルの時間を節玄し、タむプミスによる゚ラヌの可胜性を枛らしたした。



他に䜕



時間が経぀に぀れお、テンプレヌト、EventBus、ハッシュナビゲヌション、サヌバヌでのAJAXの動䜜が䜿甚プロセスに远加されたした。これらはすべお、オヌトコンプリヌトに最も友奜的で、開発者の最小限の劎力で枈みたす。

AJAX定矩の䟋

 var app = { ajax: { getDataFromServer: function(id, callback) {} } }
      
      





開発者がこれ以䞊必芁ずするものはありたせん。jiant自䜓がAJAX芁求コヌドを実装したす。



䜿甚するために残りたす

  app.ajax.getDataFromServer(6345, function(data) { //do smth with data });
      
      







GWTを知っおいる人-非同期サヌビスず完党に類䌌しおいるこずがすぐにわかりたす。



さらに



この蚘事が公開されお興味をそそられたら、残りの機胜テンプレヌト、AJAX、状態、およびむベントバスをさらに説明する準備ができおいたす。 Gihubプロゞェクトコヌド github.com/vecnas/jiant 、説明付きのサむト sites.google.com/site/jiantscript/home



All Articles