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

Post on 12-Nov-2014

279 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Community Launch 2008

COMU+こみゅぷらす

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

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

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

はじめに

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

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

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

Microsoft MVP for Development

Tools - Visual C#

自己紹介ジャグリング

自転車通勤

万年筆

世界のなべあつ

マイブーム

今日話したいこと

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

Agenda

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

( オプション )

1. 復習

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

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

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

データバインドの例

: DrawingUI : Data描画する

: Application

+ 追加() : void

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

Data

+ OnChanged() : void

DrawingUI

IDataSource<T>

DataSource

<<realize>>

Application

- drawingUI

- data

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

+ 追加() : 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)

2. .NET の進化と 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 ----

.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!

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

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

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

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

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

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

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

LINQ to ObjectLINQ to SQLLINQ to DataSetLINQ to XML

参考 : LINQ の種類

.NET LINQ

LINQ to Objects

LINQ to Datasets LINQ to SQL LINQ to

Entities LINQ to XML

C# VB その他の言語

ObjectData Base

XML

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

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

参考 : 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> なオブジェクトをクエリ

例 .

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

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

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

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

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

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

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

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

Anders Hejlsberg

Anders Hejlsberg

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

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

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

3. Demo

世界のなべあつ

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

手続き型なべあつ

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

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

犬っぽくなります」

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

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

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

同様に考える

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

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

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

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

数をおもろーに言う

「ヘーイ」と言う

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

数 = 1, 40, 1

おもろーなギャグ.やる

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

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

数をアホっぽく言う

数を犬っぽく言う

数を普通に言う

数をおもろーに言う

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

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

数が五の倍数

その他

Community Launch 2008

DEMO

手続き型なべあつ

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

おもろーに言う

倍数かどうか

含むかどうか

アホっぽく犬っぽく言う

言う

犬っぽい読みへの変換

アホっぽい読みへの変換

読み

アホっぽく言う

或る桁の数の読み

犬っぽく言う

言う

犬っぽい読みへの変換

普通に言う言う

読み 或る桁の数の読み

読み 或る桁の数の読み

アホっぽい読みへの変換

言う

言う

倍数かどうか

読み 或る桁の数の読み

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

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

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

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

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

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

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

列挙可能 (IEnurarable) な何か

列挙可能 (IEnurarable) な何か

ギャグ

データバインド !

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

フィルタ !

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

new おもろー ()

new なべあつ ()

読み上げてくれる何か

遅延評価 !

ニューなべあつ

なべあつ

+ Main() : void

なべあつプログラム

+ 言う(台詞 : string) : void

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

読み上げてくれる何かが

+ GetEnumerator() : IEnumerator

<<interface>>IEnumerable

string

+ 言う(台詞 : string) : void

音声読み上げ

+ 言う(台詞 : string) : void

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

+ GetEnumerator() : IEnumerator

おもろー

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

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

関心の分離

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

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

Community Launch 2008

DEMO

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

Community Launch 2008

DEMO

音声なべあつ

LINQ なべあつ

Enumerable.Range(1, 40)

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

IEnurarable

IEnurarable

ギャグ

データバインド !

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

フィルタ !

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

new おもろー ()

new なべあつ ()

読み上げてくれる何か

遅延評価 !

Community Launch 2008

DEMO

LINQ なべあつ

参考 : 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));

BookList

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

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

列挙可能 (IEnurarable) な何か

列挙可能 (IEnurarable) な何か

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

フィルタ群 !

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

遅延評価 !

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

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

})

列挙可能 (IEnurarable) な何か

列挙可能 (IEnurarable) な何か

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

なべあつ .Win

+ Main() : void

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

+ GetEnumerator() : IEnumerator

おもろー

- 或るおもろー

音声読み上げ

- 或る音声読み上げ

- 台詞の表示() : void

なべあつ

- 世界のなべあつ

+ 言う(台詞 : string)

+ <<event>> 台詞の更新

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

読み上げ

+ GetEnumerator() : IEnumerator

<<interface>>IEnumerable

string

ギャグ

Component

UserControl

Form

データバインド!(ForEach)

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

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

Community Launch 2008

DEMO

なべあつ .WIN

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

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

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

4. 美しいプログラム

について

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

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

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

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

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

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

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

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

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

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

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

数をおもろーに言う

「ヘーイ」と言う

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

数 = 1, 40, 1

おもろーなギャグ.やる

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

「無執無着」

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

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

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

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

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

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

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

→ 要パラダイム シフト !

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

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

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

ね ? 」ではなく

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

美しいコード例 .

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

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

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

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

C# の記述 :

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

150);textBlock.SetValue(Canvas.TopProperty ,

50);

手続き的

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

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

宣言的

VS2008デザイナによる記述 :

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

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

図解的

VS2008 と WF

図解的

VS2008 で EDM (Entity Data Model)

図解的

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

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

+ 図解的

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

to be continued…

top related