17 Mar 2014, 12:20

How to write a code like English(英文のようにプログラミングをする方法)

英語の文章のようにプログラミングをする方法についてのまとめです。

はじめに書いておくと、今回の記事の元ネタは以下の2つです。

[toc]

メソッド名と引数は文法にこだわるべし

まずは、オブジェクト指向と英語の5文型との関係性について。

S(Subject主語)はオブジェクト、V(Verb動詞)はメソッドに対応する。

第1文型 S + V

<div class="outline-text-3" id="text-1-1">
  <p>
    第一文型は、S+V。 誰・何は、どうする、SはVする。
  </p>

  <p>
    Vには、自動詞が使われる。主語と動詞で文が完結する。
  </p>

  <p>
    go、wait、start、listen、work, begin, come
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">S</span> 

def V # 自動詞 end end

  <p>
    第一文型の動詞には、前置詞+名詞の形をした副詞句が続くことが多い。
  </p>

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    前置詞をメソッド名に、名詞を第一引数にするべし。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">Bob</span>

def go_to(place) end

def wait_for(girlfriend) end

def live_in(town) end end

第2文型 S + V + C

<div class="outline-text-3" id="text-1-2">
  <p>
    第2文型は、S+V+C。 誰・何は、なんだ。S=Cの関係がなりたつもの。
  </p>

  <p>
    形容詞と名詞がCになる。Vには、大抵be動詞がくる。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">S</span> 

def V(C) # be動詞 + 形容詞 end end

  <p>
    しかし、be動詞をメソッドにするには具体性がない。
  </p>

  <p>
    be動詞以外で動詞にくる名詞を以下に列挙。
  </p>

  <ul class="org-ul">
    <li>
      状態系 be, look, seem, keep, remain
    </li>
    <li>
      変化系 become、get, turn, go
    </li>
    <li>
      感覚系 feel、sound、
    </li>
    <li>
      <a href="http://www.elm-lab.com/CCP040.html">第2文型をとる動詞</a>
    </li>
  </ul>

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    第一引数に状態を入れるべし。
  </p></p>
</div></p>

第3文型 S + V + O

<div class="outline-text-3" id="text-1-3">
  <p>
    第3文型は、S+V+O。SはOをVする。Vは他動詞。Oは目的語。
  </p>

  <p>
    Objective、Objectiveですよ!Objective!大事なことは3回書きます。
  </p>

  <p>
    つまり、Oはオブジェクトがくる。オブジェクト指向万歳。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">S</span> 

def V(O) # 他動詞 + オブジェクト end end

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    オブジェクトか名詞を引数にするべし。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">Bob</span>

def study(@ruby) end

def read(aBook) end end

  <p>
    しかし、Oにくるものはなにも名詞ばかりでない。
  </p>

  <p>
    不定詞(to xxx)、動名詞(xxxing)、名詞句、名詞節もOとなり得る。 このケースはメソッドの引数とするにはすこし難しいな。
  </p></p>
</div></p>

第4文型 S + V + O + O

<div class="outline-text-3" id="text-1-4">
  <p>
    第4文型は、S+V+O(人)+O(物)。Sは
  </p>

  <p>
    ボイントは1つめのOは人、2つめは物。
  </p>

  <p>
    give, show, send, buy
  </p>

  <p>
    人というのは、モジュールに置き換えるのがよい。
  </p>

  <p>
    xxxManager, xxxListener, xxxController, xxxObserver&#x2026;.etc.
  </p>

  <p>
    オブジェクト間のやりとりでつかえる。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #f92672; font-weight: bold;">class</span> <span style="color: #66d9ef; font-weight: bold;">Bob</span>

def send(@Manager, @message) end

def give(@girlfriend, @present) end end

  <p>
    よって、より英語っぽくコーディングするには、
  </p>

  <p>
    第一引数をやりとり先のオブジェクト、第二引数をデータにするべし。 英語を意識するならば、順番にこだわるべし。
  </p>

  <p>
    ちなみに、第三文型と第四文型は、変換可能。
  </p>

  <p>
    Tom shows hoge to him. / Tom shows him hoge.
  </p>

  <p>
    前置詞がともなうと引数の形にしずらいので、 第4文型として引数を2つとるほうが英語っぽい。
  </p></p>
</div></p>

第5文型 S + V + O + C

<div class="outline-text-3" id="text-1-5">
  <p>
    第5文型は、「S+V+O+C」(主語+動詞+目的語+補語)。O = Cの関係がなりたつ。
  </p>

  <p>
    第ニ文型との対比に注意。第二文型はS=Cだが、5はO=Cの関係。
  </p>

  <p>
    Oには、オブジェクトがくる。Cには状態がくる。 Sオブジェクトの指示でOの状態を変化させる。
  </p>

  <p>
    make, call, appoint, drive, find, keep, turn, notice,
  </p>

  <p>
    こうやって、動詞をならべてみると、実際に利用できそうなものはあまりないな。
  </p></p>
</div></p>

メンタルマッピングを避けるべし

メンタルマッピングとは、あたまの中での対応付け。 コードの中で、変数名はなにかを略されることがおおい。

cntl -> controller, mgr -> manager, sn -> serial number

しかし、略すと英語として読み取れなくなる。よって、メンタルマッピングには反対だ。

コメントを書く代わりにメソッドの抽出をするべし

コメントはコードを雑然させる。そして、度々間違っている。

こんなときはコメントを書く代わりに、その部分を戻り値なしのメソッドに抽出する。

たとえば、

// ソートする。
for(int i=0; i < 9; i++) {
  for( int j=i+1 i < 10 ; j++)
     if( a[i] > a[j] ) {
        swap(i, j);
     }
  }
}

<p>
  これはこうリファクタリングする。
</p>

<div class="org-src-container">
  <pre class="src src-C++"><span style="color: #66d9ef; font-weight: bold;">void</span> <span style="color: #a6e22e;">sort</span>(<span style="color: #66d9ef; font-weight: bold;">Data</span> *<span style="color: #fd971f;">a</span>) {

// ソートする。 for(int i=0; i < 9; i++) { for( int j=i+1 i < 10 ; j++) if( a[i] > a[j] ) { swap(i, j); } } }

<p>
  メソッド名を文章にすることで、コードが文章に近づくのだ。素晴らしいテクニック。
</p></p>

if, else, while文は一行で書くべし

if, else, whileを一文で書くことで、より英語の文章に近づく。

if (isdangerous())
  stopApplication();
else
  restartAplication();

<p>
  この際、条件式もメソッドに抽出する。
</p>

<p>
  javaでは is(条件)、rubyでは(条件)?というスタイルが好まれる。
</p></p>

説明的変数を導入すべし

説明的変数を導入すると、可読性が上がる。

ぐちゃぐちゃした論理は説明的変数またはメソッド抽出でわかりやすい文章に変える。

bool isSuccess = (条件1) && (条件2) && (条件3) || (条件4)

<p>
  ここでも、if文を一行にまとめるという規則と合わせると、より文章らしくなる。
</p>

<div class="org-src-container">
  <pre class="src src-C++"><span style="color: #f92672; font-weight: bold;">if</span> (isSuccess())

startMusicAndSingingASong();

まとめ

英語のようにコーディングするにあたって、最大の関心事が、「実行速度」だ。

メソッドを細かくすると、それだけ遅くなるのではないか?

大丈夫、コンパイラは進化しているので、細かいメソッド分割はコンパイラによって最適化される。詳しくは以下参照。

本当にコンパイラを信じていいの?迷信ではないか?

いや、実のところ、自分でも不安だ。どこかに書いてあったことをそのまま信じてだけだ。自信がない。

じゃあ、ということで、コンパイラについて勉強してみよう。今日から始まる courseraの コンパイラの講義に挑戦だ!

14 Mar 2014, 12:05

C言語の二重インクルード(多重インクルード)防止について

C言語のヘッダファイルでおまじないのように書いているコレ。

#ifndef  _FOO_H_
#define  _FOO_H_

#endif

インクルードガードという。いったいなんなのか調べた。

無限ループ防止

互いのヘッダファイルをインクルードしあうと、コンパイル時に無限ループに陥る。

foo.h

#include "bar.h"

bar.h

#include "foo.h"

実行結果

<div class="outline-text-3" id="text-1-1">
  <div class="org-src-container">
    <pre class="src src-language">  $gcc foo.c bar.c
 ... 
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from bar.h:4,
     from foo.h:1,
     from foo.c:2:

foo.h:1:17: error: #include nested too deeply #include “bar.h”

構造体のコンパイルエラー

一つの.hにある構造体を二つの.cでインクルードすると、コンパイルエラーが発生する仕様。

foo.h

struct test{
  int test;
};

bar.c / foo.c

#include "foo.h"

実行結果

<div class="outline-text-3" id="text-2-1">
  <pre><code>

% gcc bar.c foo.c In file included from bar.c:3:0: foo.h:2:8: error: redefinition of ‘struct test’ struct test{ ^ In file included from bar.h:4:0, from bar.c:2: foo.h:2:8: note: originally defined here struct test{

progma onceについて

インクルードガードを実現するためのコンパイラの仕組みに、#pragma onceというのがある。

ヘッダファイルの先頭に以下を記述するだけ。

#pragma once

#ifndefは別の機能をたまたま応用にしているに過ぎないが、 #pragma onceは機能としてあるので直接的。

Links

08 Mar 2014, 06:33

Rubyでステートマシンを実装してみる

前回、ステート・パターンをRubyで実装してみた。

これを機に、ステート・マシンもちゃんと実装まで学んでおこうとおもう。

ステート・マシンとは

ステート・マシンとは、システムの振る舞いの仕組み。

ステートマシン図とは、それをUML記法で表したもの。

ステート・マシンの構成要素

ステート・マシンの構成要素は以下のとおり。

  • 状態(State) ・・・なんて定義してよいやら。
  • 遷移(Transition)・・・ひとつの状態から別の状態へ移行すること

遷移はさらに以下の3つに分解できる。

  • イベント(Event) ・・・遷移のきっかけ、トリが
  • ガード(guard) ・・・遷移するための条件(true/false)
  • アクション(Action) ・・・遷移時の動作

以下のように記述する。

Event[Guard]/Action

また、状態に関係する動作をアクティビティという。アクションは遷移に関係する。

do/Activity

UML図

以下のようなステート・マシンをRubyで実装する。

rubytk_state_machine.png

<p>
  前回は自分のステータスをもとに振る舞いを変更したけれども、 今回は、別プロセスの状態によって、振る舞いを変えるようにしてみる。
</p>

<div class="figure">
  <p>
    <img src="http://futurismo.biz/wp-content/uploads/wpid-rubytk_state_sequence2.png" alt="rubytk_state_sequence.png" />
  </p></p>
</div></p>

実装

08 Mar 2014, 01:00

EmacsからPlantUMLを便利につかう方法

EmacsからPlantUMLをつかう方法を調べた。

手順はここにある。

いかんせん、わかりにくかったので、自分でも作業メモを残そうと思う。

ob-plantuml.el

Emacs内でplantumlをコンパイルするには、ob-plantuml.elをつかう。

これは、24.1以降のバージョンだとbuild-inされているのでとくにインストールは不要。

以下のサイトを参考に、init.elに以下を記述。

(setq org-plantuml-jar-path "/usr/share/plantuml/plantuml.jar")
(defun org-mode-init ()
  (org-babel-do-load-languages
   'org-babel-load-languages
   (add-to-list 'org-babel-load-languages '(plantuml . t))))
(add-hook 'org-mode-hook 'org-mode-init)

使用例

org-modeで書いているドキュメントの中で以下のようなコードを書く。

C-c, C-e h oで Org文書をHTML変換する。 このときに、plantumlからUML図の生成も行われる。

Code

<div class="outline-text-3" id="text-2-1">
  <pre><code>

#+BEGIN_SRC plantuml :file sample.png :cmdline -charset UTF-8 Alice -> Bob: Authentication Request Bob –> Alice: Authentication Response #+END_SRC

<div class="outline-text-3" id="text-2-2">
  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-sample2.png" alt="sample.png" />
    </p></p>
  </div></p>
</div></p>

plantuml-mode.el

plantumlを書くためのモードもあります。package.elからインストールした。

(require 'plantuml-mode)
(add-to-list 'auto-mode-alist '("\\.puml$latex " . plantuml-mode))
(add-to-list 'auto-mode-alist '("\\.plantuml$" . plantuml-mode))

<p>
  最近は、ブログの記事をorg-modeで書いているので、これでブログ執筆が便利になった。
</p>

<ul class="org-ul">
  <li>
    <a href="http://zhangweize.wordpress.com/2010/08/25/creating-uml-images-by-using-plantuml-and-org-babel-in-emacs/">Creating uml images by using plantuml and org-babel in emacs | zwz&#8217;s Blog</a>
  </li>
</ul>

06 Mar 2014, 13:09

簡潔さは力なり!Rubyでステートパターン(State Pattern)を実装する

Rubyでステートパターンを勉強したので、その学習メモです。

サンプルは前回の記事を発展させたもの。

ステート・パターンとは

状態遷移をわかりやすく実装するためのパターン。

各状態をクラスで定義する。各状態は、抽象的なスーパークラスのサブクラスになる。

Spec

以下のような仕様を実装したい。

停止中に再生ボタンをクリックと動作中を表示
停止中に停止ボタンをクリックとなにも表示しない
動作中に再生ボタンをクリックと一時停止を表示
動作中に停止ボタンをクリックと停止を表示
一時停止中に再生ボタンをクリックする動作中を表示
一時停止中に停止ボタンをクリックする停止中を表示

状態は、停止中、一時停止中、実行中の3つ。この3つをクラスにする。

実装比較

普通の実装

<div class="outline-text-3" id="text-3-1">
  <p>
    if文が多いですね。
  </p>

  <p>
  </p>

  <p>
    ここで、さらにBoot中、Shutdown中なんて2つの状態追加がはいったらなかなか死ねます。
  </p></p>
</div></p>

パターン適用後

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

感動のボイント

感動のポイントをアピール。自分はここに感動した。


  def start

    if (@status == OFFLINE)
      @status = ONLINE
      @textValue = "動作中"
      return
    end

    if (@status == ONLINE)
      @status = SUSPEND
      @textValue = "一時停止中"
      return
    end

    if (@status == SUSPEND)
      @status = ONLINE
      @textValue = "動作中"
      return
    end
  end

  def stop

    if (@status == ONLINE)
      @status = OFFLINE
      @textValue = "停止中"
      return
    end

    if (@status == SUSPEND)
      @status = OFFLINE
      @textValue = "停止中"
      return
    end
  end

  def start
    @status = @status.start
  end

  def stop
    @status = @status.stop
  end

なんという簡潔さだろうか!ふるえちゃう。

06 Mar 2014, 11:43

[RubyTk]定期実行処理についてのメモ(Thread, TkAfter)

RubyTkでなにかの監視処理を実施する方法を調べたことのメモです。

RubyTk内でsleepが使えない

RubyTkでは、画面表示のために、Tk.mainloopを持ちいる。

これはメインスレッドで動作するため、 sleepをしてしまうとメインスレッドをその処理占有してしまい、 RubyTkをつかった描写ができない。また、逆もしかりである。

TkAfterをつかう

<div class="outline-text-3" id="text-1-1">
  <p>
    RubyTkでタイマ制御や定期監視のようなsleepに関わる処理に利用するライブラリがTkAfter.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.dumbo.ai.kyutech.ac.jp/nomura-ken/kajiyama/ruby_tk/after.html">http://www.dumbo.ai.kyutech.ac.jp/nomura-ken/kajiyama/ruby_tk/after.html</a>
    </li>
  </ul>

  <p>
    使用例は以下のとおり。
  </p>

  <p>
  </p>

  <p>
    タイマ制御がTkライブラリに依存してしまうのが個人的には気にくわなかった。
  </p>

  <p>
    なので、別の方法を考える。
  </p></p>
</div></p>

Threadをつかう

<div class="outline-text-3" id="text-1-2">
  <p>
    RubyのThread機能を利用して、別スレッドで定期的な処理を動かす。
  </p>

  <p>
    定期的な通知には、observerライブラリを利用する。
  </p>

  <p>
  </p>

  <p>
    どちらも実現したいことは同じだけれども、2つめのアーキの方が好きだ。
  </p></p>
</div></p>

05 Mar 2014, 12:29

[RubyTk] GUIアーキテクチャの定番MVCをRubyTkで実装してみる

MVCについて勉強したので、実際にRubyTkに応用してみる。

MVCとは

MVCとは、アーキテクチャの一つ。 Model-View-Controllerの略。 ユーザ・インタフェースをもつアプリケーションをうまくつくるための設計方法。

詳しい解説は、リンク先に譲るとする。

MVCアーキを利用すると、

  • 仕様変更につよい
  • 移植がしやすい

などのメリットがある。

また、テストが書きやすいという利点もある。 RubyTkライブラリがからむとviewのテストがかけない。 tkライブラリは論理的な処理から切り離したい。

MVC実装例

ボタンをおすと、ファイルからデータを読み出して、画面に表示するアプリケーションをつくる。

MVC以前

<div class="outline-text-3" id="text-2-1">
  <p>
    普通の実装。
  </p>

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

<div id="outline-container-sec-2-2" class="outline-3">
  <h3 id="sec-2-2">
    MVCの実装
  </h3>

  <div class="outline-text-3" id="text-2-2">
    <p>
      Model, View, Controllerの3つにクラスを分割して実装。
    </p>

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

  <div id="outline-container-sec-2-3" class="outline-3">
    <h3 id="sec-2-3">
      proc, lambdaを導入する
    </h3>

    <div class="outline-text-3" id="text-2-3">
      <p>
        上の例だと、ViewとControllerの間に依存関係がある。これをなくしたい。
      </p>

      <p>
        Rubyでコールバックやハンドラの仕組みを導入するためにはどうすればいいのだろうか?
      </p>

      <p>
        答えは、procやlambdaを利用すればうまくできた!といっても、完全に依存関係がなくなったわけではないけど。
      </p>

      <p>
        感性的にこっちの方が美しく感じる。
      </p>

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

    <div id="outline-container-sec-2-4" class="outline-3">
      <h3 id="sec-2-4">
        Links
      </h3>

      <div class="outline-text-3" id="text-2-4">
        <ul class="org-ul">
          <li>
            <a href="http://stackoverflow.com/questions/1677861/how-to-implement-a-callback-in-ruby">How to implement a &#8220;callback&#8221; in Ruby? &#8211; Stack Overflow</a>
          </li>
        </ul>
      </div></p>
    </div></p>
  </div>

04 Mar 2014, 13:20

Rubyにおけるロードパス(require)のtips

基本的なことかもしれないけれども、基本すらできないので、Rubyのrequireについてしらべたことをまとめ。

requireとは

requireとは、ロードパスからファイルを探してきて自分のコードに取り込む仕組み。

requireの他にも、loadというものもある。両者の違いは別記事で以前まとめた。

<div class="outline-text-3" id="text-1-1">
  <p>
    たとえば、同一ディレクトリにあるhogehogeを自分のコードに取り込みたいときは、以下のようにつかう。
  </p>

  <pre><code>

requireを使う場合

requier ‘./hogehoge’

require_relativeを使う場合

require_relative ‘hogehoge’

  <p>
    requireは、LOAD_PATHが通ったところをロードするため、カレントディレクトリのファイルをロードするためには、ドットをうつ。
  </p>

  <p>
    require_relative相対パスでパスを指定できる。
  </p>

  <p>
    余談で、rspecは実行時にlibとspecのディレクトリがロードパスに追加される。
  </p></p>
</div></p>

相対パスがかっこ悪いのでなんとかする

個人的には、相対パスがかっこ悪いので、何とかしたい。

コード中でLOAD_PATHにカレントディレクトリを追加

<div class="outline-text-3" id="text-2-1">
  <p>
    以下の処理を書くと、コード実行時にLOAD_PATHに自分のディレクトリを追加できる。
  </p>

  <pre><code>

簡易版

$:.unshift File.dirname(FILE)

自分でパスを追加したい場合

$:.unshift(File.dirname(File.expand_path(FILE)) + ‘起動したプログラムからの相対パス’)

ruby起動時にLOAD_PATHにディレクトリを追加

<div class="outline-text-3" id="text-2-2">
  <p>
    ruby -I (ディレクトリ)でもパスを追加できる。起動用のシェルやbatを作成するといいかも。
  </p>

  <pre><code>

#!/bin/bash

current_dir=dirname $0 cd ${current_dir}

ruby -I ./lib $@

03 Mar 2014, 12:21

[RubyTk]コンポジット・パターン(Composite Pattern)とTkCompositeについてしらべた

RubyTkにTkCompositeというなぞのライブラリがあるので、しらべた。

名前から推測するに、Composite Patternと関係がありそうだ。

Composite Patternとは

Composite Patternとは、Gofのパターンの一つ。

説明はwikipediaに譲るとして、自分の理解では、

再帰的な操作が可能なデータ構造

親子関係のあるデータ構造と素の操作

という感じ。たとえば単方向リスト、木構造などのデータ構造とそれに対する操作。 何だか当たり前のことだ。

登場人物

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Component(親) 全ての親になるもの
    </li>
    <li>
      Leaf(葉) Leafを持たないもの
    </li>
    <li>
      Composite(枝)Leafを持つもの
    </li>
  </ul>
</div></p>

TkCompositeの使い方

TkCompositeを利用すると、 複数のウィンドウ部品がまとまってできているウィンドウ部品を簡単に作成できるみたい。

以下が、作法。


class Tkhoge < TkWindow
  include TkComposite

  def initialize_composite
    ...
  end
end

@frameがインスタンス変数として利用できる。 この@frameを親にして、この部品たちを組み合わせる(ここがcomposite!)

delegateを利用すると、属性を子の部品に委譲できる。

詳しくは以下のリンクを参照。

サンプル

再生、停止ボタン、エントリフィールドをもつのモックguiを作成してみた。

GUIの親部品、子部品がcompositeのよきサンプル。

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>