02 Mar 2014, 10:36

[RubyTk]オブザーバ・パターン(Observer)でサブウィンドウから情報を取得する

RubyTkでオブザーバ・パターンを勉強したので、メモします。

やりたいこと

  • RubyTkで、メインウィンドウからサブウィンドウを起動。
  • サブウィンドウから情報(入力フォームに入力された情報など)を取得する。

Ruby初心者の実装

どうやればいいのかわからなかったので、とりあえずクラス変数を使って実装。

依存関係ヌメヌメどろどろの悪い実装。

Ruby中級者の実装

<div class="outline-text-2" id="text-3">
  <p>
    サブウィンドウのオブジェクト生成時に親ウィンドウのオブジェクトのクラスを渡す。
  </p>

  <p>
    これが普通のやり方かな~。
  </p>

  <p>
    </div>
  </p>
</div>

<div id="outline-container-sec-4" class="outline-2">
  <h2 id="sec-4">
    Ruby知ったかぶりの実装
  </h2>

  <div class="outline-text-2" id="text-4">
    <p>
      Ruby, オブジェクト, 通知でググると、observerというライブラリが Ruby標準ライブラリで存在するようだ。
    </p>

    <p>
      observerとは、ズバリ、Observer Paternをサクッと実装することができるライブラリ。
    </p></p>
  </div>

  <div id="outline-container-sec-4-1" class="outline-3">
    <h3 id="sec-4-1">
      observerの役割分担
    </h3>

    <div class="outline-text-3" id="text-4-1">
      <p>
        前提として、以下のようにやくわりを持たせる。
      </p>

      <ul class="org-ul">
        <li>
          観察者 : メインウィンドウ
        </li>
        <li>
          被観察者 : サブウィンドウ
        </li>
      </ul>

      <p>
        observerは被観察者、つまり状態の変化を通知するサブウィンドウで実装される。
      </p></p>
    </div></p>
  </div>

  <div id="outline-container-sec-4-2" class="outline-3">
    <h3 id="sec-4-2">
      observerの使い方
    </h3>

    <div class="outline-text-3" id="text-4-2">
      <p>
        以下の4ステップ。
      </p>

      <ol class="org-ol">
        <li>
          add_observerで観察者と被観察者を結びつける。
        </li>
        <li>
          変更があったときにchangedをコール
        </li>
        <li>
          notify_observersで観察者に通知
        </li>
        <li>
          観察者側で定義された updateメソッドがコールされる。引数は3で設定した値。
        </li>
      </ol>
    </div></p>
  </div>

  <div id="outline-container-sec-4-3" class="outline-3">
    <h3 id="sec-4-3">
      実装例
    </h3>

    <div class="outline-text-3" id="text-4-3">
      </p> 

      <p>
        正直、2つめと3つめの違いがよくわからない。
      </p>

      <p>
        オブザーバライブラリを使うことで『オレ・こんなことも知ってるっすよ」という いやらしさがある。
      </p></p>
    </div></p>
  </div></p>
</div>

<div id="outline-container-sec-5" class="outline-2">
  <h2 id="sec-5">
    Ruby勉強中の実装
  </h2>

  <div class="outline-text-2" id="text-5">
    <p>
      追記。
    </p>

    <p>
      オブザーバパターンは、一つの観察対象に対して、複数の観測者がいるときに威力を発揮する!
    </p>

    <p>
      ということで、一つのサブウィンドウから、2つのウィンドウにを通知を送るように修正した。
    </p>

    <p>
      </div>
    </p>
  </div>