「c# 大好き mvp による、c# ドキドキ・ライブコーディング!!」小島の分
TRANSCRIPT
「 C# 大好き MVP による、 C# ドキドキ・ライブコーディング !! 」
小島の分
小島 富治雄2016-02-20
Hokuriku ComCamp 2016 powered by MVPs
自己紹介
• 小島 富治雄• @Fujiwo• http://blog.shos.info• 福井コンピュータアーキテクト株式会社• Microsoft MVP (2005-2016)
C# の好きなところ
• 心地よい進化
C# 1.0 C# 2.0 C# 3.0 C# 4.0 C# 5.0 C# 6.0
オブジェクト指向
ジェネリック
関数型
dynamic
非同期
Roslyn
石野さんからの今回の 無理難題 お題
ちょっと何言ってるか分からない。
「ライブ コーディング 30 分で
伝説の落ちゲーを」
「 WinForms で。だいじょうぶですよね。MVP だから」
今回のお題 : 「 WinForms で伝説の落ちゲー」
これは インチキ 工夫 をするしかない
戦略
• モデル部分を用意しておく• で、「 3 分クッキング方式」と言い張
る
• ビュー (UI) 部分をライブで作る
先ずはモデリング
0 0 0 0 0 00 0 0 00 0 0 0 0 00 0 0 03 0 0 0 0 00 0 0 33 3 0 0 0 00 0 0 00 0 0 0 0 01 0 0 00 0 0 0 0 01 0 0 00 0 0 0 6 01 5 0 00 0 0 6 6 61 5 5 5
見えているものを、どうシンプルに捉えるか
モデリング
• THE MATRIX の NEO (The One) にはこう見える筈
でも、二次元配列は複雑
• 戦略 1.• SelectMany をやって、一次元 (IEnumerable<T>)
に変換すればいいじゃん→ Linq が使える
public static IEnumerable<T> ToSequence<T>(this T[,] @this){ return @this.AllPoints().Select(point => @this.Get(point)); }
public static IEnumerable<Point<int>> AllPoints<T>(this T[,] @this){ return from x in Enumerable.Range(0, @this.GetLength(0)) from y in Enumerable.Range(0, @this.GetLength(1)) select new Point<int> { X = x, Y = y };}
でも、二次元配列は複雑
• 戦略 2.• 二次元配列用の ForEach 等を作ればい
いじゃん
public static void ForEach<T>(this T[,] @this, Action<Point<int>, T> action){ @this.AllPoints() .ForEach(point => action(point, @this.Get(point)));}
モデル
モデルがしっかり書けていれば…
• View と ViewModel を追加してWPF 版が作れる筈
取り敢えず WPF 版 を作成
WPF 版
• 動いた
モデルがしっかり書けていれば…
• モデルをそのまま使って…• WindowsForms 版が作れる筈• コンソール アプリも簡単にできる筈
モデルがしっかり書けていれば…
• TypeScript にも簡単に移植できるはず• でも今回のお題は WinForms だし ...• まあ、とりあえず移植してみた
TypeScript 版
• Three.js (JavaScript WebGL ライブラリ )+ TypeScript
TypeScript 版
• 動いたので、なんとなく Web にアップ• http://www2.shos.info/FTetris.TS/
• 悪魔の囁き「メイン フォームに WebBrowser コントロール貼って、この URL 渡せば、それって WinForms アプリじゃね ? 」• 怒られるけど
今回の方針
• 三本立て ( なので怒らないでほしい )• 「 3 分クッキング方式」で WinForms
アプリを作る• コンソール アプリも作る• 最悪、 WinForms に WebBrowser 貼
るだけ
ソースコードは公開
• https://github.com/Fujiwo/https-github.com-Fujiwo-FTetris