Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
LT-3Microsoft .NET 上でのマルチパラダイム プログラミング<br />~ソースコードにラブ注入~<br />17-D-3<br />小島富治雄<br />福井コンピュータ株式会社 技術開発部 シニアエキスパートこみゅぷらす 代...
自己紹介<br />小島 富治雄<br />デブサミ参加は8回目<br />
これまでのあらすじ<br />デブサミ2007コードの品質こそがビジネスを成功させる!~ コードの品質を上げるために 命名編 ~<br />デブサミ2008「きれいなコードは好きですか?」~品質の高いソースコードを書くコツ~<br />デブサミ...
きれいなコードを書くコツ<br />「名前重要」<br />(まつもとゆきひろ氏)<br />
名前付けのプラクティス<br />概念と名前を一致させる<br />同じ概念には同じ名前を付けて、異なった概念には違う名前を付ける<br />1つの独立した概念のみを表す名前を付ける<br />抽象的な概念には抽象的な名前、具体的な概念には具体...
コメントで命名は得策でない<br />
コードに書けないことのみをコメントにする。<br />
番外編:コメントの良くない使い方<br />
番外編: コメントの良くない使い方<br />「説明になってない」<br />// ここで n を ++ するとちゃんと動く<br />// ---- 2008/11/08 Shigapyon r(-◎ω◎-)<br />n++;       ...
番外編: コメントの良くない使い方<br />「会話をしている」<br />// ここで n を ++ するとちゃんと動く<br />// ----2008/11/08 Shigapyon r(-◎ω◎-)n++;<br />// ↑ ここでや...
番外編: コメントの良くない使い方<br />「会話をしている (しかもトピズレ)」<br />// バレンタイン デー なのに帰れないなんて<br />// 意味が分からない (; ;)<br />// ----2011/02/14 Shig...
番外編: コメントの良くない使い方<br />「何やら怪しげな取引をしている」<br />// 立ち会いは強く当たって<br />// 流れでお願いします<br />// ----2010.05.10 Enapyon r(-◎ω◎-)n++;<...
「コメントで命名は得策でない」のつづき<br />
コメントで命名は得策でない<br />// もし閏年 (4で割れて 100で割り切れ<br />// ないか 400で割り切れる) だったら<br />if (y % 4 == 0 && y % 100 != 0<br />   || y % ...
きちんと命名する<br />static boolCanDividedBy(this int dividend, int divisor)<br />{ return dividend % divisor == 0; }<br />static...
ソースコード自身に説明させる<br />
「何に名前を付けたいか」?<br />ユースケース?<br />部品?<br />機能?<br />状態?<br />分類?<br />
「何に名前を付けたいか」?<br />設計/実装時のモデル要素<br />
名前で或る意味を表す。同じ名前を持つものは、同じ意味を持つ<br />
変数名やクラス名、メソッド名などは、「実装/設計モデルを記述するためのボキャブラリ」(小島)<br />
自分の設計/実装モデルをどういう語彙で記述することにするのか<br />
自然でシンプルな語彙で記述するのがわかりやすい<br />
"Beauty Is in Simplicity"<br />「文章にしろ、和音にしろ、リズムにしろ、美しく、優雅なもの、優れたものはすべて、シンプルである。」(プラトン)<br />「美しいコードとは、シンプルなコードのこと」(ヨルン・オルム...
プログラミングでもっとも基本的な原則<br />単一責務の原則 (Single Responsiblility Principle: SRP)<br />「変更する理由が同じものを集め、違うものを分ける」<br />「SRP が最も重要な原則だ...
プログラミングにおけるポピュラーなパラダイム<br />手続型<br />オブジェクト指向型<br />関数型<br />ジェネリックス<br />など<br />
パラダイムによって名前の付け方が変わる<br />手続き型:手続きに名前を付ける<br />オブジェクト指向型:対象物に名前を付ける<br />
「銀の弾丸」はないが、複数のパラダイムを適材適所で用いることでSRPに近づける<br />
排他的な分け方だけですめば分ける方法は一つで良い。単一のパラダイムでOK。そうでない場合は複数の分け方が必要。即ちマルチパラダイム。<br />
新しいパラダイムを取り入れるために複数の言語を<br />
何故複数の言語を学ぶのが得策か。<br />言語は考え方のフレームワークになる (言語が、考え方を枠にはめてしまう) から。<br />言語が持っていないパラダイムに気付けない。<br />
 「金槌しか持っていなければ、すべての問題は釘に見える」(アブラハム・マズロー)<br />
複数の言語に触れる                      ― 私の体験<br />英語を学んで、考え方が変わるのを感じた<br />Cを学んで、考え方が変わるのを感じた<br />C++を学んで (以下略)<br />それがパラダイム シフ...
複数の言語に触れる 例<br />ハイブリット型 (パラダイム追加型)<br />C<br />-> C++<br />-> C#<br />-> F#<br />純粋型 (研究者タイプのあなたに)<br />Pascal<br />-> Sm...
パラダイムによって記述が変わる例<br />
手続き型プログラミング<br />// 「1から40までの」「整数の」「3か5で割れるものを」「コンソール出力」<br />   for (int number = 1; number <= 40; number++) {<br />     ...
オブジェクト指向プログラミング<br />public abstract class Filter{ public abstract bool IsMatch(int number); }<br />public abstract class ...
ジェネリック プログラミング<br />public abstract class Filter<T>{ public abstract bool IsMatch(T item); }<br />public abstract class UI...
関数型プログラミング<br />    public void Run(IEnumerable<T> data,<br />Func<T, bool> isMatch,<br />                          Action...
Let’s enjoy programming!<br />
Upcoming SlideShare
Loading in …5
×

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

1,772 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  1. 1. LT-3Microsoft .NET 上でのマルチパラダイム プログラミング<br />~ソースコードにラブ注入~<br />17-D-3<br />小島富治雄<br />福井コンピュータ株式会社 技術開発部 シニアエキスパートこみゅぷらす 代表<br />
  2. 2. 自己紹介<br />小島 富治雄<br />デブサミ参加は8回目<br />
  3. 3. これまでのあらすじ<br />デブサミ2007コードの品質こそがビジネスを成功させる!~ コードの品質を上げるために 命名編 ~<br />デブサミ2008「きれいなコードは好きですか?」~品質の高いソースコードを書くコツ~<br />デブサミ2009美しいソースコードのための考え方 <br />
  4. 4. きれいなコードを書くコツ<br />「名前重要」<br />(まつもとゆきひろ氏)<br />
  5. 5. 名前付けのプラクティス<br />概念と名前を一致させる<br />同じ概念には同じ名前を付けて、異なった概念には違う名前を付ける<br />1つの独立した概念のみを表す名前を付ける<br />抽象的な概念には抽象的な名前、具体的な概念には具体的な名前を付ける<br />抽象的すぎて伝わりにくい概念は、メタファ (譬え) で表す<br />
  6. 6. コメントで命名は得策でない<br />
  7. 7. コードに書けないことのみをコメントにする。<br />
  8. 8. 番外編:コメントの良くない使い方<br />
  9. 9. 番外編: コメントの良くない使い方<br />「説明になってない」<br />// ここで n を ++ するとちゃんと動く<br />// ---- 2008/11/08 Shigapyon r(-◎ω◎-)<br />n++;         <br />
  10. 10. 番外編: コメントの良くない使い方<br />「会話をしている」<br />// ここで n を ++ するとちゃんと動く<br />// ----2008/11/08 Shigapyon r(-◎ω◎-)n++;<br />// ↑ ここでやることに何か意味があるんでしょうか?<br />// 上でやっちゃダメなんでしょうか?<br />// ---- 2008/11/09 蓮舫<br />
  11. 11. 番外編: コメントの良くない使い方<br />「会話をしている (しかもトピズレ)」<br />// バレンタイン デー なのに帰れないなんて<br />// 意味が分からない (; ;)<br />// ----2011/02/14 Shigapyon r(-◎ω◎-)n++;<br />// ですよねー// ----2011/02/14 Yamapee<br />
  12. 12. 番外編: コメントの良くない使い方<br />「何やら怪しげな取引をしている」<br />// 立ち会いは強く当たって<br />// 流れでお願いします<br />// ----2010.05.10 Enapyon r(-◎ω◎-)n++;<br />// 了解いたしました!<br />// では流れで少し踏ん張るよ。// ----2010.05.10 Kasugapee          <br />
  13. 13. 「コメントで命名は得策でない」のつづき<br />
  14. 14. コメントで命名は得策でない<br />// もし閏年 (4で割れて 100で割り切れ<br />// ないか 400で割り切れる) だったら<br />if (y % 4 == 0 && y % 100 != 0<br /> || y % 400 == 0) {<br />// UI にその年を表示する<br /> string s = string.Format(“{0}年n”, y);<br />// s は表示する文字列<br />Console.WriteLine(s);<br /> ……}  <br />
  15. 15. きちんと命名する<br />static boolCanDividedBy(this int dividend, int divisor)<br />{ return dividend % divisor == 0; }<br />static boolIsLeapYear(this int year)<br />{ return year.CanDividedBy(4) && !year.CanDividedBy(100)<br />|| year.CanDividedBy(400); }<br />if (year.IsLeapYear())<br />UI.ShowYear(year);<br />
  16. 16. ソースコード自身に説明させる<br />
  17. 17. 「何に名前を付けたいか」?<br />ユースケース?<br />部品?<br />機能?<br />状態?<br />分類?<br />
  18. 18. 「何に名前を付けたいか」?<br />設計/実装時のモデル要素<br />
  19. 19. 名前で或る意味を表す。同じ名前を持つものは、同じ意味を持つ<br />
  20. 20. 変数名やクラス名、メソッド名などは、「実装/設計モデルを記述するためのボキャブラリ」(小島)<br />
  21. 21. 自分の設計/実装モデルをどういう語彙で記述することにするのか<br />
  22. 22. 自然でシンプルな語彙で記述するのがわかりやすい<br />
  23. 23. "Beauty Is in Simplicity"<br />「文章にしろ、和音にしろ、リズムにしろ、美しく、優雅なもの、優れたものはすべて、シンプルである。」(プラトン)<br />「美しいコードとは、シンプルなコードのこと」(ヨルン・オルムハイム、『プログラマが知るべき97のこと』より)<br />
  24. 24. プログラミングでもっとも基本的な原則<br />単一責務の原則 (Single Responsiblility Principle: SRP)<br />「変更する理由が同じものを集め、違うものを分ける」<br />「SRP が最も重要な原則だ」(Robert. C. Martin、『プログラマが知るべき97のこと』より)<br />
  25. 25. プログラミングにおけるポピュラーなパラダイム<br />手続型<br />オブジェクト指向型<br />関数型<br />ジェネリックス<br />など<br />
  26. 26. パラダイムによって名前の付け方が変わる<br />手続き型:手続きに名前を付ける<br />オブジェクト指向型:対象物に名前を付ける<br />
  27. 27. 「銀の弾丸」はないが、複数のパラダイムを適材適所で用いることでSRPに近づける<br />
  28. 28. 排他的な分け方だけですめば分ける方法は一つで良い。単一のパラダイムでOK。そうでない場合は複数の分け方が必要。即ちマルチパラダイム。<br />
  29. 29. 新しいパラダイムを取り入れるために複数の言語を<br />
  30. 30. 何故複数の言語を学ぶのが得策か。<br />言語は考え方のフレームワークになる (言語が、考え方を枠にはめてしまう) から。<br />言語が持っていないパラダイムに気付けない。<br />
  31. 31. 「金槌しか持っていなければ、すべての問題は釘に見える」(アブラハム・マズロー)<br />
  32. 32. 複数の言語に触れる ― 私の体験<br />英語を学んで、考え方が変わるのを感じた<br />Cを学んで、考え方が変わるのを感じた<br />C++を学んで (以下略)<br />それがパラダイム シフト<br />
  33. 33. 複数の言語に触れる 例<br />ハイブリット型 (パラダイム追加型)<br />C<br />-> C++<br />-> C#<br />-> F#<br />純粋型 (研究者タイプのあなたに)<br />Pascal<br />-> Smalltalk<br />->Haskell<br />
  34. 34. パラダイムによって記述が変わる例<br />
  35. 35. 手続き型プログラミング<br />// 「1から40までの」「整数の」「3か5で割れるものを」「コンソール出力」<br /> for (int number = 1; number <= 40; number++) {<br /> if (number % 3 == 0 || number % 5 == 0)<br />Console.WriteLine(number);<br /> }<br />「 1から40までの」 「3か5で割れるものを」「コンソール出力」それぞれが変更になるときどうなる?<br />
  36. 36. オブジェクト指向プログラミング<br />public abstract class Filter{ public abstract bool IsMatch(int number); }<br />public abstract class UI{ public abstract void Show(int number); }<br />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);        }    }}<br />「整数の」 が変更になるときどうなる?<br />
  37. 37. ジェネリック プログラミング<br />public abstract class Filter<T>{ public abstract bool IsMatch(T item); }<br />public abstract class UI<T>{ public abstract void Show(T item); }<br />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);        }<br />}}<br />
  38. 38. 関数型プログラミング<br />    public void Run(IEnumerable<T> data,<br />Func<T, bool> isMatch,<br /> Action<T> show) {<br />data.Where(isMatch).ToList().ForEach(show);<br /> }<br />
  39. 39. Let’s enjoy programming!<br />

×