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