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

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

[code lang=”csharp”]
class Program
{
public static List<Cat> cats = new List<Cat>();
static void Main(string[] args)
{
cats.Add(new Cat("tora"));
cats.Add(new Cat("mike"));

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

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

return;
}
}

class Cat
{
string _name = "";
public Cat(string name)
{
_name = name;
}
public string Say()
{
return $"{_name}: nya-";
}
}
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;
}
}
}
[/code]

実行するとこんな感じ

意味合いとしては、アリスはプラダのバックを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(データベースや計測器など)からデータが上がってくるようなときはどうするのか?ってのは別パターンを使うことになる。この話は別の記事に書くことにしよう。

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