8

私は「モデル」 (つまり、UML などの何らかのセマンティクスを持つボックスと線のコレクションであり、その詳細はここでは関係ありません) 用のグラフィカル エディターを作成しています。したがって、モデルを表すデータ構造と、ダイアグラムを編集するとモデルに対応する変更が生じるダイアグラムが必要です。たとえば、モデル要素の属性にテキストが含まれていて、ダイアグラムでテキストを編集する場合、モデル要素を更新する必要があります。

モデルはおそらくツリーとして表されますが、ダイアグラム エディターにはモデルの表現についてできるだけ知らないようにしたいと考えています。(私はダイアグラムフレームワークを使用しているので、任意の情報をグラフィック要素に関連付けるのは簡単です)。それがどうあるべきかを理解できれば、インターフェイスをエンコードする「モデル」クラスがおそらくあるでしょう。

これを命令型言語で行う場合は、簡単です。ダイアグラム内のグラフィカル要素からモデル要素への参照を取得するだけです。理論的には、大量の IORef のコレクションからモデルを構築することでこれを行うことができますが、それは Haskell で Java プログラムを作成することになります。

明らかに、各グラフィック要素には、モデルの更新を可能にする何らかの種類の Cookie が関連付けられています。簡単な答えの 1 つは、各モデル要素に一意の識別子を与え、モデルを Data.Map ルックアップ テーブルに格納することです。ただし、2 つのモデル要素が同じ識別子を取得しないようにするためには、かなりの簿記が必要です。また、「文字列型」のソリューションとしても印象的です。オブジェクトが削除されたが、他の場所でぶら下がっている参照があり、型のモデルの内部構造について何かを言うのが難しい場合を処理する必要があります。

一方、複数の穴を備えたジッパーと明確なトランザクション共有を備えたカーソルに関するOleg の著作は、私が理解できれば、より良い選択肢のように思えます。リスト ジッパーとツリー ジッパーの基本的な考え方と、データ構造の差別化について理解しました。ダイアグラム内のすべての要素がモデルのジッパーにカーソルを保持することは可能でしょうか? 変更が行われた場合、それを他のすべてのカーソルにコミットできるようにするには? ツリー操作 (サブツリーをある場所から別の場所に移動するなど) を含めますか?

区切られた継続に関するある種のチュートリアルと、それらがオレグのマルチカーソルジッパーをどのように機能させるかについての説明があれば、この時点で特に役立ちます。それはオレグの投稿よりも少し急ではありませんか?

4

1 に答える 1

2

現在、モデルツリーの各ノードが個別のグラフィカルウィジェットで表されており、これらのウィジェットのそれぞれがモデルを個別に更新する可能性がある設計で作業していると思います。もしそうなら、私はマルチホールジッパーが非常に実用的であるとは思わない。問題は、サポートしたい穴の数に応じてジッパーの複雑さが急速に増すことです。2項をはるかに超えると、ジッパーのサイズがかなり大きくなります。差別化の観点から、2穴ジッパーは1穴ジッパー上のジッパーであるため、連鎖律の操作によって複雑さが増します。

代わりに、MVCからアイデアを借りることができます。各ノードは引き続きウィジェットに関連付けられていますが、直接通信することはありません。むしろ、それらは単一のジッパーを維持する中間コントローラーを通過します。ウィジェットが更新されると、コントローラーに通知されます。コントローラーはすべての更新をシリアル化し、それに応じてジッパーを変更します。

ウィジェットは、モデルノードを参照するために何らかの識別子を必要とします。多くの場合、ノードのパスを使用するのが最も簡単であることがわかりました。たとえば[0]、ルート、[1,0]ルートの2番目の子などです。これには、いくつかの利点があります。パスが参照するノードを特定するのは簡単です。また、ジッパーが現在の場所から特定のノードまでの最短パスを計算するのも簡単です。ツリー構造の場合、削除と再挿入までは一意です。それでも通常は問題にはなりません。ノードを削除する必要があることがコントローラーに通知されると、対応するウィジェットが削除され、関連する更新が無視される可能性があるためです。ウィジェットの有効期間が各ノードの有効期間に関連付けられている限り、パスは変更を識別するのに十分に一意になります。

ツリー操作の場合、おそらくグラフィカルウィジェットを破棄してから再作成します。

例として、私はこの種のことを行ういくつかのコードを持っています。このモデルでは、ノードごとに個別のウィジェットはありません。むしろ、ダイアグラムを使用してすべてをレンダリングし、クリック位置に基づいてダイアグラムをクエリして、データモデルへのパスを取得します。それは完全にはほど遠いです、そして私はそれをしばらく見ていなかったので、それは構築されないかもしれません、しかしコードはあなたにいくつかのアイデアを与えるかもしれません。

于 2012-09-12T05:57:29.633 に答える