4

私はC++アプリケーションで適切なMVCを実装する方法について読んでおり、基本的にこれを実装するには2つの方法があるということになりました:

  • オブザーバーパターン
  • シグナル/スロット

ただし、どちらの場合も、私が読んだ例はすべて、サブジェクトが変更してオブザーバーに通知できる構造に従いますが、オブザーバーはサブジェクトを変更しません。この場合、いくつかの「問題」が発生します。

Text (モデルコンポーネント) と呼ばれるクラス、TextEditor (GUI コンポーネント) と呼ばれる別のクラスがあり、何らかの方法で「テキスト」を表示し、それを変更できるはずであり、「テキスト」を変更できる他のいくつかのクラスがあるとします。 .

そうです、オブザーバー パターンを使用して、'Text' をサブジェクトに、'TextEditor' をオブザーバーにします。大きな問題ではない。

「Text」が何らかの方法で変更された場合、Text は Text::notify() を呼び出し、TextEditor は変更を反映します。罰金。

では、 TextEditor を使用して Text を変更するとどうなるでしょうか。

「TextEditor」は「Text」について知っているので、textInstance.setText(...) のようなものを呼び出します...そして setText の最後で、「Text」は通知を呼び出し、「TextEditor」はそれ自体が行った変更を通知されます! 「Text」は、「TextEditor」以外のすべての人に通知を送信することさえできません。これは、オブザーバーについて知る必要がないためです。

パフォーマンスの理由は別として、これは正しくなく、「クリーン」ではないと感じています。これを実装するためのより良い方法があると思いますが、行き詰まっています。誰にもヒントがありますか?

事前に作成された C++ の実装に実際に目を向けているわけではありませんが、物事を正しく見る方法を理解することを目指しています。

4

1 に答える 1

4

模様がきれい。setText が行っていることを TextEditor よりも想定しているため、通知する必要はありません。テキストが凍結され、それ自体の変更を拒否した場合はどうなりますか。テキストは、新しいテキストを追加し、タイムスタンプなどを追加する一種のロガーにすることもできます。

したがって、TextEditor が Text に何かを実行するように「要求」し、その結果を確認することは完全にクリーンです。したがって、TextEditor は、それ自体が行った変更については通知されませんが、要求された変更がどのように管理されたかについては通知されます。

本当にパフォーマンスの問題がある場合は、オブザーバー パターンを別の方法でハックしてください。

  • sendText を呼び出してから readding する前に、オブザーバーとして TextEditor を削除します。
  • すべての呼び出しが同期の場合: 属性を設定して TextEditor の自動更新を防止する
  • など...
于 2010-11-24T14:01:27.330 に答える