スライド 1

Similar documents
スライド 1

VB.NETコーディング標準

デザインパターン第一章「生成《

Microsoft PowerPoint - chap10_OOP.ppt

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

8 if switch for while do while 2

Java (5) 1 Lesson 3: x 2 +4x +5 f(x) =x 2 +4x +5 x f(10) x Java , 3.0,..., 10.0, 1.0, 2.0,... flow rate (m**3/s) "flow

Seasar.NET入門

Java演習(4) -- 変数と型 --

データ構造とアルゴリズム論

: : : TSTank 2

WPF アプリケーションの 多言語切替

Microsoft PowerPoint ppt

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

問題1 以下に示すプログラムは、次の処理をするプログラムである

Java (7) Lesson = (1) 1 m 3 /s m 2 5 m 2 4 m 2 1 m 3 m 1 m 0.5 m 3 /ms 0.3 m 3 /ms 0.6 m 3 /ms 1 1 3

ASP.NET 2.0 Provider Model 概要

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

基礎計算機演習 実習課題No6

アルゴリズムとデータ構造1

Microsoft Word - NonGenTree.doc

IT プロジェクト

プログラミング入門1

Prog2_12th

解きながら学ぶJava入門編

アルゴリズムとデータ構造1

1_cover

ジョインポイント写像に基づく ドメイン特化AO機構の開発手法

DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別で

プロセス間通信

V8.1新規機能紹介記事

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

動的なデザインパターン

Microsoft Word - NonGenList.doc

C#の基本

design_pattern.key

とても使いやすい Boost の serialization

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

新・明解Java入門

C#の基本2 ~プログラムの制御構造~

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

第1章 ビジュアルプログラミング入門

ALG ppt

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

Windows Web Windows Windows WinSock

Java - Visual Editor

JAVA入門

GEC-Java

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

PowerPoint Presentation

Microsoft PowerPoint - グリッド協議会GT4演習資料_2007_配布用

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

スライド 1

JavaプログラミングⅠ

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Microsoft PowerPoint - prog03.ppt

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

文字列操作と正規表現

JAVA とテンプレート

WPF アプリケーションの 多言語切替

Microsoft Word - keisankigairon.ch doc

プログラミングA

Java講座

Microsoft認定資格問題集(70-483_demo)

MISAO with WPF

Java updated

Visual Studio Do-It-Yourself 第 9 回ユーザーコントロール 第 6 回のリソースから第 8 回のテンプレートで さまざまな方法でコントロールをカスタマズできるこ とを学びました 今回のテーマであるユーザーコントロールは 既存の一つのコントロールをカスタマ ズするのではな

第2回講義

ALG ppt

10-C.._241_266_.Z

Java学習教材

Program Design (プログラム設計)

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

untitled

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

C# の現在・過去・未来

MPI MPI MPI.NET C# MPI Version2

プログラミングA

コーディング基準.PDF

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

メソッドのまとめ

Java 2 - Lesson01

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

2

SharpShooter Reports.WPF 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

プログラミングA

PowerPoint プレゼンテーション

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Microsoft PowerPoint - kougi9.ppt

10K

ガイダンス

java_servlet2_見本

tkk0408nari

Transcription:

R 流 C# と日本語で 簡単デザインパターン 2008 年 04 月 05 日 R 田中一郎 http://blogs.wankuma.com/rti/ Microsoft MVP for Development Tools - Visual C#

はじめに アジェンダ デザインパターンとは? Observer パターン Strategy パターン Singleton パターン まとめ

はじめに デザインパターンを知っていますか? 知らない人は 興味がありますか? 実際に活用しているパターンは何ですか? 本セッションでは デザインパターンを身近なものに置き換 えて考えてみます 実は僕もあまり得意じゃありません w 今日は皆さんと意見交換をしながら一緒に勉強していきた いと思います!( 初心者ですから )

デザインパターンとは? WEB デザインのパターンのこと? 設計上の問題に直面したことはありますか? 解決策を考えるために多くの時間を費やしたことはありますか? 一度解決できたパターンを再利用することで以後の問題がスムーズに解決した経験はありますか?

デザインパターンとは? さて ここで疑問が湧いてきます この問題に直面したのは自分が最初なのか? 殆どの問題は 既に誰かが解決方法を発見しています そして それらの解決方法を再利用できるように デザインパターンとしてまとめれられています

デザインパターンとは? デザインパターンを知ると.NET Framework を使う上でも 各クラスの設計思想が理解しやすくなります 各パターンに名前が付いているため 他者と設計に関す る意見を交換する際にも お互いの誤解が生じにくくなり す ます 何より 既存のデザインを流用でき 理想的な問題解決ができます

観察者 ( オブザーバ ) パターン - Observer Pattern - 観察者という名前を持つパターンです 実際 何を観察するのでしょうか?

Observer Pattern シナリオ あなたは泊りがけの出張に出かけました 1 日目の仕事を無事に終えホテルにチェックインしました 翌朝 7 時に起床しなければなりません

方法 1 自分で時計を確認する 取りあえず寝るが 寝がえりをうったり何かのはずみで目覚めた時 自発的に時計を確認する public void 就寝 () { 俺. 眠る (); 時計. 七時になるまで待つ (); 俺. 起きる (); class 時計 { public static void 七時になるまで待つ () { while( 現在時刻を取得 () < 7) { private static int 現在時刻を取得 () { return DateTime.Now.Hour; class 俺 { public static void 起きる () { Console.WriteLine(" 起きた!"); public static void 眠る () { Console.WriteLine("Zzz...");

方法 1 自分で時計を確認する 安心して眠れない 非常に危険をともなう 再利用性が低い 7 時になるまで待つ部分のオブジェクトの分 離ができていない

方法 2 目覚まし時計で起きる

方法 2 目覚まし時計で起きる interface I 起床できる { void 起床する (); 時計をセットして寝る アラームがなるまで寝ることに専念できる class 目覚まし時計 { public I 起床できるお前 { get; set; public void 開始 () { 時計. 七時になるまで待つ (); お前. 起床する (); class 目覚まし時計を使う賢い俺 : I 起床できる { public void 就寝 () { var 時計 = new 目覚まし時計 (); 時計. お前 = (I 起床できる )this; 時計. 開始 (); 俺. 眠る (); public void 起床する () { 俺. 起きる ();

方法 2 目覚まし時計で起きる 時間まで安心して眠れる 7 時になるまでを監視するロジックが完全に分離できている 再利用性が高い 但し 自分専用で複数人を起こすことができない

方法 3 モーニングコールシステム 目覚まし時計の代わりにモーニングコールシステムを使う モーニングコールは依頼された人だけ起こす interface I 電話を取れる { void 電話を取る (); interface I モーニングコール { void 依頼 (I 電話を取れるお前 ); void キャンセル (I 電話を取れるお前 ); void 起こす (); class モーニングコールを使う都会派の俺 : I 電話を取れる { public void 就寝 () { var モーニングコール = new モーニングコール (); モーニングコール. 始動 (); モーニングコール. 依頼 ((I 電話を取れる )this); 俺. 眠る (); public void 電話を取る () { 俺. 起きる ();

方法 3 モーニングコールシステム class モーニングコール : I モーニングコール { private List<I 電話を取れる > お前ら ; public モーニングコール () { お前ら = new List<I 電話を取れる >(); public void 依頼 (I 電話を取れるお前 ) { お前ら.Add( お前 ); public void キャンセル (I 電話を取れるお前 ) { お前ら.Remove( お前 ); public void 起こす () { foreach(var お前 in お前ら ) お前. 電話を取る (); public void 始動 () { 時計. 七時になるまで待つ (); 起こす ();

オブザーバーパターン interface IObserver { void Update(); interface ISubject { void Add(IObserver observer); void Remove(IObserver observer); void Notify(); class Observer : IObserver { public Observer() { var subject = new Subject(); subject.add((iobserver)this); public void Update() { class Subject : ISubject { private List<IObserver> observers; public Subject() { observers = new List<IObserver>(); public void Add(IObserver observer) { observers.add(observer); public void Remove(IObserver observer) { observers.remove(observer); public void Notify() { foreach(var x in observers) x.update();

オブザーバーパターンまとめ class そんなの関係ねー { public void 就寝 () { var モーニングコール = new モーニングコール 2(); モーニングコール. 始動 (); モーニングコール. 起こす += (sender, e) => 電話を取る (); 俺. 眠る (); public void 電話を取る () { 俺. 起きる (); class モーニングコール 2 { public event EventHandler 起こす ; public void 始動 () { 時計. 七時になるまで待つ (); if ( 起こす!= null) 起こす (this, EventArgs.Empty);

戦略 ( ストラテジ ) パターン - Strategy Pattern - 戦略という名前を持つパターンです 実際 何の戦略を練るのでしょうか?

Strategy Pattern シナリオ あなたは 朝目覚めました 遅刻せずに出社しなければなりません 起床から出社までの行動に関する戦略を練ってみましょう

こんな感じでしょうか? public enum 緊急度 { まったり, ぼちぼち, やばいかも ; class 遅刻しないための戦略その1 { public void 行動 () { var 方法 = 緊急度. やばいかも ; switch ( 方法 ) { case 緊急度. まったり : Console.WriteLine(" 顔を洗う "); Console.WriteLine(" 歯を磨く "); Console.WriteLine(" トイレに入る "); Console.WriteLine(" お風呂に入る "); Console.WriteLine(" 着替える "); Console.WriteLine(" 徒歩で移動する "); break; case 緊急度. ぼちぼち : Console.WriteLine(" 顔を洗う "); Console.WriteLine(" 歯を磨く "); Console.WriteLine(" 着替える "); Console.WriteLine(" 自転車で移動する "); break; case 緊急度. やばいかも : Console.WriteLine(" タクシーで移動する "); break;

戦略を練れていますか? 緊急度ごとの振舞い ( 戦略 ) が オブジェクトとして独立していない 戦略の選出が複雑になったらどうするか? 戦略の変更に適していない!

遅刻しないための戦略を整理する interface I 行動できる { void 行動する (); class まったり : I 行動できる { public void 行動する () { Console.WriteLine(" 顔を洗う "); Console.WriteLine(" 歯を磨く "); Console.WriteLine(" トイレに入る "); Console.WriteLine(" お風呂に入る "); Console.WriteLine(" 着替える "); Console.WriteLine(" 徒歩で移動する "); class ぼちぼち : I 行動できる { public void 行動する () { Console.WriteLine(" 顔を洗う "); Console.WriteLine(" 歯を磨く "); Console.WriteLine(" 着替える "); Console.WriteLine(" 自転車で移動する ");

遅刻しないための戦略を整理する class やばいかも : I 行動できる { public void 行動する () { Console.WriteLine(" タクシーで移動する "); class 遅刻しないための戦略その 2 { public void 行動 () { I 行動できる方法 = new やばいかも (); 開始 ( 方法 ); private void 開始 (I 行動できる方法 ) { 方法. 行動する (); // 戦略に応じてアルゴリズムを差し替える!

Strategy Pattern interface IStrategy { void Method(); class StrategyA : IStrategy { public void Method() { class StrategyB : IStrategy { public void Method() { class Strategy { public Strategy() { IStrategy x = new StrategyA(); x.method();

単一のもの ( シングルトン ) パターン - Singleton Pattern - 単一のものという名前を持つパターンです 実際 何が単一であることを保証してくれる のでしょう?

Singleton Pattern シナリオ あなたは お財布をたくさん持っています 必要な時 お財布を購入してしまいます お金は 複数のお財布に入っています 全財産がわかりません 必ず一つのお財布だけでお金を管理するには?

今の状態 class 財布をたくさん持つ { public void お金の管理 () { var 財布 1 = new 財布 { お金 = 1000 ; var 財布 2 = new 財布 { お金 = 5000 ; var 財布 3 = new 財布 { お金 = 300 ; var 財布 4 = new 財布 { お金 = 10000 ; var 全財産 = (new[] { 財布 1, 財布 2, 財布 3, 財布 4 ).Select(x => x. お金 ).Sum(); var まとめた財布 = new 財布 { お金 = 全財産 ; class 財布 { public int お金 { get; set;

財布は本当にひとつなのか? どこかでまとめても 新しく作って ( 購入 ) してお金を入れてしまうかもしれない そもそも まとめる以前のお財布も 見つからないものがあるかもしれない 目前にあるお財布が本当にただ一つのものであることを保障して欲しい

唯一の財布であることを保障する 世の中に 財布というものが一つしかなければ良い 新しく購入することができなければ良い 一つだけは最初から存在している

今の状態 class 財布を一つにまとめる { public void お金の管理 () { 唯一の財布.Instance. お金 = 1000; 唯一の財布.Instance. お金 += 5000; Console.WriteLine( 唯一の財布.Instance. お金 ); class 唯一の財布 { private 唯一の財布 (){ private static 唯一の財布自分自身 = new 唯一の財布 (); public static 唯一の財布 Instance { get { return 自分自身 ; public int お金 { get; set;

class Singleton { Singleton Pattern private Singleton() { private static Singleton singleton = new Singleton(); public static Singleton Instance { get { return singleton;

まとめ C# ではイベントでオブザーバーパターンが簡単に実現できる! ストラテジーパターンで アルゴリズムを差し替える シングルトンパターンで唯一のオブジェクトを利用する