Unityマンへの道 その1:observe

そもそも急にお勉強スイッチが入ったのは、大学でお世話になった先輩から勉強の道筋を示していただいたからである。

その先輩がラムダ式LINQ分かったらobservableを勉強してみなさいと仰ってたのでそれをやってみる。
ラムダ式LINQが分かったとは言ってない。今はとにかく新しいことを知りたい気分だから定着はもう少しやってからなんだ…そういうことにするんだ…

 

Observe = 観察する

大学受験の知識の残滓でこの単語の意味は知ってた。「観察する」だ。
調べたところ、Observableパターンというのは、特定のインスタンスに他のインスタンスを監視させ、リアクションを取らせるという感じのものらしい。

push式とかpull式とかあるらしいが、とりあえず下記URLの一番最初のコードを写経してみた。

qiita.com

 

この記事では回転寿司屋さんを題材に分かりやすく解説してくれていた。
コードまで転記するとさすがにあれなので、部分的な抜粋と、自分で補足したことだけ記録する。

 

まず、Interfaceを定義した。ここがミソらしい。
「IObserver」つまり「監視役(に継承させるinterface)」と
「ISubject」つまり「監視対象(に継承させるinterface)」を作った。

IObserverには「OnNotified」メソッド、つまり「気づいたときに何するかメソッド」が、ISubjectには「NotifyObservers」(監視役に気付かせる)、「Subscrive」(発生したイベントを購読?する)、「UnSubscrive」(購読辞める)メソッドがそれぞれ定義されていた。

Observableを構成する基本要素ということなのだろう。

 

回転寿司屋であれば、監視されるのは寿司レーンだ。
ということでISubjectを継承したSushiLaneクラスを作り、Mainメソッド内でインスタンス化させる。

次に、監視者…お寿司の監視者、つまり客だ。IObserveを継承しSushiObserverクラスを作り、やはりMainメソッド内でインスタンス化させる。

 

このとき、SushiObserverには「何を監視するか」を定義しなければならない。あらかじめSushiObserverクラス内に、監視対象を格納するための「Subject」という変数を用意したので、インスタンス生成時に「Subject = SushiLaneクラスから作ったインスタンス」を格納してあげる。
こうしないと、「何かを監視するけど、何を監視するか分からない人」ができてしまう。

さて、次が個人的に一番重要だった。
observerのインスタンスを作ったのでもういいかと思ったが、あくまで「寿司レーンを監視するやつを作成した」だけであり、寿司レーンオブジェクト内で操作できるように引き渡していない。
こいつらは言ってみれば「入店」していないわけだ。

そこで、寿司レーンインスタンス内のSubscriveメソッドに、引数としてobserverインスタンスを渡す。これにより、寿司レーンの監視者が監視の任に着けるというわけだ。

ちょっと訳わかんなくなったのでMainメソッドだけ載せちゃう。

 

class Program
{
    static void Main(string[] args)
    {
        //監視する寿司レーンを作った
        var subject = new SushiLaneSubject();
        //寿司を食べたい人を二人作成する。
        //(Subjectを監視する人を二人作る。ここではSubject=寿司レーンなので、「寿司レーン監視するマン」が二人作成された。
        var observer1 = new SushiObserver() { Subject = subject };
        var observer2 = new SushiObserver() { Subject = subject };

        //寿司レーンに寿司を食べたい二人を着席させる。
        //-!監視するマンを作成するだけではダメで、監視対象側にそいつらを渡してやる必要がある。
        subject.Subscribe(observer1);

        subject.Subscribe(observer2);

        //寿司レーンにネタが現れる
        subject.Neta = "まぐろ";
        //ネタが来た通知を出す。
        subject.NotifyObservers();
    }
}

 

以上。最近めちゃ眠いので続きはあした。