アリスはプラダに猫がいることを知らない

な感じで、内部データを遅延して持って来る例を作ってみる。

class Program
{
    public static List<Cat> cats = new List<Cat>();
    static void Main(string[] args)
    {
        cats.Add(new Cat(&quot;tora&quot;));
        cats.Add(new Cat(&quot;mike&quot;));

        var pradaRed = new Prada();
        var pradaBlue = new Prada();
        var pradaYellow = new Prada();

        Console.WriteLine(&quot;1: {0}&quot;, pradaRed.Cat?.Say());
        Console.WriteLine(&quot;2: {0}&quot;, pradaRed.Cat?.Say());
        Console.WriteLine(&quot;3: {0}&quot;, pradaBlue.Cat?.Say());
        Console.WriteLine(&quot;4: {0}&quot;, pradaYellow.Cat?.Say());

        return;
    }
}

class Cat
{
    string _name = &quot;&quot;;
    public Cat(string name)
    {
        _name = name;
    }
    public string Say()
    {
        return $&quot;{_name}: nya-&quot;;
    }
}
class Prada
{
    Cat _cat = null;
    public Cat Cat
    {
        get
        {
            if (_cat == null)
            {
                _cat = Program.cats.FirstOrDefault();
                if (_cat != null)
                {
                    Program.cats.Remove(_cat);
                }
            }
            return _cat;
        }
    }
}

実行するとこんな感じ

意味合いとしては、アリスはプラダのバックを3つ持っている(pradaRed、pradaBlue、pradaYellow)んだが、中に猫がはいってるかどうかは分からない。どの順番で開ける猫がいるかわからないし、猫がいるかどうかも知らない。でも、開けると猫が入っているか、また猫が入ってないかわかる。というシュレディンガーなプラダな猫の話。

cats は最初から用意されているので、外部データとして存在します。メインプログラムのアリスから見れば、最初は、Prada のオブジェクトを作るだけなので、内部の _cat が存在するかどうかは知らない。というか、知らなくてもいい状態。Cat プロパティを呼んだときにはじめて、中の cat を取り出すことができる。鞄クラスの Prada から見える Cat プロパティは、外部からみれば単純にデータを返しているように見えるが、実際は別に用意されている cats から取り出している。
つまり、MVVM パターンでいえば、View が VM に対してプロパティアクセスでデータを取り出しているときに、VM は Model からデータを引っこ抜くわけだが、そこは View が VM に問い合わせたときまで遅延される方式になっている。MVVM の大抵の例は、Model が省略されていて、View から VM のアクセスしかないのだが、ここで VM と Model との違いが明確になるよという話だ。

こんな感じで MVVM パターンを使える。Model は常に VM から参照される「制限」を付けることで、MVVM パターンの役割が担えるということだ。

じゃあ、Model(データベースや計測器など)からデータが上がってくるようなときはどうするのか?ってのは別パターンを使うことになる。この話は別の記事に書くことにしよう。

カテゴリー: 設計 パーマリンク