2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム...

39
Developers Summit 2011 小小小小小 福福福福福福福福福福福福 福福福福福 福福福福福福福福福 福福福福福福 福福 17-D-3 LT-3 Microsoft .NET 小小小 小小小小小小小小 小小小小小小小 福福福福福福福福福福福福 ~~

description

Developers Summit 2011 http://codezine.jp/devsumi/2011/

Transcript of 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム...

Page 1: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

小島富治雄福井コンピュータ株式会社 技術開発部 シニアエキスパートこみゅぷらす 代表

17-D-3

LT-3Microsoft .NET 上でのマルチパラダイム プログラミング

~ソースコードにラブ注入~

Page 2: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

自己紹介

小島 富治雄

デブサミ参加は 8 回目

Page 3: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

これまでのあらすじ デブサミ 2007

コードの品質こそがビジネスを成功させる ! ~ コードの品質を上げるために 命名編 ~

デブサミ 2008「きれいなコードは好きですか ? 」~品質の高いソースコードを書くコツ~

デブサミ 2009美しいソースコードのための考え方

Page 4: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

きれいなコードを書くコツ

「名前重要」( まつもとゆきひろ氏 )

Page 5: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

名前付けのプラクティス1. 概念と名前を一致させる2. 同じ概念には同じ名前を付けて、異なっ

た概念には違う名前を付ける3. 1 つの独立した概念のみを表す名前を付

ける4. 抽象的な概念には抽象的な名前、具体的

な概念には具体的な名前を付ける5. 抽象的すぎて伝わりにくい概念は、メタ

ファ ( 譬え ) で表す

Page 6: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

コメントで命名は得策でない

Page 7: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

コードに書けないことのみをコメントにする。

Page 8: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

番外編 :コメントの良くない使い方

Page 9: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

番外編 : コメントの良くない使い方

「説明になってない」

//  ここで n を ++  するとちゃんと動く// ---- 2008/11/08 Shigapyon r(-◎ω◎-)

n++;         

Page 10: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

番外編 : コメントの良くない使い方 「会話をしている」

//  ここで n を ++  するとちゃんと動く// ---- 2008/11/08 Shigapyon r(-◎ω◎-)n++;

// ↑  ここでやることに何か意味があるんでしょうか ?// 上でやっちゃダメなんでしょうか ?// ---- 2008/11/09  蓮舫

Page 11: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

番外編 : コメントの良くない使い方

「会話をしている ( しかもトピズレ ) 」//  バレンタイン デー なのに帰れないなんて

// 意味が分からない (; ;)// ---- 2011/02/14 Shigapyon r(-◎ω◎-)n++;

//  ですよねー// ---- 2011/02/14 Yamapee

Page 12: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

番外編 : コメントの良くない使い方 「何やら怪しげな取引をしている」// 立ち会いは強く当たって// 流れでお願いします// ---- 2010.05.10 Enapyon r(-◎ω◎-)n++;

//  了解いたしました!// では流れで少し踏ん張るよ。// ---- 2010.05.10 Kasugapee          

Page 13: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

「コメントで命名は得策でない」

のつづき

Page 14: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

コメントで命名は得策でない//  もし閏年 (4 で割れて 100 で割り切れ// ないか 400 で割り切れる ) だったらif (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) { // UI  にその年を表示する string s = string.Format(“{0} 年 \n”, y); // s は表示する文字列 Console.WriteLine(s); ……}  

Page 15: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

きちんと命名するstatic bool CanDividedBy(this int dividend, int divisor){ return dividend % divisor == 0; }

static bool IsLeapYear(this int year){ return year.CanDividedBy(4)

&& !year.CanDividedBy(100)|| year.CanDividedBy(400); }

if (year.IsLeapYear())UI.ShowYear(year);

Page 16: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

ソースコード自身に説明させる

Page 17: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

「何に名前を付けたいか」 ?

ユースケース ?部品 ?機能 ?状態 ?分類 ?

Page 18: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

「何に名前を付けたいか」 ?

設計 / 実装時のモデル要素

Page 19: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

名前で或る意味を表す。同じ名前を持つものは、

同じ意味を持つ

Page 20: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

変数名やクラス名、メソッド名などは、

「実装 / 設計モデルを記述するための

ボキャブラリ」( 小島 )

Page 21: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

自分の設計 / 実装モデルを

どういう語彙で記述することにするのか

Page 22: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

自然でシンプルな語彙で記述するのが

わかりやすい

Page 23: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

"Beauty Is in Simplicity"

「文章にしろ、和音にしろ、リズムにしろ、美しく、優雅なもの、優れたものはすべて、シンプルである 」。 ( プラトン )

「美しいコードとは、シンプルなコードのこと」( ヨルン・オルムハイム、『プログラマが知るべき 97 のこと』より )

Page 24: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

プログラミングでもっとも基本的な原則 単一責務の原則 (Single

Responsiblility Principle: SRP) 「変更する理由が同じものを集め、

違うものを分ける」 「 SRP が最も重要な原則だ」

(Robert. C. Martin 、『プログラマが知るべき 97 のこと』より )

Page 25: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

プログラミングにおけるポピュラーなパラダイム手続型オブジェクト指向型関数型ジェネリックスなど

Page 26: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

パラダイムによって名前の付け方が変わる手続き型 :

手続きに名前を付ける オブジェクト指向型 :

対象物に名前を付ける

Page 27: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

「銀の弾丸」はないが、複数のパラダイムを適材適所で用いることで

SRP に近づける

Page 28: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

排他的な分け方だけですめば分ける方法は一つで良い。単一のパラダイムで OK 。

そうでない場合は複数の分け方が必要。即ちマルチパラダイム。

Page 29: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

新しいパラダイムを取り入れるために複数の言語を

Page 30: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

何故複数の言語を学ぶのが得策か。言語は考え方のフレームワーク

になる (言語が、考え方を枠にはめてしまう ) から。

言語が持っていないパラダイムに気付けない。

Page 31: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

「金槌しか持っていなければ、すべての問題は釘に見え

る」( アブラハム・マズロー )

Page 32: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

複数の言語に触れる ― 私の体験

英語を学んで、考え方が変わるのを感じた C を学んで、考え方が変わるのを感じた C++ を学んで (以下略 ) それがパラダイム シフト

Page 33: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

複数の言語に触れる 例 ハイブリット型 ( パラダイム追加型 )

C → C++ → C# → F#

純粋型 (研究者タイプのあなたに ) Pascal → Smalltalk → Haskell

Page 34: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

パラダイムによって記述が変わる例

Page 35: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

手続き型プログラミング // 「 1 から 40 までの」「整数の」「 3 か 5 で割れるものを」「コンソール出力」 for (int number = 1; number <= 40; number++) { if (number % 3 == 0 || number % 5 == 0) Console.WriteLine(number); }

「 1 から 40 までの」 「 3 か 5 で割れるものを」「コンソール出力」それぞれが変更になるときどうなる ?

Page 36: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

オブジェクト指向プログラミングpublic abstract class Filter{ public abstract bool IsMatch(int number); }

public abstract class UI{ public abstract void Show(int number); }

public class TheCommand{    public Filter Filter { get; set; }    public UI UI { get; set; }

    public void Run(IEnumerable data)    {        foreach (int number in data) {            if (Filter.IsMatch(number))                UI.Show(number);        }    }}

「整数の」 が変更になるときどうなる ?

Page 37: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

ジェネリック プログラミングpublic abstract class Filter<T>{ public abstract bool IsMatch(T item); }

public abstract class UI<T>{ public abstract void Show(T item); }

public class TheCommand<T>{    public Filter<T> Filter { get; set; }    public UI<T> UI { get; set; }

    public void Run(IEnumerable<T> data)    {        foreach (T item in data) {            if (Filter.IsMatch(item))                UI.Show(item);        } }}

Page 38: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

関数型プログラミング    public void Run(IEnumerable<T> data, Func<T, bool> isMatch, Action<T> show) { data.Where(isMatch).ToList().ForEach(show); }

Page 39: 2011/02/17 Developers Summit 【17-D-3】LT-3 「Microsoft .NET 上でのマルチパラダイム プログラミング」

Developers Summit 2011

Let’s enjoy programming!