C# アイドルマスターシンデレラガールズ等で学ぶオブジェクト指向

<B>ここから以下は物凄い真面目な話なので、萌えとかアイドルとかシンデレラとかを期待している方はご注意下さい。</B>

なぜこのような投稿をする事になったのかと言うと以下のような会話があった。
「オブジェクト指向が分からん、解説サイトも見たがやっぱり分からん、ガンダムで例えてくれ」
「シャアの本名はキャスバル・レム・ダイクンだが、シャア・アズナブルだと世に知られ、クワトロ・バジーナと名前を変え、やっぱり名前を戻したかと思えばシャア・ダイクン（小説版）となり、しまいには似たような全く別人のフル・フロンタルまで出てくる。
つまり、シャアを入れ物（オブジェクト）と定義し、キャスバル・レム・ダイクン、シャア・アズナブル、クワトロ・バジーナ、シャア・ダイクン、フル・フロンタルは実体化（インスタンス）である。これを C# のコードで書くとこうなる」

```lang:オブジェクト指向のシャア
    class シャア
    {
        public string name = null;
        bool NewType = false;
        bool FakeNewType = true;
        int NewTypeValues = 0;
        bool マザコン = false;
        int ララァ度 = 0;
        String CV = "池田秀一";
        public void マザコンチェック()
        {
            if (ララァ度 > 100) ///ララァ度が一定数に達すると、マザコンboolがtrueになります。
            {
                マザコン = true;
            }
            if (マザコン == true)
            {
                Console.Write("ララァは私の母になってくれたかも知れなかった女性だ！"); ///マザコンが確認されるとこうなります
            }
            else
            {
                Console.Write("フフフ、ララァは賢いな"); ///ララァ度を上げます
                ララァ度++;
            }
        }
        public void ニュータイプになった気がする()
        {
            if (NewType == true)
            {
                Console.Write("見えるぞ、私にも敵が見える");
            }
            else
            {
                if (NewTypeValues > 100)
                {
                    NewType = true;
                }
                if (FakeNewType == true)
                {
                    Console.Write("しかし私もニュータイプのはずだ"); ///自分に言い聞かせることによって本物になる
                    NewTypeValues++;
                }
            }
        }
    }
```

これをインスタンスで実体化するとこうなる

```lang:実体化のシャア
            シャア シャア・アズナブル = new シャア;
            シャア・アズナブル.name = "シャア・アズナブル";
            シャア・アズナブル.マザコンチェック();
            シャア・アズナブル.ニュータイプになった気がする();
```

ちなみに、フル・フロンタルにこんなセリフがある。
「今の私は自らを器と規定している。宇宙（そら）に棄てられた者達の思い、ジオンの理想を継ぐ者達の宿願を受け止める、器だ」
「彼等がそう望むなら私はシャア・アズナブルになる。このマスクはそのためのものだ」
ご覧のようにオブジェクト指向な要素がたっぷりあるじゃないか。
よって　オブジェクト指向＝＝シャアである。
これはオブジェクト指向にシャアを代入しているのではなく、等価であることを示している。
つまり本稿のタイトルは正しくは「アイドルマスターシンデレラガールズ等で学ぶシャア」であるはずなのだが、そうはならない。

以上のようなやり取りがあった上で、さらに以下の会話があった。
「シャアのおっさんばかり想像してしまってテンション上がらない」
「何ならテンション上がる」
「アイドルマスターシンデレラガールズ」
「よし」
と言うわけで、先程実体化したシャアはメモリ上から破棄して電子の宇宙（そら）に沈んでもらう事とした。
全部アムロ（ガベージコレクション）が悪い。

```lang:理不尽にガベージコレクションされる直前のシャアの表情
　　　　 　 　 　 　 ,ｲ　　　　│
　　　　　　　　　 //　　　 　 |:!
　 　 　 　 　 　 //,. -/r‐- ､| !
　　　　　　 　 /,/　./　|　　_」 ﾄ､
　　　　　　　/.＼`/　　|二...-┘ ヽ
　　　 　 　 i　　 ,.>､;／ｰ- ､　　 l
　　　　　　 ! ∠..＿;'＿＿＿_＼ 　 |
　　　　　　,!ｲ く二>,.、 <二＞｀＼.､ヽ.
　　　　 ／'´レ--‐'ﾉ. `ｰ---- ､　|＼ ヽ、
　　　　＼　 `l　　(!"　　　 　 Jfヽ!　 `''-;ゝ
　　　　　 `‐､jヽ　ヾﾆﾆゝ　　 ﾞｲ" }_,,. ‐''´
　　　　 　 　 `´＼　 ｰ 　 ／ ,ィ_}
　　　　　　　 　 |_ `ー ''´　＿｣'
　　　　　 　 ＿,.|　~||｢　￣　人|､.＿
　　,r=＝;"´　　ヽ ﾐ|||彡　　 ／　` ｰ`＝=､-､
 　///,ｲ　 ＿＿_ ヽ|||_,,. ‐''´＿＿＿　　| | | |ヽ
```

さて、アイドルを作りたいと思う。
その設計図をまず作る。

```lang:オブジェクト指向のアイドル
    class アイドル
    {
        public string 名前 = null; ///姓名は続けて表記
        public string 誕生日 = "1月1日"; ///表記は"x月x日"で統一
        public string 星座 = null;
        public string 血液型 = null;
        public int 身長 = 0; ///cm単位
        public int? 体重 = null; ///kg単位、null許容型
        public int バスト = 0; ///cm単位
        public int ウエスト = 0; ///cm単位
        public int ヒップ = 0; ///cm単位
        public string 出身地 = null;
        public string 趣味 = null;
        public void 付き合って下さい()
        {
            Console.Write("お断りします");
        }
        public void 話を聞いて下さい()
        {
            Console.Write("お断りします");
        }
    }
```

アイドルの設計図（入れ物）が完成したら、
これをインスタンスで実体化するとこうなる。

```lang:アイドルマスターシンデレラガールズの実体化
            アイドル 島村卯月 = new アイドル();
            島村卯月.名前 = "島村卯月";
            島村卯月.誕生日 = "4月24日";
            島村卯月.星座 = "牡牛座";
            島村卯月.血液型 = "O型";
            島村卯月.身長 = 159;
            島村卯月.体重 = 44;
            島村卯月.バスト = 83;
            島村卯月.ウエスト = 58;
            島村卯月.ヒップ = 87;
            島村卯月.出身地 = "東京都";
            島村卯月.趣味 = "友達と長電話";
            ///http://imas-cinderella.com/character/#uzuki
　　　　　　 島村卯月.付き合って下さい() ///Console.Write("お断りします")が返される
```

ちなみにこの設計図を流用し、ラブライブを実体化するとこうなる。

```lang:ラブライブの実体化
            アイドル 南ことり = new アイドル(); ///あの輪っか型の髪型、関数グラフで描けそう
            南ことり.名前 = "南ことり";
            南ことり.誕生日 = "9月12日";
            南ことり.星座 = "乙女座";
            南ことり.血液型 = "O型";
            南ことり.身長 = 159;
            南ことり.体重 = null;
            南ことり.バスト = 80;
            南ことり.ウエスト = 58;
            南ことり.ヒップ = 80;
            南ことり.出身地 = "";
            南ことり.趣味 = "お菓子作り";
            ///http://www.lovelive-anime.jp/member/member03.html
　　　　　　 南ことり.付き合って下さい() ///Console.Write("お断りします")が返される
```

<S><B>血液型、身長、ウエストが同じだ！！！！！</B></S>
このように、設計図を流用してどんどん実体化が作れる為、非常に便利である。
「付き合って下さいメソッド」も自動的に実体化ごとに作成されるので、
生成したアイドルの実体化の数だけ「付き合って下さいメソッド」を実行可能である。

ここまで説明して、以下の言葉を聞いた。
「すまん、俺は前川みく派なので、みくにゃんをインスタンス化してくれ」
俺はアナスタシア派なので、せっかくだから前川みくとアナスタシアのインスタンスを作成した。
その後、どのインスタンスの破棄から始めるのかで揉めたのは言うまでもない。

インスタンスの破棄を手動で行う場合、不適切なタイミングでGC（ガベージコレクション）が動いて<B>パフォーマンスが低下する恐れ</B>があるので、
基本的には放置していて問題ありません。
多分、コーダーが思っている以上にGCは複雑怪奇に出来上がっているので、その機能に頼ろうとするのは正しいです。

ガベージ コレクションの基礎
https://msdn.microsoft.com/ja-jp/library/ee787088(v=vs.110).aspx
【翻訳】視覚化による5つのガベージコレクションアルゴリズム入門
http://postd.cc/visualizing-garbage-collection-algorithms/

貴方が丹精込めて実体化した物は、GCが生暖かい眼で見守ってくれています。
<B>【重要】どのアイドルが真っ先にGC対象になるかの話はここでは論じない事とします。</B>

機動戦士ガンダム　http://www.gundam.jp/ © 創通・サンライズ
アイドルマスターシンデレラガールズ　http://imas-cinderella.com/ © Aniplex Inc. All rights reserved.
ラブライブ！　http://www.lovelive-anime.jp/ © 2013 プロジェクトラブライブ！