0

関数型プログラミングでは、データ モデルは不変です。データ モデルの更新は、データ モデルに関数を適用し、新しいバージョンのデータ モデルを取得することによって行われます。ただし、人々がそのようなデータモデル用の効率的なビューアー/エディターをどのように作成するのか疑問に思っています(より具体的にはClojureで)

簡単な例: 巨大なツリーのビューアを実装したいとします。非機能的な世界では、関数 updateNode(Node, Value) を使用してツリーのコントローラーを作成し、ツリー内の特定のノードが更新されたことをすべてのオブザーバーに通知することができます。ビューア側では、すべてのノードを TreeView ウィジェットに配置し、Node->WidgetNode のマッピングを維持します。ノードが変更されたことが通知されたら、更新が必要なツリー内の対応する NodeWidget を 1 つだけ更新できます。 .

別の Clojure MVC の質問で説明されている解決策では、モデルを ref に保持し、ウォッチャーを追加する方法について説明しています。これにより、モデルの変更の通知を受け取ることができますが、どのノードが更新されたかはまだわからず、ツリー全体をトラバースする必要がありますよね?

頭の中で思いつく最善の方法は、最悪の場合、ルートから変更されたノードへのパス上のすべてのノードを更新することです (これらのノードはすべて異なるため)。

不変データ モデルのビューを更新するための標準的なソリューションは何ですか?

4

1 に答える 1

1

これが関数型プログラミングに固有の問題である理由がわかりません。すべての状態を単一ルートの可変オブジェクト グラフに保持し、変更時に通知を行うと、同じ問題が発生します。

これを回避するには、モデルの現在の状態と、最後の編集で何が変更されたかに関する情報を保存するだけです。Clojure の永続的なデータ構造により、共有された基になる状態で非常に効率的になるため、これらの履歴を保持して簡単に元に戻したりやり直したりすることもできます。

それは、それを攻撃する方法についての 1 つの考えです。他にもたくさんあると思います。

また、「どのくらい効率的である必要があるか」という質問も価値があると思います。答えは、「状況に応じて十分に効率的」です。特定のアプリケーションで処理するデータが実際にはそれほど多くないため、データの単純なマップが機能する可能性があります。

于 2013-09-20T13:06:27.170 に答える