3

2つの場合のMVC/オブザーバー手法の類似物について説明してください。

  1. 不変オブジェクト(OOPスタイル)
  2. 不変データ(機能スタイル)

たとえば、次の簡単なGUIの例を考えてみましょう(ここでライブで試すことができますhttp://tinkerbin.com/0XDHRXIl [実行]ボタンをクリックして開始し、テキストが表示されるまで2秒待ちます)

プレイが簡単で、MVC / Observerが非常に自然であるため、JavaScriptで構築されています

// Model containing the data.
var Post = Backbone.Model.extend({}) 

var PostView = Backbone.View.extend({
  initialize: function() {
    // Registering view rendering method as
    // an observer on the model.
    this.model.on('all', this.render.bind(this))
  },  
  // Every time state of model changes 
  // this method will be called.
  render: function() {
    // Printing value of model.text attriubute. 
    this.$el.html(this.model.get('text'))
    return this
  }
})

// Now, any time the model is updated the view will be also 
// automatically updated.
post.set({text: "hello, it's me"})

しかし、Immutable OOPとFunctionalスタイルで同じことを行う方法がよくわかりません。どのような方法がありますか?

4

2 に答える 2

1

従来のMVCおよびOOP手法の場合、すべてのオブジェクトに暗黙の識別子(その参照)があります。オブザーバーは、この参照/識別子に依存して、正しいオブジェクトにメッセージをディスパッチします。

不変の世界では、参照はオブジェクトを識別しなくなり(オブジェクトのバージョンが異なる場合は複数の参照が存在する可能性があります)、機能の世界ではオブジェクトはまったくありません。したがって、オブジェクトIDを明示的に指定する必要があります。

不変/機能の世界でのオブザーバーの類似物は、明示的に提供されたオブジェクトIDを持つPub/Subです。

于 2012-11-09T15:32:10.943 に答える
0

不変のOOPスタイルに関しては、次の変更を適用することをお勧めします。「モデルの状態を変更する」代わりに、状態が変更されるたびに新しいモデルの状態を作成する必要があります。ビューの監視関数の状態をプルする代わりに、不変の状態をパラメーターとして監視関数(ここではrender関数)に渡します。

オブザーバーデザインパターンへのより機能的なアプローチのインスピレーションとして、リアクティブ関数型プログラミングを検討することをお勧めします。特に、オブザーバーパターンの廃止に関するやや物議を醸す論文をお勧めします。

于 2012-11-07T11:52:55.157 に答える