Visual Studio による開発環境・プログラミングの進化

69
Community Launch 2008 COMU+ ここここここ Visual Studio ににに にににに にににににににににに 2008/06/14 にににににに にに ににに にににににににににににににに ににに

description

こみゅぷらす Community Launch 2008 http://comuplus.net/clt2008/ 2008年6月14日

Transcript of Visual Studio による開発環境・プログラミングの進化

Page 1: Visual Studio による開発環境・プログラミングの進化

Community Launch 2008

COMU+こみゅぷらす

Visual Studio による開発環境・プログラミングの進化

2008/06/14 こみゅぷらす 小島 富治雄

~プログラミングはどう変わるか 中級編~

Page 2: Visual Studio による開発環境・プログラミングの進化

はじめに

Page 3: Visual Studio による開発環境・プログラミングの進化

自己紹介小島 富治雄 (Fujiwo)

福井コンピュータ株式会社INETA 所属コミュニティ所属

こみゅぷらす (COMU+)運営スタッフ

Microsoft MVP for Development

Tools - Visual C#

Page 4: Visual Studio による開発環境・プログラミングの進化

自己紹介ジャグリング

自転車通勤

万年筆

世界のなべあつ

マイブーム

Page 5: Visual Studio による開発環境・プログラミングの進化

今日話したいこと

Visual Studio による開発環境・プログラミングの進化プログラミングはどう変わるか 中級編LINQ 周りを中心に

Page 6: Visual Studio による開発環境・プログラミングの進化

Agenda

1. 復習2. .NET の進化と Visual Studio3. Demo4. 美しいプログラムについて

( オプション )

Page 7: Visual Studio による開発環境・プログラミングの進化

1. 復習

Page 8: Visual Studio による開発環境・プログラミングの進化

まずは… .NET1.0 でのプログラミングでキモとして押さえておくべきところ

.NET らしい Cool な書き方delegate と eventデータバインド属性 ( アノテーション )

プログラム部品 ( コンポーネントなど ) 同士を、ゆるめに結合

Page 9: Visual Studio による開発環境・プログラミングの進化

データバインドの例

: DrawingUI : Data描画する

: Application

Page 10: Visual Studio による開発環境・プログラミングの進化

+ 追加() : void

+ <<event>> Changed : Action<T>

Data

+ OnChanged() : void

DrawingUI

IDataSource<T>

DataSource

<<realize>>

Application

- drawingUI

- data

データバインドdrawingUI.DataSource = data;

Page 11: Visual Studio による開発環境・プログラミングの進化

+ 追加() : void

+ <<event>> Changed : Action<T>

Data

+ OnChanged() : void

DrawingUI

+ <<event>> Changed : Action<T>

<<interface>>IDataSource<T>

<<interface>>IEnumerable<T>

<<realize>>

DataSource

interface IDataSource<T> : IEnumerable<T>{ event Action<T> Changed;}

class Data<T> : IDataSource<T>{ List<T> list = new List<T>();

public event Action<T> Changed;

public void Add(T item) { list.Add(item); if (Changed != null) Changed(item); }

public IEnumerator<T> GetEnumerator() { return list.GetEnumerator(); }

IEnumerator IEnumerable.GetEnumerator() { return list.GetEnumerator(); }}

public delegate void Action<T>(T item);

interface IDrawable{ void Draw();}

class DrawingUI<T> : UserControl where T : IDrawable{ IDataSource<T> dataSource = null;

public IDataSource<T> DataSource { set { dataSource = value; value.Changed += OnChanged; } private get { return dataSource; } }

public void Draw() { if (DataSource != null) foreach (T item in DataSource) item.Draw(); }

void OnChanged(T item) { item.Draw(); }}

データバインド サンプル (C#2.0)

Page 12: Visual Studio による開発環境・プログラミングの進化

2. .NET の進化と Visual Studio

Page 13: Visual Studio による開発環境・プログラミングの進化

.NET Framework の進化1.0 1.1 2.0 3.0 3.5

ランタイム (CLR)

1.0.3705 1.1.4322 2.0.50727832

2.0.507271433

トピック ADO.NETASP.NET

WinForm

ASP.NET1.1 ADO.NET 2.0ASP.NET 2.0

C# 2.0VB 8.0

WPFWF

WCFCardSpace

ASP.NET AJAXLINQ

C# 3.0VB 9.0

VS2002 ◎

VS2003 ◎

VS2005 ◎ △

VS2008 ○ ○ ◎

サポート期限

2007/07/10 2008/10/14 2011/01/12 2012/04/10 ----

Page 14: Visual Studio による開発環境・プログラミングの進化

.NET Framework 全体像

.NET Framework 3.5 の構成

Base Class Library (BCL)

ASP.NETADO.NET Window Forms

WCF WF WPF CardSpace

WCF 追加 WF 追加 WPF 追加 BCL 追加

ASP.NET 追加(ASP.NET AJAX) LINQ

New!

ライブラリの拡張・強化 !

Page 15: Visual Studio による開発環境・プログラミングの進化

Visual Studio でのプログラミングで変わること

IDE の進化各種図解的言語のデザイナ

WPFデータ モデル (LINQ to SQL など )ワークフロー

Page 16: Visual Studio による開発環境・プログラミングの進化

Visual Studio でのプログラミングで変わること

LINQ(Language-INtegrated Query:言語に統合されたクエリ )

C#3.0/Visual Basic9.0LINQ プロバイダ

LINQ to ObjectLINQ to SQLLINQ to DataSetLINQ to XML

Page 17: Visual Studio による開発環境・プログラミングの進化

参考 : LINQ の種類

.NET LINQ

LINQ to Objects

LINQ to Datasets LINQ to SQL LINQ to

Entities LINQ to XML

C# VB その他の言語

ObjectData Base

XML

Page 18: Visual Studio による開発環境・プログラミングの進化

参考 : Linq とは何か  IEnumerable<T> ベースの

すべての情報ソースにクエリを適用する技術

Page 19: Visual Studio による開発環境・プログラミングの進化

参考 : Linq to Object

var bookList = new[] { new { タイトル = "C# 入門 " , ISBN コード = "AAAAAAA", 価格 = 2980 }, new { タイトル = "VB 入門 " , ISBN コード = "BBBBBBB", 価格 = 3300 }, new { タイトル = ".NET Framework", ISBN コード = "CCCCCCC", 価格 = 7800 } };

var books = from aBook in bookList where aBook.ISBN コード == "BBBBBBB" orderby aBook. タイトル select new { タイトル = aBook. タイトル , 価格 = aBook. 価格 }; books.ForEach(item => Console.WriteLine(item));

•IEnumerable<T> なオブジェクトをクエリ

例 .

Page 20: Visual Studio による開発環境・プログラミングの進化

Visual Studio でのプログラミングで変わること

更なるマルチ パラダイム化1.0 の頃…

手続き型オブジェクト指向コンポーネント指向

2.0 以降ジェネリック関数型より動的にDSL (Domain Specific Language: ドメイン特化言語 ) の進化

Page 21: Visual Studio による開発環境・プログラミングの進化

例 . C# 1.0 → 2.0、3.0によるプログラミングの進化

オブジェクトへの委譲 → メソッドへの委譲

class → delegate → 匿名メソッド ( クロージャ ) → ラムダ式

yield による継続これらと拡張メソッドによるメソッド チェーン

Page 22: Visual Studio による開発環境・プログラミングの進化

Anders Hejlsberg

Page 23: Visual Studio による開発環境・プログラミングの進化

Anders Hejlsberg

Page 24: Visual Studio による開発環境・プログラミングの進化

Anders Hejlsberg 談 :C# の今後について2006/02/02 at 横浜

Q. 今後 C# は、関数型言語として進化していくのか ?

A. Yes. C#3.0 や LINQ で導入された「ラムダ式」などの機能は、 Haskell や ML などの関数型言語に触発されたものだ。これらの機能は開発をもっと自由な形にする。設計しているだけでワクワクするような機能だ。 C# 3.0 というのは、オブジェクト指向言語と関数型言語の「ハッピーな結婚」といってよいものになるだろう。

Page 25: Visual Studio による開発環境・プログラミングの進化

3. Demo

Page 26: Visual Studio による開発環境・プログラミングの進化

世界のなべあつ

Page 27: Visual Studio による開発環境・プログラミングの進化

例 . 世界のなべあつ手続き型パラダイムなべあつマルチパラダイムなべあつLINQ なべあつコンポーネント指向なべあつ

Page 28: Visual Studio による開発環境・プログラミングの進化

手続き型なべあつ

Page 29: Visual Studio による開発環境・プログラミングの進化

手続き型なべあつ「 3 の倍数と 3 の付く数字だ

けアホになり、5 の倍数だけ

犬っぽくなります」

Page 30: Visual Studio による開発環境・プログラミングの進化

手続き脳で考えてみる1. 順次実行、条件分岐、繰り返

し処理の組み合わせで考える2. 処理の順序を考える3. 各繰り返しの中で何をするか

考える4. 更により小さい粒度の処理で、

同様に考える

Page 31: Visual Studio による開発環境・プログラミングの進化

手続き脳で考えてみる1. 1 から 40 まで繰り返す2. 繰り返しの中で、各の数に

ついておもろーに言う数をおもろーに言う

三が付くかまたは三の倍数で五の倍数のときはあほっぽく犬っぽく言う三が付くかまたは三の倍数のときは、あほっぽく言う五の倍数のときは、犬っぽく言うそれ以外のときは、普通に言う

Page 32: Visual Studio による開発環境・プログラミングの進化

手続き型なべあつフローチャート 1

数をおもろーに言う

「ヘーイ」と言う

「今から、三が付く数字と、三の倍数の時だけ、アホになり、五の倍数のときは、犬っぽくなります。」と言う

数 = 1, 40, 1

おもろーなギャグ.やる

Page 33: Visual Studio による開発環境・プログラミングの進化

手続き型なべあつフローチャート 2

数をアホっぽく犬っぽく言う

数をアホっぽく言う

数を犬っぽく言う

数を普通に言う

数をおもろーに言う

三が付くかまたは三の倍数 && 五の倍数

三が付くかまたは三の倍数

数が五の倍数

その他

Page 34: Visual Studio による開発環境・プログラミングの進化

Community Launch 2008

DEMO

手続き型なべあつ

Page 35: Visual Studio による開発環境・プログラミングの進化

手続き型なべあつの分割の様子言う

おもろーに言う

倍数かどうか

含むかどうか

アホっぽく犬っぽく言う

言う

犬っぽい読みへの変換

アホっぽい読みへの変換

読み

アホっぽく言う

或る桁の数の読み

犬っぽく言う

言う

犬っぽい読みへの変換

普通に言う言う

読み 或る桁の数の読み

読み 或る桁の数の読み

アホっぽい読みへの変換

言う

言う

倍数かどうか

読み 或る桁の数の読み

「手続き型なべあつ」おもろーなギャグ .やる

Page 36: Visual Studio による開発環境・プログラミングの進化

マルチパラダイムなべあつ

Page 37: Visual Studio による開発環境・プログラミングの進化

別の考え方1. 「 1~ 40 の数の集合」を2. 「集合に対する『おも

ろーな加工』をするフィルタ」に通したものが

3. 「集合を出力するもの」のデータだ

Page 38: Visual Studio による開発環境・プログラミングの進化

シーケンシャルな . 次の範囲の数 (1, 40)

そのそれぞれに次の変換をし( 数 => おもろーに読む ( 数 ))

列挙可能 (IEnurarable) な何か

列挙可能 (IEnurarable) な何か

ギャグ

データバインド !

( 列挙可能な何かを加工する汎用的な )

フィルタ !

列挙可能な何かを出力できる何か

new おもろー ()

new なべあつ ()

読み上げてくれる何か

遅延評価 !

Page 39: Visual Studio による開発環境・プログラミングの進化

ニューなべあつ

なべあつ

+ Main() : void

なべあつプログラム

+ 言う(台詞 : string) : void

<<interface>>読み上げ可能な何か

読み上げてくれる何かが

+ GetEnumerator() : IEnumerator

<<interface>>IEnumerable

string

+ 言う(台詞 : string) : void

音声読み上げ

+ 言う(台詞 : string) : void

コンソール読み上げギャグ

+ GetEnumerator() : IEnumerator

おもろー

・フィルタのチェーン・yield return (遅延評価)

データバインド!(ForEach) 言う(台詞)

Page 40: Visual Studio による開発環境・プログラミングの進化

関心の分離

分離される関心が違う手続きオブジェクト汎用アルゴリズム汎用データ構造

手続きだけ、オブジェクトだけ、では分散する関心が多い

Page 41: Visual Studio による開発環境・プログラミングの進化

Community Launch 2008

DEMO

マルチパラダイムなべあつ

Page 42: Visual Studio による開発環境・プログラミングの進化

Community Launch 2008

DEMO

音声なべあつ

Page 43: Visual Studio による開発環境・プログラミングの進化

LINQ なべあつ

Page 44: Visual Studio による開発環境・プログラミングの進化

Enumerable.Range(1, 40)

Select( 数 => おもろーに読む( 数 ))

IEnurarable

IEnurarable

ギャグ

データバインド !

( 列挙可能な何かを加工する汎用的な )

フィルタ !

列挙可能な何かを出力できる何か

new おもろー ()

new なべあつ ()

読み上げてくれる何か

遅延評価 !

Page 45: Visual Studio による開発環境・プログラミングの進化

Community Launch 2008

DEMO

LINQ なべあつ

Page 46: Visual Studio による開発環境・プログラミングの進化

参考 : Linq to Objectvar books = from aBook in bookList where aBook.ISBN コード == "BBBBBBB" orderby aBook. タイトル select new { タイトル = aBook. タイトル , 価格 = aBook. 価格 };books.ToList().ForEach(item => Console.WriteLine(item));

bookList.Where (aBook => aBook.ISBN コード == "BBBBBBB") .OrderBy(aBook => aBook. タイトル ) .Select (aBook => new { タイトル = aBook. タイトル , 価格 = aBook. 価

格 }) .ToList().ForEach(item => Console.WriteLine(item));

Page 47: Visual Studio による開発環境・プログラミングの進化

BookList

Where (aBook => aBook.ISBN コード == "BBBBBBB")

ForEach(item => Console.WriteLine(item))

列挙可能 (IEnurarable) な何か

列挙可能 (IEnurarable) な何か

( 列挙可能な何かを加工する汎用的な )

フィルタ群 !

列挙可能な何かを何かする何か

遅延評価 !

OrderBy(aBook => aBook. タイトル )

Select (aBook new { タイトル = aBook. タイトル , 価格 = aBook. 価格

})

列挙可能 (IEnurarable) な何か

列挙可能 (IEnurarable) な何か

Page 48: Visual Studio による開発環境・プログラミングの進化

コンポーネント指向なべあつ

Page 49: Visual Studio による開発環境・プログラミングの進化

なべあつ .Win

+ Main() : void

なべあつプログラムメインフォーム

+ GetEnumerator() : IEnumerator

おもろー

- 或るおもろー

音声読み上げ

- 或る音声読み上げ

- 台詞の表示() : void

なべあつ

- 世界のなべあつ

+ 言う(台詞 : string)

+ <<event>> 台詞の更新

<<interface>>読み上げ可能な何か

読み上げ

+ GetEnumerator() : IEnumerator

<<interface>>IEnumerable

string

ギャグ

Component

UserControl

Form

データバインド!(ForEach)

・台詞の更新イベントの登録・言う(台詞)

・フィルタのチェーン・yield return (遅延評価)

Page 50: Visual Studio による開発環境・プログラミングの進化

Community Launch 2008

DEMO

なべあつ .WIN

Page 51: Visual Studio による開発環境・プログラミングの進化

様々な仕様変更への対応の例

「 3 の倍数と 3 の付く数字だけアホになります」

「 3 の倍数と 3 の付く数字だけアホになり、5 の倍数だけ犬っぽくなります」 「 3 の倍数と 3 の付く数字だけアホになり、5 の倍数だけナルシストになります」 「 3 の倍数と 3 の付く数字だけアホになり、8 の倍数だけ気持ち良くなります」「 3 の倍数と 3 の付く数字だけ憤りを感じます」「 3 の倍数と 3 の付く数字のときだけアホになり、8 の倍数だけすごく疲れます」

Page 52: Visual Studio による開発環境・プログラミングの進化

4. 美しいプログラム

について

Page 53: Visual Studio による開発環境・プログラミングの進化

分割攻略 (Divide-and-Conquer)について復習

1. プログラム開発は複雑さとの戦い2. 問題はサイズが小さいほうが簡単に解

ける3. もし大きなサイズの問題を、いくつか

のより小さなサイズの問題に分割でき、それぞれを解けば良い状態にできれば、その方が容易に解ける

4. 小さな問題に分けてそれぞれに解を与える

Page 54: Visual Studio による開発環境・プログラミングの進化

分割攻略 (Divide-and-Conquer)について復習

「分かる」とは「分けらる」ということ

「これとこれは違う問題と言えるようになる」こと「これであるものとないもの境界を知る」こと

どう分けるか ? が重要低結合 (low coupling) & 高凝集 (high cohesion)

Page 55: Visual Studio による開発環境・プログラミングの進化

どう関心を分離したいかひとつのパラダイムだけでは、様々な分離のケースに対応が困難

手続き型パラダイムは処理単位での分割

数をおもろーに言う

「ヘーイ」と言う

「今から、三が付く数字と、三の倍数の時だけ、アホになり、五の倍数のときは、犬っぽくなります。」と言う

数 = 1, 40, 1

おもろーなギャグ.やる

Page 56: Visual Studio による開発環境・プログラミングの進化

ひとつのパラダイムに捕らわれない

「無執無着」

『一枚の葉にとらわれては木は見えん。一本の木にとらわれては 森は見えん。どこにも心を留めず 見るともなく全体を見る。それがどうやら「見る」ということのようだ。』

バガボンド ( 井上雄彦 /講談社 ) 第 4巻より

Page 57: Visual Studio による開発環境・プログラミングの進化

新たなパラダイムに関する態度

新たな概念の習得→ 自分の既知の概念と結び付ける

これを安易にやってしまうと、思考停止を招くので要注意「分かったつもり」

Page 58: Visual Studio による開発環境・プログラミングの進化

「それって結局××× のことだよね」「それって昔からやってきたことで、別に新しくないじゃん」「そんなの ××× でもできるじゃん」「結局現場じゃ使えないし使わない」例 . プログラミング言語 C の説明を受けて

「そんなのアセンブリ言語でも『全部』できるじゃん」「アセンブリ言語でできることでできないことがあるから、現場じゃ使えないよ」

→ 要パラダイム シフト !

新たなパラダイムに関する態度

Page 59: Visual Studio による開発環境・プログラミングの進化

新たなパラダイムに関する態度

例 . LINQ「どう使おうか ? 別に要らないよ

ね ? 」ではなく

「書きたかったようにやっとできるようになった」

Page 60: Visual Studio による開発環境・プログラミングの進化

美しいコード例 .

「何でも手続きで書くのが美しいのか ? 」「オブジェクト指向ですべてうまくいく ? 」「何でも C# で書くのが美しい ? 」「なんでもかんでも XML で」「モデルは全て UML で」

→ 適材適所手続きは手続きワークフローはワークフローデザイナでUI は UI デザイナでデータはデータのデザイナで

Page 61: Visual Studio による開発環境・プログラミングの進化

手続き的 or 宣言的// 手続き的for (int i = 0; i < 10; i++)

何かする ();// 宣言的10.回 ( 何かする );

Page 62: Visual Studio による開発環境・プログラミングの進化

C# の記述 :

var textBlock = new TextBlock();textBlock.FontSize = 18;textBlock.Text = "Hello";textBlock.SetValue(Canvas.LeftProperty ,

150);textBlock.SetValue(Canvas.TopProperty ,

50);

手続き的

Page 63: Visual Studio による開発環境・プログラミングの進化

XAML の記述 :<TextBlock FontSize="18"

Text="Hello" Canvas.Top=“50" Canvas.Left=“150"/>

宣言的

Page 64: Visual Studio による開発環境・プログラミングの進化

VS2008デザイナによる記述 :

C# ( 手続き的記述 ) や XAML (宣言的記述 ) と

比較して意図以外のノイズが少ない

図解的

Page 65: Visual Studio による開発環境・プログラミングの進化

VS2008 と WF

図解的

Page 66: Visual Studio による開発環境・プログラミングの進化

VS2008 で EDM (Entity Data Model)

図解的

Page 67: Visual Studio による開発環境・プログラミングの進化

「選択肢が増えた」更に多くのパラダイムからの

選択が可能に手続き的 +宣言的

+ 図解的

Page 68: Visual Studio による開発環境・プログラミングの進化

これからのプログラマ手続き脳+オブ脳+関数脳+右脳

Page 69: Visual Studio による開発環境・プログラミングの進化

to be continued…