SlideShare a Scribd company logo
1 of 145
Strategyパターンと開放/閉鎖原則に見る
デザインパターンの有用性
codeArts 株式会社
政倉 智
講師からの本日のお願い
お願い
今日は何の日でしょうか?
お願い
今日はですね...
お願い
F1日本グランプリの予選日です!
お願い
多分、ちょうど予選の時間です
お願い
今日のルール!
お願い
F1の結果を喋らないこと!
お願い
ご協力をお願いします!
お願い
本題に入ります
デザインパターンとは?
デザインパターンとは?
● 書籍『オブジェクト指向における再利用のためのデ
ザインパターン』において、GoF (Gang of Four; 四
人組) と呼ばれる4人の共著者は、デザインパターン
という用語を初めてソフトウェア開発に導入した。
GoFは、エーリヒ・ガンマ、リチャード・ヘルム、
ラルフ・ジョンソン、ジョン・ブリシディースの4
人である。彼らは、その書籍の中で23種類のパター
ンを取り上げた。
– Wikipedia より
デザインパターンとは?
● コンピュータのプログラミングで、素人と達人の間
ではびっくりするほどの生産性の差があるが、その
差はかなりの部分が経験の違いからきている。達人
は、さまざまな難局を、何度も何度も耐え忍んで乗
り切ってきている。そのような達人たちが同じ問題
に取り組んだ場合、典型的にはみな同じパターンの
解決策にたどり着くのだが、これがデザインパター
ンである (GoF)。
– Wikipedia より
デザインパターンとは?
よく分からんですね...
デザインパターンとは?
● 書籍「オブジェクト指向における再利用のため
のデザインパターン」の「再利用のための」と
いうのが大事だと思う
● 再利用って何?
– 過去の資産(書いたプログラム)を使いまわせるとい
うこと!
– 再利用が可能ならば生産性があがる!
デザインパターンとは?
● よく使う処理を関数化すれば再利用できるん
じゃないの?
– そうもいかないことがたくさん
● デザインパターンは再利用化の助けになる手法
の一つ
今日やること
● 本日はデザインパターンの形のお話はあまりし
ません
– 形は大事ではないので...
● デザインパターンを適切に使った時のメリット
についてお話しします
今日やること
というわけで
本日は皆さんに
素晴らしい体験をしていただきます!
今日やること
どきどきデスマ体験!
今日やること
というわけで始まります!
とある開発会社の日常
● とある開発会社は様々なツールを開発している
● 本日例で挙げるツールはすべてディレクトリの
中身を再帰的に表示する機能がある
– 分かりやすくするために、本日はこの機能だけの部
分でお話しします
序章
序章
とある開発会社は半年の開発期間を終え、
無事ツールAをリリースしました!
序章
担当者A「ツールAの汎用性のある部分を
他のツールでも流用しようぜ!」
序章
担当者A「新人のBOCCO君に任せるか!」
序章
担当者A「BOCCO君!かくかくしかじか...」
BOCCO君「えっ!そんな重大な仕事自分には...」
序章
担当者A「便利そうな関数を抜き出すだけの簡単
な お仕事だから!」
BOCCO君「(簡単なら...)がんばります!」
序章
かくしてBOCCO君は
共通ライブラリの作成という
重大な仕事を任されたのでした
序章
(この時点ですでに嫌な予感が...)
第一章 共通ライブラリ化
共通ライブラリ化
/**
* 指定されたパスのファイル・ディレクトリの一覧を再帰的に表示します。
* @param nodePath {String} 探索する最初のファイルまたはディレクトリ。
*/
function displayRecursive(nodePath) {
console.log(nodePath);
// ディレクトリかファイルかを調べる
var stat = fs.statSync(nodePath);
if (stat.isDirectory()) {
// ディレクトリの場合は配下のディレクトリ・ファイル一覧を取得して
// 再帰呼び出しをして子を表示する
var children = fs.readdirSync(nodePath);
children.forEach(function (child) {
displayRecursive(path.join(nodePath, child));
});
}
}
● 共通ライブラリとして抽出した関数がこちら
– 定番の再帰呼出し
共通ライブラリ化
displayRecursive(process.argv[2]);
● ツールAの呼び出し部分はこんなの
– 引数にパスを渡してる
● 実行結果はこんなの
$ node a.js ./
./
./a.js
./hoge
./hoge/hoge.txt
./hoge/README.md
共通ライブラリ化
もともとツールAにあった関数を
抽出しただけだから
そんなに難しくないよね!
共通ライブラリ化
担当者A「よくやったね!BOCCO君!」
BOCCO君「はい!ありがとうございます!」
第二章 ツールBの開発
ツールBの開発
もちろん共通ライブラリを使って
工期の圧縮を狙います
ツールBの開発
担当者B「BOCCO君、言いにくいんだけど、
行番号が必要なんだよね」
BOCCO君「はい!分かりました!」
ツールBの開発
BOCCO君「(行番号をつける処理を入れてしまう
と、 ツールAにも行番号が表示され
るな...)」
BOCCO君「(意外と面倒だな...)」
ツールBの開発
/**
* 指定されたパスのファイル・ディレクトリの一覧を再帰的に表示します。
* @param nodePath {String} 探索する最初のファイルまたはディレクトリ。
* @param options {Object} オプション。
*/
function displayRecursive(nodePath, options) {
var line = '';
if (options && options.lineNumber) {
// オプションに合わせて行番号を先頭に表示
line += options.lineNumber + ': ';
options.lineNumber++;
}
line += nodePath;
console.log(line);
// ディレクトリかファイルかを調べる
var stat = fs.statSync(nodePath);
if (stat.isDirectory()) {
// ディレクトリの場合は配下のディレクトリ・ファイル一覧を取得して
// 再帰呼び出しをして子を表示する
var children = fs.readdirSync(nodePath);
children.forEach(function (child) {
displayRecursive(path.join(nodePath, child), options);
});
}
}
● こんな感じ
ツールBの開発
displayRecursive(process.argv[2], {
lineNumber: 1
});
● ツールBの呼び出し部分はこんなの
– 引数にパスを渡してる
● 実行結果はこんなの
$ node a.js ./
1: ./
2: ./a.js
3: ./hoge
4: ./hoge/hoge.txt
5: ./hoge/README.md
ツールBの開発
担当者B「BOCCO君のおかげで工期が圧縮でき
た!
ありがとう!」
BOCCO君「ありがとうございます!」
ツールBの開発
(まだほのぼのしてますね...)
第三章 ツールCの開発
ツールCの開発
担当者C「BOCCO君、ツールCにはファイルサイ
ズが 必要なんよ」
BOCCO君「はい!分かりました!」
ツールCの開発
BOCCO君「できました!」
担当者C「あ、ごめんファイルサイズは
行頭じゃなくて行末に出して!」
担当者C「悪いんだけど、急いでくれない?」
BOCCO君「急いでやります!」
ツールCの開発
BOCCO君「できました!」
担当者C「お、ばっちりやないか!
ありがとうな」
ツールCの開発
(ちょっと嫌な予感がしませんか...)
ツールCの開発
担当者B「BOCCO君!」
BOCCO君「はい?なんでしょうか?」
ツールCの開発
担当者B「行番号が行末に表示されてるけど」
担当者B「なんかした?」
BOCCO君「あっ!」
ツールCの開発
担当者B「とにかくすぐに直して!」
担当者B「お客さんかんかんだよ!」
BOCCO君「分かりました...」
ツールCの開発
(嫌な予感が的中ですね...)
ツールCの開発
BOCCO君「修正終わりました」
担当者B「大丈夫そうね...」
ツールCの開発
担当者B「お客さんに報告してくるんで」
担当者B「理由を教えて」
BOCCO君「かくかくしかじか...」
担当者B「お客さんに説明してくるね」
BOCCO君「ごめんなさい...」
ツールCの開発
担当者B「お客さんに説明をしたけど」
担当者B「再発防止策を出してくれと言われた
よ」
担当者B「なんか出せない?」
BOCCO君「以後注意します...」
担当者B「それじゃ納得してくれないよ...」
BOCCO君「ですよね...」
ツールCの開発
BOCCO君「(注意する以外思いつかないよう...)」
ツールCの開発
BOCCO君「事前に、修正内容を洗い出します」
BOCCO君「担当者Bさんに承認をもらいます」
担当者B「それならOKだね!」
担当者B「お客さんも納得してくれたよ」
ツールCの開発
担当者A「BOCCO君、災難だったね」
BOCCO君「あ、はい、ありがとうございます」
BOCCO君「(担当者Aさんは優しいな...)」
ツールCの開発
担当者A「ところでツールAには影響ないよね?」
BOCCO君「(慰めてくれたわけじゃないんだ...)」
BOCCO君「多分大丈夫なはずです...」
ツールCの開発
担当者A「多分だと困るなあ...」
BOCCO君「あ、担当者Bさんと同じように、
修正内容に承認をもらうのは
どうでしょうか?」
担当者A「あ、それだと助かるね!以後よろしく!」
第四章 要求は増えていき...
要求は増えていき...
共通ライブラリを使うツールは増え続け
要求レベルはどんどん上がっていきます
要求は増えていき...
● 要求例として...
– ファイルサイズだけでなく、ブロックサイズも表示
して!
– 行番号に0を付けて桁を揃えて欲しい
– パーミッションを表示したい
要求は増えていき...
BOCCO君はその都度
各ツールの担当者に変更内容をレポートに書いて
承認を求めて回ります
要求は増えていき...
担当者E「BOCCO君、まだ?」
BOCCO君「担当者Aさんが出張中で...」
担当者E「そんなの事前に分かってるでしょ!」
BOCCO君「はい...」
要求は増えていき...
担当者E「担当者Aさん帰ってきたよね?まだ?」
BOCCO君「今度は担当者Cさんがだめだって...」
担当者E「えー、説明の仕方が悪いんじゃない?」
BOCCO君「はい...」
要求は増えていき...
担当者A「最近、BOCCO君仕事遅いよね」
担当者C「遅くまでいるけど仕事してないよね」
要求は増えていき...
(こういう噂はBOCCO君の耳にも入るわけで...)
要求は増えていき...
BOCCO君「(みんな好き勝手言いやがって...)」
終章 さらなる試練が...
さらなる試練が...
(ただでさえ大変なBOCCO君にさらなる要求が...)
さらなる試練が...
担当者F「ファイルのハッシュが一致したやつだ
け表示 したいんだけど...」
BOCCO君「えっ!(絶句)」
BOCCO君「それはさすがに無理です...」
さらなる試練が...
担当者F「できるよね?」
BOCCO君「無理ですって!」
担当者F「できるよね?ね?」
BOCCO君「分かりました...」
さらなる試練が...
BOCCO君「(こういう風に修正しますレポートを
書いてっと)」
さらなる試練が...
担当者A「さすがにこの変更ではバグ出るっ
しょ」
担当者A「やめてくれない?」
担当者C「ようわからんのだけど」
担当者F「まだー?」
さらなる試練が...
BOCCO君「(もう無理や...)」
さらなる試練が...
かくして、BOCCO君は会社を去りましたとさ
さらなる試練が...
めでたし、めでたし!
デザインパターンのある世界
デザインパターンのある世界
● 共通ライブラリって作るの難しいんです
– 適当にやると今回の例みたいになります
– 共通ライブラリに機能追加を拒否されると、ツール
側はすごく困るのでなんとしてでも押しこもうとし
ます
– 既存のツールは修正が入るのを嫌がるので、機能追
加を拒否しようとします
– その駆け引きでスケジュールがズレまくります
デザインパターンのある世界
● 最悪なパターンとして...
– 共通ライブラリのせいでツールの品質が上がらない
● 共通ライブラリに必要な機能がないからできません!
– 政治的なやりとりが増え、コードを書く時間が取れ
ない
– ますます、共通ライブラリを修正しない方向で逃げ
ようとする
– ますます、ツールの品質が上がらない悪循環
デザインパターンのある世界
● 共通ライブラリの二つの要求のせめぎあい
– 安定していて欲しい(仕様的にも、バグ的にも)
– なんでもできて欲しい
デザインパターンのある世界
この二つのいいとこ取りが実はできるんです
デザインパターンのある世界
そう、デザインパターンならね!
デザインパターンのある世界
○○○○○○パターンを使えばいいんです!
ストラテジーパターンの導入
ストラテジーパターンの導入
ツールBで行番号を表示したいという要望に対し
ての対処を実は間違えていた
ストラテジーパターンの導入
ストラテジーパターンを導入すべきだった
ストラテジーパターンの導入
/**
* 指定されたパスのファイル・ディレクトリの一覧を再帰的に表示します。
* @param nodePath {String} 探索する最初のファイルまたはディレクトリ。
* @param optDisplay {Function} ファイル・ディレクトリを表示する関数。
*/
function displayRecursive(nodePath, optDisplay) {
var display = optDisplay || function (line) {
console.log(line);
};
display(nodePath);
// ディレクトリかファイルかを調べる
var stat = fs.statSync(nodePath);
if (stat.isDirectory()) {
// ディレクトリの場合は配下のディレクトリ・ファイル一覧を取得して
// 再帰呼び出しをして子を表示する
var children = fs.readdirSync(nodePath);
children.forEach(function (child) {
displayRecursive(path.join(nodePath, child), display);
});
}
}
● こんな感じで出力用関数を引数に渡す
ストラテジーパターンの導入
/**
* 行番号込みで表示する関数を生成するファクトリ
*/
function makeLineNumber () {
var lineNumber = 1;
return function (nodePath) {
console.log(lineNumber + ': ' + nodePath);
lineNumber++;
};
};
displayRecursive(makeLineNumber());
● ツールBでは行番号付きで出力する関数を作る
– 分かりにくいかもしれないので、質問してね!
ストラテジーパターンの導入
若干各ツールの開発者の仕事が増えますが
今回例に挙げたどの要望も叶えられます
ストラテジーパターンの導入
しかも、
共通ライブラリを修正することなしに、
です
ストラテジーパターンの導入
ツールFの
「ハッシュに一致したファイルのみ出力する」
というのですら
共通ライブラリ側は修正の必要がないのです
ストラテジーパターンの導入
本当にそうなのかみんなで考えてみましょう!
ストラテジーパターンの導入
ストラテジーパターンを導入していれば
BOCCO君は苦労することもなく
会社を去ることもなかったわけです
ストラテジーパターンの導入
ストラテジーパターンの導入が
適切になされるかどうかで
こんなに変わるんです
ストラテジーパターンの導入
すごいでしょ!
開放/閉鎖原則
開放/閉鎖原則
ちょっと質問!
開放/閉鎖原則 (Open-Closed Principle)
知ってる方!
開放/閉鎖原則
● 開放/閉鎖原則(Open-Closed Principle)
– 拡張に対して開いていなければならず(Open)
– 修正に対して閉じていなければならない(Close)
開放/閉鎖原則
● とある会社の例だと...
● 行番号の追加でコードを修正する必要があった
– 修正の必要がある → 修正に対して閉じていない
– 修正しないとできない → 拡張に対して開いていな
い
● まったく逆...
開放/閉鎖原則
● ストラテジーパターン導入の例だと...
– 行番号の追加でコードを修正する必要がなかった
● 修正の必要がない → 修正に対して閉じている
● 修正しなくてもできる → 拡張に対して開いている
開放/閉鎖原則
?????
開放/閉鎖原則
● 修正に対して閉じていると何がいいのか
– 共通ライブラリを修正すると、それを使っている
ツールはすべて再テストになる
– 修正に対して閉じているということは修正しなくて
もいいので、ツールの再テストが避けられる
● 拡張に対して開いていると何がいいのか
– 共通ライブラリを修正しなくてよい!
– その分すぐに作れる
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
ここが修正されると!
全部再テスト!全部再テスト!全部再テスト!全部再テスト!
つまり
共通ライブラリは
修正したくないんです
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
関心事A 関心事B 関心事C 関心事D
共通ライブラリ側に
各ツールの関心事
どのように出力するか?が含まれていると...
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
関心事A 関心事B 関心事C 関心事D
どのように出力したいか?が変わると...
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
関心事A 関心事B 関心事C 関心事D
実は共通ライブラリ側に手を入れる必要がある
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
関心事A 関心事B 関心事C 関心事D
変更発生!
全部再テスト!全部再テスト!全部再テスト!全部再テスト!
開放/閉鎖原則
再テストの原因になったツールCの担当者は
うれしいかもだけど
他の担当者は全力で阻止にかかるよね...
開放/閉鎖原則
人間、安全な方に逃げるから
共通ライブラリを修正しない方法を模索する!
開放/閉鎖原則
結果的に
共通ライブラリに機能追加されず
ツールの機能が改善されない
開放/閉鎖原則
でも実は...
開放/閉鎖原則
「共通ライブラリを修正しない方法を模索する!」
これは悪い考えじゃない
開放/閉鎖原則
機能を追加するために
共通ライブラリを修正しなくて済めば
達成できる!
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
関心事A 関心事B 関心事C 関心事D
どう出力するかの関心事が各ツールの方にあると...
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
関心事A 関心事B 関心事C 関心事D
どう出力するかの変更があっても
開放/閉鎖原則
共通ライブラリ
ツールA ツールB ツールC ツールD
依存
関心事A 関心事B 関心事C 関心事D
どのように出力したいか?が変わる
と...
変更発生!
他のツールは再テスト必要ない
開放/閉鎖原則
● まとめ
– 開放/閉鎖原則大事!
– 再利用を考えているところはこれに従う
– 共通ライブラリの関心事か利用する側の関心事かの
判断は大事
– ストラテジーパターンは開放/閉鎖原則のための手
法の一つ
デザインパターン質疑応答
どうやって勉強すればいいです
か?
どうやって勉強すればいいですか?
● 適用後・適用前が比較できる書籍を読んでくだ
さい
● 有名なフレームワークも参考になります
– 複雑だと思ってたものが、実はデザインパターンが
使われてて、拡張性のためにそうなっているってい
うものも
どうやって勉強すればいいですか?
● オブジェクト指向における再利用のためのデザインパターン
– http://www.amazon.co.jp/dp/4797311126/
どうやって勉強すればいいですか?
● アジャイルソフトウェア開発の奥義
– http://www.amazon.co.jp/dp/4797347783
どうやって勉強すればいいですか?
● オブジェクト指向のこころ
– http://www.amazon.co.jp/dp/4621066048/
どうやって勉強すればいいですか?
● リファクタリング
– http://www.amazon.co.jp/dp/427405019X/
どうやって勉強すればいいですか?
ほかにもいっぱいあるよ!
どうやって勉強すればいいですか?
● Java言語で学ぶデザインパターン入門
– おすすめしません!
どうやって勉強すればいいですか?
● 結城さんごめんなさい!
– 結城さんはいい書籍たくさん書いています!
● おすすめしない理由...
– 適用前のコード → 問題点の説明 → 適用してどうな
るかのサイクルがちょっと分かりにくい
– ある程度理解してから読むと、メリットをきちんと
まとめてあるので結構役に立ちます
いつデザインパターンを使えばいいですか?
いつデザインパターンを使えばいいですか?
● 難しい...
● 各デザインパターンのメリットを理解して適切
に使わないといけない
● 必要のないところに使うと可読性が低下する
いつデザインパターンを使えばいいですか?
● 使った方がいいと自信を持って言えるところは
使った方がいい
● 悩むところは使わない
– ただし、後々の修正で必要になったらリファクタリ
ングしてデザインパターンを導入する
いつデザインパターンを使えばいいですか?
● とある会社の例だと、共通ライブラリを作った段
階ではデザインパターンを導入していなくても問
題ない
● ツールBで共通ライブラリに手を入れる必要が出
たときに、将来も似たような変更の可能性が高い
なら、導入する
● 導入するなら早い方がいい
– 導入を遅らせると利用者が増えるので、リスクが増え
て、リファクタリングを躊躇する傾向がある
いつデザインパターンを使えばいいですか?
● とある会社の例でも、自分ならば、単体テスト
のために、最初でデザインパターンを導入する
● 単体テストはその関数の最初の利用者なので、
単体テストしにくい≒使いにくい(開放/閉鎖原則
に違反している)ことが多い
いつデザインパターンを使えばいいですか?
● 大事な事は...
– 非デザインパターンなコードにデザインパターンを
導入する能力
– デザインパターンを後から導入しやすいコードを書
く能力
いつデザインパターンを使えばいいですか?
忘れてましたけど
いつデザインパターンを使えばいいですか?
自分の事棚に挙げてますんで!
全部覚える必要ある?
全部覚える必要ある?
ないです!
全部覚える必要ある?
● 言語に取り込まれていたり
● 形が似てるので覚えやすかったり
● 使い道があまりないのとか...
● そもそもデザインパターンに含めるべきものか
どうか怪しいものも...
まとめ
まとめ
● デザインパターンを適切に使うと再利用性が高まる
– 再利用のためじゃないものもあるけどね...
● 再利用性が高いと開発が楽になる
● 開放/閉鎖原則、大事
– 拡張性が高くなる
– 拡張性が高ければ共通ライブラリを修正しないですむ
● 書籍や既存のフレームワーク使って勉強しましょう!
– 適用前・適用後・メリットを考えながら
まとめ
● プログラムの原則は馬鹿にできないよ
– 開放/閉鎖原則
– 単一責任の原則
– 依存関係逆転の原則
– 他にも...
まとめ
デザインパターンをうまく使って
再利用を推進し
がしがし機能拡張していきましょう!
ご清聴ありがとうございました!

More Related Content

What's hot

非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理KageShiron
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTtakesako
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
 
(公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 (公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 Hiroki Nakahara
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 

What's hot (20)

Java8でRDBMS作ったよ
Java8でRDBMS作ったよJava8でRDBMS作ったよ
Java8でRDBMS作ったよ
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Consistent hash
Consistent hashConsistent hash
Consistent hash
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
最速C# 7.x
最速C# 7.x最速C# 7.x
最速C# 7.x
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
(公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 (公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 

Viewers also liked

エクストリームエンジニア1
エクストリームエンジニア1エクストリームエンジニア1
エクストリームエンジニア1T-arts
 
デザインパターン(初歩的な7パターン)
デザインパターン(初歩的な7パターン)デザインパターン(初歩的な7パターン)
デザインパターン(初歩的な7パターン)和明 斎藤
 
Design Pattern From Java To Ruby
Design Pattern From Java To RubyDesign Pattern From Java To Ruby
Design Pattern From Java To Rubyyelogic
 
The way to the timeless way of programming
The way to the timeless way of programmingThe way to the timeless way of programming
The way to the timeless way of programmingShintaro Kakutani
 
Metaprogramming With Ruby
Metaprogramming With RubyMetaprogramming With Ruby
Metaprogramming With RubyFarooq Ali
 

Viewers also liked (9)

Basic Rails Training
Basic Rails TrainingBasic Rails Training
Basic Rails Training
 
エクストリームエンジニア1
エクストリームエンジニア1エクストリームエンジニア1
エクストリームエンジニア1
 
デザインパターン(初歩的な7パターン)
デザインパターン(初歩的な7パターン)デザインパターン(初歩的な7パターン)
デザインパターン(初歩的な7パターン)
 
Design Pattern From Java To Ruby
Design Pattern From Java To RubyDesign Pattern From Java To Ruby
Design Pattern From Java To Ruby
 
Functional Ruby
Functional RubyFunctional Ruby
Functional Ruby
 
The way to the timeless way of programming
The way to the timeless way of programmingThe way to the timeless way of programming
The way to the timeless way of programming
 
Metaprogramming With Ruby
Metaprogramming With RubyMetaprogramming With Ruby
Metaprogramming With Ruby
 
Firefox-Addons
Firefox-AddonsFirefox-Addons
Firefox-Addons
 
Design Patterns in Ruby
Design Patterns in RubyDesign Patterns in Ruby
Design Patterns in Ruby
 

Similar to Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性

Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオンTakuya Ueda
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Takuya Ueda
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発Takuya Ueda
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説賢次 海老原
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Takuya Ueda
 
04 filesystem include
04 filesystem include04 filesystem include
04 filesystem include文樹 高橋
 

Similar to Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性 (7)

Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオン
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
 
Go入門
Go入門Go入門
Go入門
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
04 filesystem include
04 filesystem include04 filesystem include
04 filesystem include
 

More from tomo_masakura

アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除tomo_masakura
 
HTML5 開発環境の紹介
HTML5 開発環境の紹介HTML5 開発環境の紹介
HTML5 開発環境の紹介tomo_masakura
 
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発tomo_masakura
 
Git トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざんGit トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざんtomo_masakura
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeomantomo_masakura
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考えるtomo_masakura
 

More from tomo_masakura (7)

アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除アダプターパターンを使って リリースブランチを排除
アダプターパターンを使って リリースブランチを排除
 
HTML5 開発環境の紹介
HTML5 開発環境の紹介HTML5 開発環境の紹介
HTML5 開発環境の紹介
 
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発
 
HTML5 のお話
HTML5 のお話HTML5 のお話
HTML5 のお話
 
Git トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざんGit トピックブランチと歴史の改ざん
Git トピックブランチと歴史の改ざん
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考える
 

Strategy パターンと開放/閉鎖原則に見るデザインパターンの有用性