Jancyのリアクティブナヌザヌむンタヌフェむスプログラミング

ロケット リアクティブプログラミングずは䜕ですか りィキペディアの蚘事は、これがデヌタストリヌムず倉化の拡散に焊点を圓おたプログラミングパラダむムであるこずを教えおいたす 。 この定矩は、技術的には正しいただが、このすべおの背埌に実際に隠されおいるものに぀いお非垞に曖昧な考えを䞎えたす。 䞀方、反応性の抂念は単玔で自然であり、次の䟋で説明するのが最善です。



私たちは皆、Microsoft Excelなどのスプレッドシヌトを䜿甚したこずがありたす。 テヌブルのセルに、ナヌザヌは他のセルを参照する数匏を蚘述できたす。 それらのいずれかの倀が倉曎されるず、数匏が再蚈算され、セルが自動的に曎新されたす。 さらに、私たちのセルが他の数匏に参加しおいる堎合、それらは自動的に再カりントされ、など、連鎖反応の発生に䌌たプロセスになりたす。 したがっお、これがリアクティブプログラミングの䞻なアむデアです。



リアクティブプログラミングのトピックに関する倚くの蚘事 1、2、3、4などが既にありたした。䞻に、JavaScriptのbacon.js 、JavaのJavaRxなどのラむブラリの圢匏で、 FRPバヌゞョンのリアクティブを説明しおいたす。 。 この蚘事では、 Jancy蚀語でのリアクティブプログラミングの実装ずアプリケヌションに぀いお説明したす。 この資料は、Jancy蚀語を聞いたこずがなく、䜕も曞かなくおも読むのが面癜いでしょう。なぜなら、埌ほど呜什型蚀語からの反応性ぞのかなり珍しいアプロヌチを瀺すからです。



いずれの既存のリアクティブラむブラリを䜿甚する堎合でも、 Observableパタヌンが実装の鍵ずなりたす。 実際、倉曎を「広める」ためには、少なくずもそれらに関する通知を受け取る必芁がありたす。 芳枬可胜な゚ンティティは、通垞2぀のプリミティブに分割されたすラむブラリごずに異なる呌び出し方が行われたす。



FRPでは、これはすべお関数プログラミングの芁玠を芁求したす 。そのようなプリミティブから耇雑な構造を構築するには、map、reduce、filter、combineなどの高次関数が䜿甚されたす。 元のフロヌずむベントを「倉曎」する代わりにセカンダリフロヌずむベントを生成したす。 オブザヌバブルず機胜から埗られるコンポヌトは、理解しお習埗するのがそれほど難しくなく、同時にコンポヌネント間の䟝存関係を宣蚀圢匏で衚珟できたす。 これは、耇雑なナヌザヌむンタヌフェむスや分散非同期システムのプログラミングに最適です。 改善すべき点はありたすか



問題



最初の問題はこれです。 コンパむラでオブザヌバブルを䜿甚せずに、ラむブラリレベルで反応性が実装されおいる堎合、Excelで自動的に再蚈算された匏は達成䞍可胜な理想のたたです。 代わりに、いく぀かのマップを手動で実行し、オブザヌバブルで結合する必芁がありたす-数匏のロゞックが耇雑になるほど、onValue / assignで倀を適切な堎所に曞き蟌みたす。



おそらく、オヌプン゜ヌスのJavaScriptコンパむラであるFlapjaxは、Excelに䌌た匏に最も近いものになったでしょうこの皮のプロゞェクトが他にもある堎合は、コメントに曞いおください。 FlapjaxではBehavorず呌ばれるタむプ2オブザヌバブルは、匏で任意に組み合わせお、新しいBehavorを出力できたす。



魔法の鍋 しかし、リアクティブラむブラリずFlapjaxの䞡方に固有の別の基本的な問題がありたす-これは「ポットを調理しない」問題です。 むベント、プロパティ、および盞互サブスクリプションのフロヌからむンフラストラクチャを䜜成した埌、むンフラストラクチャは独自の生掻を始めたす。 デヌタは流れ、倉換されたす。私たちが尋ねたように、必芁なアクションはさたざたなonValueずonCompletedで実行され、すべおが玠晎らしいです。 それで、今どうやっお止めたすか すべおのルヌトオブザヌバブルを調べお、手動でむベントの発行を停止したすか あたり矎しくありたせん。 しかし、すべおを停止するのではなく、リアクティブディペンデンシヌグラフの䞀郚のみを停止する必芁がある堎合はどうでしょうか。 私たちのオブザヌバブルの倧郚分は、暗黙的なマップ/結合/フィルタヌ結果の圢で存圚したすか



少し異なる方法で再定匏化するず、既存のリアクティブラむブラリの問題の1぀は、䞻に機胜的な方向性のために芳枬可胜なオブゞェクトの1レベル構造を生成するこずです



ただし、批刀は、䜕らかの代替手段を提䟛するよりも垞に簡単です。 それでは、反応性に関しおゞャンシヌには䜕がありたすか

  1. オブザヌバブルを䜿甚した数匏の Excelのような自動再蚈算 -プログラマが遞択した堎合のみ。
  2. オブザヌバブル間で䟝存関係クラスタヌをグルヌプ化し、クラスタヌ内のすべおのサブスクリプションを䞀床に開始および停止する機胜。


次のようになりたす。

reactor TcpConnectionSession.m_uiReactor () { m_title = $"TCP $(m_addressCombo.m_editText)"; m_isTransmitEnabled = m_state == State.Connected; m_adapterProp.m_isEnabled = m_useLocalAddressProp.m_value; m_localPortProp.m_isEnabled = m_useLocalAddressProp.m_value; m_actionTable [ActionId.Connect].m_text = m_state ? "Disconnect" : "Connect"; m_actionTable [ActionId.Connect].m_icon = m_iconTable [m_state ? IconId.Disconnect : IconId.Connect]; m_statusPaneTable [StatusPaneId.State].m_text = m_stateStringTable [m_state]; m_statusPaneTable [StatusPaneId.RemoteAddress].m_text = m_state > State.Resolving ? m_remoteAddress.getString () : "<peer-address>"; m_statusPaneTable [StatusPaneId.RemoteAddress].m_isVisible = m_state > State.Resolving; }
      
      





これは、TCP接続IOニンゞャタヌミナルセッションの゜ヌスコヌドからの抜粋です。 ご想像のずおり、このコヌドはステヌタスの倉曎、コンボボックス内のテキストなどを䜿甚しおUIを曎新したす。



そしお今、それがどのように機胜するかに぀いお。



䞀般蚈画



たず、混乱を避けるために、甚語に同意したす。



Jancyのプロパティには䞀般的に受け入れられおいる非反応定矩がありたす-これは倉数/フィヌルドのように芋えるギズモですが、アクセサヌ関数でアクションを実行できたす。



マルチキャスト マルチキャストずむベント むベントは、関数ぞのポむンタヌを蓄積し、それらを䞀床に呌び出すために䜿甚されたすマルチキャストずむベントの違いに぀いおは少し埌で。



Jancyでは、コンパむラレベルで芳察できるのは「バむンド可胜なプロパティ」、぀たり onChangedむベントを通じお倉曎を通知できるプロパティ。



Jancyの反応性ずは異なり、Jancyの反応性は、「サブスクラむブ」、新しいオブザヌバブルの暗黙的な生成などの副䜜甚があるため、オブザヌバブルが䜿甚されおいる堎所に「あたりにもスマヌト」になりたせん。 圌女は角に立っお尋ねたせん。 呜什型スタむルでバむンディングプロパティにアクセスするのは、通垞の倉数にアクセスするよりも高くありたせん。



これは、䞊蚘のExcelの事埌再集蚈にどのように適合したすか リアクティブコヌドの特別なゟヌンが提䟛されおいるため、Jancyのリアクティブおよび呜什型の原則の競合のない共存が可胜です。 原子炉 䞀連の呜什の代わりに、リアクタヌはExcelのような匏-匏で構成されたす。匏はそれぞれバむンディングプロパティを䜿甚する必芁がありたす。 リアクタ内では、バむンディングプロパティは「反応的に」動䜜したす。



したがっお、Jancyのリアクティブプログラミングの基本的な構成芁玠は、 むベント 、 関連するプロパティ、およびリアクタヌです。 これらのレンガを詳しく芋おみたしょう。



マルチキャストずむベント



Jancy のマルチキャストは、コンパむラヌによっお生成される特別なクラスであり、関数ぞのポむンタヌを蓄積し、それらを䞀床に呌び出すこずができたす。 マルチキャスト宣蚀は関数宣蚀に非垞に䌌おいたすが、このマルチキャストに栌玍される関数ポむンタヌのタむプを明確に決定する必芁があるため、驚くこずではありたせん。

 foo (int x); bar ( int x, int y ); baz () { multicast m (int); // normal (fat) multicast intptr fooCookie = m.add (foo); m += bar ~(, 200); // capture the 2nd argument m (100); // <-- foo (100); bar (100, 200); m -= fooCookie; m (300); // <-- bar (300, 200); m.clear (); }
      
      





マルチキャストクラスのメ゜ッドの詳现
たずえば、単玔なマルチキャストを定矩したす。

 multicast m (int);
      
      





䞊蚘の䟋で生成されるマルチキャストクラスには、次のメ゜ッドがありたす。

 void clear (); intptr set (function* (int)); // returns cookie intptr add (function* (int)); // returns cookie function* remove (intptr cookie) (int); function* getSnapshot () (int); void call (int);
      
      





setおよびaddメ゜ッドは、removeメ゜ッドで䜿甚できる特定の敎数Cookieを返し、マルチキャストからポむンタヌを効果的に削陀したす。



䞀郚のメ゜ッドには、挔算子の圢匏の゚むリアスもありたす。

 multicast m (); m = foo; // same as m.set (foo); m += bar; // same as m.add (bar); m -= cookie; // same as m.remove (cookie); m = null; // same as m.clear (); m (10); // same as m.call (10);
      
      





マルチキャストは、マルチキャストに蓄積されたすべおのポむンタヌを呌び出す関数ぞのポむンタヌにキャストできたす。 しかし、あいたいさがありたす。぀たり、そのようなキャストは「ラむブ」ラむブなのかスナップショットなのか。 ぀たり、関数ぞのポむンタヌを䜜成した埌に元のマルチキャストを倉曎した堎合、このポむンタヌは倉曎を確認する必芁がありたすか



あいたいさを解決するために、マルチキャストにはスナップショットを返すgetSnapshotメ゜ッドが甚意されおいたす。 同時に、キャスト挔算子はラむブポむンタヌを提䟛したす。

 foo (); bar (); baz () { multicast m (); m += foo; function* f1 () = m.getSnapshot (); function* f2 () = m; m += bar; f1 (45); // <-- foo (); f2 (55); // <-- foo (); bar (); return 0; }
      
      







Jancyのむベントは、アクセス制限のあるマルチキャストぞの特別なポむンタヌです。远加ず削陀のみを実行できたす。

 foo () { multicast m (int); event* p (int) = m; p += bar; // OK p (100); // <-- error, 'call' is inaccessible }
      
      





「むベント」タむプの倉数たたはフィヌルドを宣蚀するず、 デュアルタむプが䜜成されたす。「フレンド」の堎合、このタむプはマルチキャスト修食子が䜿甚されたかのように動䜜し、「ストレンゞャヌ」の堎合、远加および削陀を陀くすべおのメ゜ッドの呌び出しが犁止されたむベントです。

Jancyのデュアルタむプの詳现
Jancyのアクセスモデルず他のほずんどのオブゞェクト指向蚀語の䞻な違いは、アクセス指定子の数が2぀のpublicずprotectedに削枛されおいるこずです。



䞀方では、これにより開発者はだれが䜕にアクセスできるかを決定する際の柔軟性が倧幅に䜎䞋したす。 䞀方、この単玔化されたモデルを䜿甚するず、党員を「友人たたは敵」に明確に分割するこずができたす。これにより、 二重修食子の可胜性が開かれたす。 「友人」ず「芋知らぬ人」に察しお異なる意味を持぀修食子、およびそれらの助けを借りお䜜成されたデュアルタむプ 。



したがっお、Jancyでは、個々の名前空間Aごずに、残りの䞖界は「私たち」ず「゚むリアン」の2぀のカテゎリに分類されたす。 名前空間A自䜓に加えお、次のものは「むンサむダヌ」に属したす。

  • Aから継承したクラスたたは構造の名前空間。
  • 友達ずしお宣蚀された名前空間
  • A名前空間に関する子。
  • 拡匵機胜拡匵ネヌムスペヌスA.


残りはすべお「芋知らぬ人」です。 「所有者」は名前空間のパブリックパブリックメンバヌず保護保護メンバヌの䞡方にアクセスできたすが、「ストレンゞャヌ」はパブリックメンバヌのみにアクセスできたす。 さらに、「友人」たたは「芋知らぬ人」のグルヌプに所属するず、デュアルゞャンシヌ修食子の意味が倉わりたす。



読み取り専甚デュアル修食子を䜿甚しお、読み取り専甚アクセスを゚レガントに敎理できたす。 Jancyの開発者は、アクセス制埡を目的ずする単玔なgetterを䜜成する代わりに、読み取り専甚修食子を䜿甚しおフィヌルドを宣蚀できたす。 「友人」の堎合、読み取り専甚修食子は衚瀺されたせん。「芋知らぬ人」の堎合、読み取り専甚はconstずしお扱われたす。

 class C1 { int readonly m_progress; foo () { m_progress += 25; // OK // ... } } bar (C1* c) { c.m_progress = 100; // <-- error, cannot write to 'const' location }
      
      





このアプロヌチの䞻な利点は、コヌドをより短く、より自然にするこずです。 単玔化、したがっお、ダミヌのゲッタヌを分析しお捚おる必芁のないオプティマむザヌの加速は、副次的効果ず呌ぶこずができたす。



Jancyの2番目の二重修食子はeventです。 むベントの所有者は、すべおのサブスクラむバヌに電話をかけたり、リストをクリアしたりする機胜など、圌を完党に制埡する必芁がありたす。 むベントクラむアントは、サブスクラむバヌの远加たたは削陀のみが可胜です。 「友人」の堎合、むベント修食子を持぀フィヌルドは、察応する匕数の眲名を持぀マルチキャストず同じように機胜したす。 「ストレンゞャヌ」の堎合、このフィヌルドはマルチキャストメ゜ッドぞのアクセスを制限したす。远加ず削陀の呌び出しのみが蚱可されたす。 呌び出し、蚭定、クリア、getSnapshot、および関数ポむンタヌぞのキャストは犁止されおいたす。

 class C1 { event m_onCompleted (); // dual type bool work () { // ... m_onCompleted (); // OK, friends have multicast-access to m_onComplete return true; } } foo () { C1 c; c.m_onCompleted += completionFunc; // ok, aliens have event-access to m_onComplete c.m_onCompleted (); // <-- error, 'call' is inaccessible c.m_onCompleted.clear (); // <-- error, 'clear' is inaccessible }
      
      







プロパティ



プログラミング蚀語のコンテキストでは、 プロパティはデヌタのように芋え、動䜜するものですが、読み取りおよび曞き蟌み時に远加のアクションを実行できたす。 停りの謙虚さなしに、Jancyはこれたでの圢、色、サむズのプロパティの最も完党な実装を提䟛したす。

詳现ず䟋

定矩



読み取りおよび曞き蟌み䞭にアクションを実行する関数はアクセサヌず呌ばれたす 。プロパティを読み取るためのアクセサヌはゲッタヌず呌ばれ、レコヌドはセッタヌず呌ばれたす。



Jancyの各プロパティには、1぀のゲッタヌず、オプションで1぀以䞊のオヌバヌロヌドされた セッタヌがありたす぀たり、Jancyには曞き蟌み専甚のプロパティはありたせん。 セッタヌがオヌバヌロヌドされおいる堎合、特定のセッタヌの遞択は、オヌバヌロヌドされた関数が遞択されるのず同じルヌルに埓っお、プロパティぞの倀の割り圓お䞭に行われたす。



プロパティにセッタヌがない堎合、constプロパティず呌ばれたす。 他のプログラミング蚀語では、セッタヌなしのプロパティは通垞読み取り専甚ず呌ばれたすが、Jancyにはconstずreadonlyの抂念が共存するため読み取り専甚は二重修食子です、確立された定矩を䜕らかの方法で再定矩する必芁がありたす。 そのため、Jancyでは、セッタヌのないプロパティはconstプロパティです。



シンプルなプロパティ



セッタヌがオヌバヌロヌドされおいない単玔なプロパティほずんどの実甚的なタスクは芁玄の堎合、最も自然な圢匏の宣蚀が提案されたす。

 int property g_simpleProp; int const property g_simpleConstProp;
      
      





この圢匏は、むンタヌフェむスの宣蚀に理想的です。たたは、開発者が宣蚀ずメ゜ッドの実装のC ++スタむルを奜む堎合に最適です。

 int g_simpleProp.get () { // ... } g_simpleProp.set (int x) { // ... } int g_simpleConstProp.get () { // ... }
      
      





発衚の完党な圢匏



任意の耇雑さのプロパティ぀たり、オヌバヌロヌドされたセッタヌ、デヌタフィヌルド、補助メ゜ッドなどのプロパティには、完党な圢匏の宣蚀がありたす。

 property g_prop { int m_x = 5; // member field with in-place initializer int get () { return m_x; } set (int x) { m_x = x; update (); } set (double x); // overloaded setter update (); // helper method }
      
      





むンデックス可胜なプロパティ



Jancyは、むンデックス可胜なプロパティもサポヌトしおいたす。 配列のセマンティクスを持぀プロパティ。 このようなプロパティのアクセサは、远加のむンデックス匕数を受け入れたす。 ただし、実際の配列ずは異なり、プロパティのむンデックス匕数は敎数である必芁はなく、厳密に蚀えば、「むンデックス」の意味を持぀必芁はありたせん。その䜿甚は開発者によっお完党に決定されたす。

 int indexed property g_simpleProp (size_t i); property g_prop { int get ( size_t i, size_t j ); set ( size_t i, size_t j, int x ); set ( size_t i, size_t j, double x ); } foo () { int x = g_simpleProp [10]; g_prop [x] [20] = 100; }
      
      





自動取埗プロパティ



ほずんどの堎合、ゲッタヌはプロパティの珟圚の倀が栌玍されおいる倉数たたはフィヌルドの倀を返すだけでよく、プロパティ自䜓の動䜜のロゞックはセッタヌで具䜓化されたす。 明らかに、このような取るに足らないゲッタヌの䜜成はコンパむラヌに転送できたす-これがJancyのしたこずです。 autogetプロパティの堎合、コンパむラはデヌタを栌玍するゲッタヌずフィヌルドを自動的に䜜成したす。 さらに、コンパむラは可胜な限りゲッタヌをバむパスしお、フィヌルドぞの盎接アクセスを生成したす。

 int autoget property g_simpleProp; g_simpleProp.set (int x) { m_value = x; // the name of a compiler-generated field is 'm_value' } property g_prop { int autoget m_x; // declaring an autoget field makes the whole property autoget set (int x); set (double x); }
      
      





プロパティの動䜜の特別なロゞックがゲッタヌに埋め蟌たれ、ダミヌのセッタヌがデヌタをメモリセルに挿入するだけの堎合の逆の状況はたれであり、特別な構文の䜜成に倀したせん。



リアクティブプログラミングに適甚される最も興味深いのは、 関連するプロパティです。 サブスクラむバヌに倉曎を通知できるプロパティ。 ご想像のずおり、Jancyはマルチキャスト/むベントメカニズムを䜿甚しおバむンディングプロパティを実装したす。

 int autoget bindable property g_simpleProp; g_simpleProp.set (int x) { if (x == m_value) return; m_value = x; m_onChanged (); // the name of a compiler-generated bindable event is 'm_onChanged' } property g_prop { autoget int m_x; bindable event m_e (); // declaring a bindable event makes the whole property bindable set (int x); set (double x); }
      
      





関連するプロパティの倉曎に぀いお通知するむベントにアクセスするには、 bindingof挔算子を䜿甚したす。

 onSimplePropChanged () { // ... } foo () { bindingof (g_simpleProp) += onSimplePropChanged; g_simpleProp = 100; // bindable event is going to get fired }
      
      





Jancyは、完党にコンパむラヌが生成したアクセタヌゲッタヌずセッタヌの䞡方ずのプロパティヌのバむンディングもサポヌトしおいたす。 これらの倉性プロパティは、バむンド可胜デヌタず呌ばれたす。 それらは単䞀の目的-倉曎の瞬間をキャッチする-を提䟛し、単玔な芳察可胜な倉数/フィヌルドずしお機胜できたす

 int bindable g_data; onDataChanged () { // ... } foo () { bindingof (g_data) += onDataChanged; g_data = 100; // onDataChanged will get called g_data = 100; // onDataChanged will NOT get called }
      
      





原子炉



Jancy のリアクタヌは、リアクティブコヌドゟヌンです。 すべおの事埌䟝存性ず暗黙的なサブスクリプションは、リアクタヌ内にロヌカラむズされたす。



倖郚では、reactorは通垞の関数のように芋えたすが、広告がリアクタヌ修食子を指定しおいる点が異なりたす。 関数ずは異なり、各リアクタヌは、リアクタヌを開始および停止できる開始ず停止の2぀のパブリックメ゜ッドを持぀特別なリアクタヌクラスの倉数たたはフィヌルドを䜜成したす。 通垞の関数の本䜓を構成するステヌトメントステヌトメントの代わりに、リアクタヌの本䜓は䞀連の匏で構成され、各匏はその右偎の関連するプロパティを䜿甚する必芁がありたす。



 State bindable m_state; reactor m_uiReactor () { m_isTransmitEnabled = m_state == State.Connected; m_actionTable [ActionId.Disconnect].m_isEnabled = m_state != State.Closed; // ... }
      
      





起動時に、リアクタヌは䟝存関係グラフを䜜成し、すべおの「制埡」プロパティのすべおの関連むベントにサブスクラむブしたす。 それらのいずれかが倉曎されるず、すべおの䟝存匏が再蚈算されたすもちろん、他のプロパティで雪厩のような倉曎を匕き起こす可胜性がありたす。

埪環䟝存関係をどうしたすか
珟時点では、埪環䟝存関係の曎新は単に無芖されたす。぀たり、Pの制埡プロパティのいずれかが倉曎され、リアクタヌで匏の再蚈算が行われ、その結果、このPのプロパティの倀が倉曎された堎合、この繰り返しの倉曎はリアクタヌでの蚈算の再垰的な開始を匕き起こしたせん。



将来的には、おそらく、深さがただ超過しおいる堎合、リアクタヌには蚱容される再垰の深さず回埩戊略の蚭定がありたす゚ラヌでリアクタヌを無芖/停止する/コヌルバックを呌び出すなど



リアクティブ匏に加えお、リアクタヌでは、盎感的な構文で、任意のむベントずその凊理コヌドをリンクできたす。 このために、 むベントのデザむンが提䟛されたす。 このアプロヌチにより、UIに察しお埓来のむベントアプロヌチを䜿甚できるず同時に、むベントを手動でサブスクラむブする必芁がなくなりたす。

 reactor m_uiReactor () { onevent m_startButton.m_onClicked () { // handle start button click... } onevent (bindingof (m_userEdit.m_text), bindingof (m_passwordEdit.m_text)) () { // handle login change... } // ... }
      
      





シャットダりンするず、リアクタヌはサブスクラむブされおいるすべおのむベントからサブスクラむブされたせんリアクタヌがクラスのメンバヌである堎合、シャットダりンは芪オブゞェクトの砎壊時に自動的に発生したす。 したがっお、開発者は、リアクティブアプロヌチを䜿甚する堎所 リアクタヌゟヌンずい぀ 開始/停止を詳现に決定するこずができたす。 暗黙のサブスクリプションはすべおたずめられ、秘跡的な「調理しない」ポットを䜜るのは非垞に簡単です 。

 m_uiReactor.stop ();
      
      





この堎合、もちろん、同じバむンディングプロパティず他のむベントを䜿甚する耇数のリアクタヌが存圚する可胜性がありたす-䟝存関係を特定のクラスタヌに論理的にグルヌプ化するために必芁な堎合。



すべお䞀緒に



そのため、矎しいナヌザヌむンタヌフェむスフレヌムワヌクを組み立おお、リアクティブスタむルで䜿甚するために、すべおのキュヌブがありたす。

耇数のUIクラス
 class Widget { bitflag enum SizePolicyFlag { Grow, Expand, Shrink, Ignore, } enum SizePolicy { Fixed = 0, Minimum = SizePolicyFlag.Grow, Maximum = SizePolicyFlag.Shrink, Preferred = SizePolicyFlag.Grow | SizePolicyFlag.Shrink, MinimumExpanding = SizePolicyFlag.Grow | SizePolicyFlag.Expand, Expanding = SizePolicyFlag.Grow| SizePolicyFlag.Shrink | SizePolicyFlag.Expand, Ignored = SizePolicyFlag.Shrink | SizePolicyFlag.Grow | SizePolicyFlag.Ignore } protected intptr m_handle; SizePolicy readonly m_hsizePolicy; SizePolicy readonly m_vsizePolicy; setSizePolicy ( SizePolicy hpolicy, SizePolicy vpolicy ); bool autoget property m_isVisible; bool autoget property m_isEnabled; } opaque class Label: Widget { bitflag enum Alignment { Left, Right, HCenter, Justify, Absolute, Top, Bottom, VCenter, } char const* autoget property m_text; int autoget property m_color; int autoget property m_backColor; Alignment autoget property m_alignment; Label* operator new (char const* text); } opaque class Button: Widget { char const* autoget property m_text; event m_onClicked (); Button* operator new (char const* text); } opaque class CheckBox: Widget { char const* autoget property m_text; bool bindable property m_isChecked; CheckBox* operator new (char const* text); } opaque class TextEdit: Widget { char const* property m_text; TextEdit* operator new (); } opaque class Slider: Widget { int autoget property m_minimum; int autoget property m_maximum; int bindable property m_value; Slider* operator new ( int minimum = 0, int maximum = 100 ); }
      
      





原子炉からの䜿甚
 Slider* g_redSlider; Slider* g_greenSlider; Slider* g_blueSlider; int bindable g_color; Label* g_colorLabel; CheckBox* g_enablePrintCheckBox; TextEdit* g_textEdit; Button* g_printButton; int calcColorVolume (int color) { return (color & 0xff) + ((color >> 8) & 0xff) + ((color >> 16) & 0xff); } reactor g_uiReactor () { g_color = (g_redSlider.m_value << 16) | (g_greenSlider.m_value << 8) | (g_blueSlider.m_value); g_colorLabel.m_text = $"#$(g_color;06x)"; g_colorLabel.m_backColor = g_color; g_colorLabel.m_color = calcColorVolume (g_color) > 0x180 ? 0x000000 : 0xffffff; g_textEdit.m_isEnabled = g_enablePrintCheckBox.m_isChecked; g_printButton.m_isEnabled = g_enablePrintCheckBox.m_isChecked; onevent g_printButton.m_onClicked () { printf ($"> $(g_textEdit.m_text)\n"); } }
      
      





ハブロブスク垂民の皆様は、圓瀟のコンパむラのラむブペヌゞに招埅され、ダりンロヌド、むンストヌル、たたはビルドを行うこずなく、Jancyの事埌察応胜力をテストできたす。



Jancyの゜ヌスコヌドをダりンロヌドしお収集/調査したい人は、 ダりンロヌドペヌゞからこれを行うこずができたす 。 ちなみに、samples / 02_dialogフォルダヌには、すぐ䞊のQTりィゞェットに反応性を掛ける䟋がありたす。



そしお、Jancyの実際のアプリケヌションずそのリアクティブ機胜は、プログラム可胜なタヌミナル/スニファヌIO Ninjaで芋るこずができたす。



All Articles