SlideShare ist ein Scribd-Unternehmen logo
1 von 64
Downloaden Sie, um offline zu lesen
オブジェクト指向 ワークショップ
目次
 リファクタリング ワークショップ (全1問)
 オブジェクト指向 ワークショップ
 ポイントサービス (全2問)
 旅行代理店サービス (全3問)
パッケージ構成
リファクタリング ワークショップ
ポイントサービス ワークショップ
旅行代理店サービス ワークショップ
_*answerが各ワークショップの答え
リファクタリング
ワークショップ
狙い
コードを整理する
第一歩は
メソッド抽出
狙い
 メソッドの粒度が細かければ、再利用の可能性が増加
 コードの可読性が高まる(メソッド名がコメントの役割)
メソッド抽出の候補 例1
 空行で区切られた数行のかたまり
リファクタリング前 リファクタリング後
メソッド抽出の候補 例2
 コメントで説明されている数行のかたまり
リファクタリング前 リファクタリング後
メソッド抽出の候補 例3
 ifの条件式
リファクタリング前 リファクタリング後
メソッド抽出の候補 例4
 if、for文のブロック文
リファクタリング前 リファクタリング後
メソッド抽出時の重要なこと
「何をしたいのか(目的)」
と
「どう実現するか(手段)」
を分離
メソッド抽出時の重要なこと
メソッド名で、目的を表現
メソッド内の処理で、手段を表現
DDD本で言うと
第10章しなやかな設計の
意図の明白なインターフェース
のこと。
メソッド抽出時の重要なこと
リファクタリング前 リファクタリング後
手段と目的が同一
目的:年齢がほしい(業務上の関心ごと)
手段:DateUtil**
ワークショップの進め方
1. 事前にテストコードとダメなプロダクトコードを用意済み
2. プロダクトコードをリファクタリング
3. 周りの人と意見交換
4. 回答例説明(ライブコーティング)
お題
給与計算するメソッドのリファクタ
サービス仕様
役職 時給
担当 1000円
主任 2000円
マネージャー 3000円
グループマネージャ 4000円
演習タイム:10分
意見交換タイム:5分
オブジェクト指向
ワークショップ
ワークショップの流れ
1. ポイントサービス
1. 最初のお題を実装
2. 仕様変更に対応
2. 旅行代理店サービス
1. 最初のお題を実装
2. 機能強化
3. 機能強化
オブジェクト指向でやりたいこと
関連する
データとロジックは
同じクラスに集める
まずは、コレだけ
ポイントサービス
ポイントサービスの概要
入会仕様
 氏名と誕生日の情報が必要。
 未成年(19歳以下)は入会不可。
ポイント付与仕様
 購入した商品の金額の10%分をポイント付与。
 小数点は切り捨て。
 高齢者(60歳以上)の場合は、ポイント付与率が2倍。
作るもの
1. 入会チェック機能
 氏名と誕生日をもらって、入会可否(boolean)を返却する
2. 付与するポイントを計算する機能
 購入する商品の金額と誕生日をもらって、付与ポイントを返却する
ワークショップの進め方
 easy/normal/hardの3レベルを用意。
 easy : オブジェクト指向チックで書かれたコード・テストコードあり。
 normal : 手続き型で書かれたコード・テストコードあり。
 hard : 空のクラスと失敗するテストコードあり。
 指定された日付からの経過年数を取得するクラスは用意済み。現在日は2015/2/2で固定。
 付与ポイントの計算時にintからdoubleになるケースは、強制的にintにしてもいいよ。
補足:各年齢の境界値
19歳(1995/02/03)、20歳(1995/02/02)
59歳(1955/02/03)、60歳(1995/02/02)
演習タイム:20分
ポイントサービス
~仕様変更~
仕様変更
入会仕様
 未成年の年齢を19歳以下から17歳以下に変更。
ポイント付与仕様
 高齢者の年齢を60歳以上から65歳以上に変更。
おさらい : オブジェクト指向でやりたいこと
関連する
データとロジックは
同じクラスに集める
まずは、コレだけ
同じクラスに集める利点
変更対象と
影響範囲が
限定しやすくなる
演習タイム:10分
意見交換タイム:15分
不吉なにおい
データをgetした後に
ロジックがある場合は
危険信号
不吉なにおい
・未成年の判定
・高齢者の判定
別々のクラスなら、不吉な
におい
不吉なにおい
誕生日クラス
getValue()
AntiPattern1クラス
未成年か()
AntiPattern2クラス
高齢者か()
同じようなロ
ジックを持っ
たクラスが散
らばっていく
改善案
誕生日クラス
String value
getValue()
未成年か()
高齢者か()
関連するデー
タとロジック
は同じクラス
に集める
旅行代理店サービス
旅行サービス 背景
 「小池ツーリスト」という旅行代理店のベンチャー企業を設立
 沖縄旅行限定のツアーに専念
 最初のツアーは、「沖縄弾丸ツアー」のみを提供
ワークショップ2 旅行サービス概要
ツアー仕様
 ツアー申し込み時は、出発日と参加人数が必要。
 季節に応じて、ツアーの基本料金が変動。
 参加人数に応じて、ツアーの合計料金が変動。
季節 基本料金
夏(6月~8月) 基本料金の1.5倍
冬(12月~2月) 基本料金の0.75倍
春(3月~5月)、秋(9月~11月) 基本料金のまま
参加人数 合計料金
1名 合計金額のまま
2名~4名 合計金額から10%オフ
5名以上 合計金額から20%オフ
ワークショップ2 作るもの
ツアー料金計算機能
 申し込むツアーの出発日と参加人数をもらって、ツアー料金を返却する。
 沖縄弾丸ツアーの基本料金は、10,000円/円とする。
季節 基本料金
夏(6月~8月) 基本料金の1.5倍
冬(12月~2月) 基本料金の0.75倍
春(3月~5月)、秋(9月~11月) 基本料金のまま
参加人数 合計料金
1名 合計金額のまま
2名~4名 合計金額から10%オフ
5名以上 合計金額から20%オフ
季節の基本料金 参加人数の料金
ワークショップの進め方
 easy/normal/hardの3レベルを用意。
 easy : オブジェクト指向チックで書かれたコード・テストコードあり。
 normal : 手続き型で書かれたコード・テストコードあり。
 hard : 空のクラスと失敗するテストコードあり。
 基本料金の計算時にintからdoubleになるケースは、強制的にint
にしてもいいよ。
演習タイム:20分
意見交換タイム:10分
注目ポイント
・季節の基本料金の判定
・合計金額の判定
回答案
出発月クラス
季節の料金を計算する
関連するデー
タとロジック
は同じクラス
に集める
参加人数クラス
合計金額を計算する
旅行代理店サービス
~環境変化 その1~
旅行サービス 環境変化
 提供していた「沖縄弾丸ツアー」だけではこれ以上顧客拡大ができない。
 今後は、沖縄ツアーのバリエーションを増やすことにより、顧客層を拡大
させる。
 バリエーション追加の第一弾として、 「沖縄ゆったりツアー」を追加する。
作るもの
ツアー料金計算機能
 申し込むツアーと出発日と参加人数をもらって、ツアー料金を返却する。
季節 基本料金
夏 基本料金の1.5倍
冬 基本料金の0.75倍
春、秋 基本料金のまま
参加人数 合計料金
1名 合計金額のまま
2名~4名 合計金額から10%オフ
5名以上 合計金額から20%オフ
季節の基本料金の割合 参加人数の料金
ツアーの種類 基本料金
沖縄弾丸ツアー 10,000円/人
沖縄ゆったりツアー 20,000円/人
ツアーの基本料金
お願い事項
機能強化時に
対応しづらければ、
既存のリファクタリング
を実施
お願い事項
機能強化時と
既存のリファクタリング
を同時にやらない
ワークショップの進め方
 先ほど実装した「travel¥_1」パッケージに、機能強化を実施。
 手が止まってしまう人は、手続き型でもいいので、とりあえず動く
コードを!動くコードができてからリファクタリングを実施。
 「_1answer」が前回の答え、[_2answer」が今回の答え。
演習タイム:20分
意見交換タイム:10分
(演習タイム:10分)
注目ポイント
沖縄ツアーのバリエーション
が簡単に追加できる実装
になっているか?
回答案
追加するツアーを
定義するだけ。
回答案
旅行代理店サービス
~環境変化 その2~
旅行サービス 環境変化
 「小池ツーリスト」が沖縄旅行者のシェア70%を占めるまで、成長!!
 これから会社を成長させるためには、沖縄以外の都道府県のツアーを
積極的に拡大していく必要がある。
 まずは、沖縄同様にリゾート感がある北海道の開拓を始める。
作るもの
ツアー料金計算機能
 申し込むツアーと出発日と参加人数をもらって、ツアー料金を返却する。
行き先 季節 基本料金
沖縄 夏 基本料金の1.5倍
冬 基本料金の0.75倍
春、秋 基本料金のまま
北海道 夏 基本料金の0.75倍
冬 基本料金の1.5倍
春、秋 基本料金のまま
参加人数 合計料金
1名 合計金額のまま
2名~4名 合計金額から10%オフ
5名以上 合計金額から20%オフ
季節の基本料金の割合
参加人数の料金
ツアーの種類 基本料金
沖縄弾丸ツアー 10,000円/人
沖縄ゆったりツアー 20,000円/人
北海道弾丸ツアー 10,000円/人
ツアーの基本料金
ワークショップの進め方
 先ほど実装した「travel¥_1」パッケージに、機能強化を実施。
 手が止まってしまう人は、手続き型でもいいので、とりあえず動く
コードを!動くコードができてからリファクタリングを実施。
 「_3answer」が今回の答え
演習タイム:50分
意見交換タイム:15分
演習タイム:20分
注目ポイント
京都ツアー・東京ツアーが
簡単に追加できる実装に
なっているか?
回答案
割合を
追加していく
回答案
クロージング
振り返り
・参加してよかったこと
・続けてほしいこと
・同じテーマを再演したときに
改善したほうがよいこと
・次回に期待すること
補足
補足
補足情報は、以下にまとめています。
「社内でオブジェクト指向ワークショップを開催」
http://nocturne-life-
restoration.hatenablog.com/entry/2015/08/01/124015

Weitere ähnliche Inhalte

Was ist angesagt?

前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況
JubatusOfficial
 
Segmenting Sponteneous Japanese using MDL principle
Segmenting Sponteneous Japanese using MDL principleSegmenting Sponteneous Japanese using MDL principle
Segmenting Sponteneous Japanese using MDL principle
Yusuke Matsubara
 
Topic discovery through data dependent and random projections
Topic discovery through data dependent and random projectionsTopic discovery through data dependent and random projections
Topic discovery through data dependent and random projections
Takanori Nakai
 
パターン認識 第10章 決定木
パターン認識 第10章 決定木 パターン認識 第10章 決定木
パターン認識 第10章 決定木
Miyoshi Yuya
 

Was ist angesagt? (19)

[DSO] Machine Learning Seminar Vol.1 Chapter 1 and 2
[DSO] Machine Learning Seminar Vol.1 Chapter 1 and 2[DSO] Machine Learning Seminar Vol.1 Chapter 1 and 2
[DSO] Machine Learning Seminar Vol.1 Chapter 1 and 2
 
Active Learning from Imperfect Labelers @ NIPS読み会・関西
Active Learning from Imperfect Labelers @ NIPS読み会・関西Active Learning from Imperfect Labelers @ NIPS読み会・関西
Active Learning from Imperfect Labelers @ NIPS読み会・関西
 
Effective Java 読書会1
Effective Java 読書会1Effective Java 読書会1
Effective Java 読書会1
 
多変量解析の一般化
多変量解析の一般化多変量解析の一般化
多変量解析の一般化
 
[DL輪読会]A Generalization of Otsu’s Method and Minimum Error Thresholding[ECCV2...
[DL輪読会]A Generalization of Otsu’s Method and Minimum Error Thresholding[ECCV2...[DL輪読会]A Generalization of Otsu’s Method and Minimum Error Thresholding[ECCV2...
[DL輪読会]A Generalization of Otsu’s Method and Minimum Error Thresholding[ECCV2...
 
MIRU2011 OS1-2 拡張ペアワイズ表現を用いた一般化多変量解析
MIRU2011 OS1-2 拡張ペアワイズ表現を用いた一般化多変量解析MIRU2011 OS1-2 拡張ペアワイズ表現を用いた一般化多変量解析
MIRU2011 OS1-2 拡張ペアワイズ表現を用いた一般化多変量解析
 
On the eigenstructure of dft matrices(in japanese only)
On the eigenstructure of dft matrices(in japanese only)On the eigenstructure of dft matrices(in japanese only)
On the eigenstructure of dft matrices(in japanese only)
 
潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法
 
広島画像情報学セミナ 2011.9.16
広島画像情報学セミナ 2011.9.16広島画像情報学セミナ 2011.9.16
広島画像情報学セミナ 2011.9.16
 
DS Exercise Course 3
DS Exercise Course 3DS Exercise Course 3
DS Exercise Course 3
 
Jubatus Casual Talks #2: 大量映像・画像のための異常値検知とクラス分類
Jubatus Casual Talks #2: 大量映像・画像のための異常値検知とクラス分類Jubatus Casual Talks #2: 大量映像・画像のための異常値検知とクラス分類
Jubatus Casual Talks #2: 大量映像・画像のための異常値検知とクラス分類
 
前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況
 
Segmenting Sponteneous Japanese using MDL principle
Segmenting Sponteneous Japanese using MDL principleSegmenting Sponteneous Japanese using MDL principle
Segmenting Sponteneous Japanese using MDL principle
 
Olearning-prml1
Olearning-prml1Olearning-prml1
Olearning-prml1
 
EMNLP 2011 reading
EMNLP 2011 readingEMNLP 2011 reading
EMNLP 2011 reading
 
A sequential recommendation approach for interactive personalized story gener...
A sequential recommendation approach for interactive personalized story gener...A sequential recommendation approach for interactive personalized story gener...
A sequential recommendation approach for interactive personalized story gener...
 
Topic discovery through data dependent and random projections
Topic discovery through data dependent and random projectionsTopic discovery through data dependent and random projections
Topic discovery through data dependent and random projections
 
Re revenge chap03-1
Re revenge chap03-1Re revenge chap03-1
Re revenge chap03-1
 
パターン認識 第10章 決定木
パターン認識 第10章 決定木 パターン認識 第10章 決定木
パターン認識 第10章 決定木
 

Andere mochten auch

デジタルメディア創作部勉強会「オブジェクト指向入門1」
デジタルメディア創作部勉強会「オブジェクト指向入門1」デジタルメディア創作部勉強会「オブジェクト指向入門1」
デジタルメディア創作部勉強会「オブジェクト指向入門1」
Hokuto Tateyama
 
オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門
Ryo Miyake
 
Phpではじめるオブジェクト指向(公開用)
Phpではじめるオブジェクト指向(公開用)Phpではじめるオブジェクト指向(公開用)
Phpではじめるオブジェクト指向(公開用)
VOYAGE GROUP
 
06 オブジェクト指向の基礎
06 オブジェクト指向の基礎06 オブジェクト指向の基礎
06 オブジェクト指向の基礎
文樹 高橋
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 

Andere mochten auch (18)

バージョン管理#01 -Subversion編-
バージョン管理#01 -Subversion編-バージョン管理#01 -Subversion編-
バージョン管理#01 -Subversion編-
 
F流 『オブジェクト指向の考え方の基礎の基礎』 ~ソフトウェア開発の原則編~
F流『オブジェクト指向の考え方の基礎の基礎』~ソフトウェア開発の原則編~F流『オブジェクト指向の考え方の基礎の基礎』~ソフトウェア開発の原則編~
F流 『オブジェクト指向の考え方の基礎の基礎』 ~ソフトウェア開発の原則編~
 
関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)
 
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
ジーノ先生の文系的オブジェクト指向(2) - コンストラクタの引数
 
本当のオブジェクト指向は可読性を上げる
本当のオブジェクト指向は可読性を上げる本当のオブジェクト指向は可読性を上げる
本当のオブジェクト指向は可読性を上げる
 
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
 
だいたい30分で分かるオブジェクト指向
だいたい30分で分かるオブジェクト指向だいたい30分で分かるオブジェクト指向
だいたい30分で分かるオブジェクト指向
 
デジタルメディア創作部勉強会「オブジェクト指向入門1」
デジタルメディア創作部勉強会「オブジェクト指向入門1」デジタルメディア創作部勉強会「オブジェクト指向入門1」
デジタルメディア創作部勉強会「オブジェクト指向入門1」
 
第3回勉強会 オブジェクト指向
第3回勉強会 オブジェクト指向第3回勉強会 オブジェクト指向
第3回勉強会 オブジェクト指向
 
第2回 モデリング勉強会
第2回 モデリング勉強会第2回 モデリング勉強会
第2回 モデリング勉強会
 
オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)
 
第1回 モデリング勉強会
第1回 モデリング勉強会第1回 モデリング勉強会
第1回 モデリング勉強会
 
オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門オブジェクト指向プログラミング再入門
オブジェクト指向プログラミング再入門
 
Phpではじめるオブジェクト指向(公開用)
Phpではじめるオブジェクト指向(公開用)Phpではじめるオブジェクト指向(公開用)
Phpではじめるオブジェクト指向(公開用)
 
第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向
 
06 オブジェクト指向の基礎
06 オブジェクト指向の基礎06 オブジェクト指向の基礎
06 オブジェクト指向の基礎
 
第8回勉強会 開発プロセス 「計画ゲーム~ふりかえり」
第8回勉強会 開発プロセス 「計画ゲーム~ふりかえり」第8回勉強会 開発プロセス 「計画ゲーム~ふりかえり」
第8回勉強会 開発プロセス 「計画ゲーム~ふりかえり」
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 

Mehr von Mao Ohnishi

ドメイン駆動設計の捉え方 20150718
ドメイン駆動設計の捉え方 20150718ドメイン駆動設計の捉え方 20150718
ドメイン駆動設計の捉え方 20150718
Mao Ohnishi
 
20150616 dev love発表資料
20150616 dev love発表資料20150616 dev love発表資料
20150616 dev love発表資料
Mao Ohnishi
 

Mehr von Mao Ohnishi (10)

新規事業「Bill One」による Google Cloud 活用術
新規事業「Bill One」による Google Cloud 活用術新規事業「Bill One」による Google Cloud 活用術
新規事業「Bill One」による Google Cloud 活用術
 
リモート拠点を立ち上げる楽しさと苦労
リモート拠点を立ち上げる楽しさと苦労リモート拠点を立ち上げる楽しさと苦労
リモート拠点を立ち上げる楽しさと苦労
 
新規事業を 支える文化と加速させる技術 ~ devops / GCP / DDD ~
新規事業を支える文化と加速させる技術~ devops / GCP / DDD ~新規事業を支える文化と加速させる技術~ devops / GCP / DDD ~
新規事業を 支える文化と加速させる技術 ~ devops / GCP / DDD ~
 
新規事業を加速させる技術
新規事業を加速させる技術新規事業を加速させる技術
新規事業を加速させる技術
 
東京本社よりも地方開発拠点を活性化させるコツ!!!!
東京本社よりも地方開発拠点を活性化させるコツ!!!!東京本社よりも地方開発拠点を活性化させるコツ!!!!
東京本社よりも地方開発拠点を活性化させるコツ!!!!
 
新メンバーが多いチームにおけるプロジェクトマネジメントのコツ(苦労話)
新メンバーが多いチームにおけるプロジェクトマネジメントのコツ(苦労話)新メンバーが多いチームにおけるプロジェクトマネジメントのコツ(苦労話)
新メンバーが多いチームにおけるプロジェクトマネジメントのコツ(苦労話)
 
結果を出すチームビルディング術
結果を出すチームビルディング術結果を出すチームビルディング術
結果を出すチームビルディング術
 
20151110 ドメイン駆動設計によるサービス開発
20151110 ドメイン駆動設計によるサービス開発20151110 ドメイン駆動設計によるサービス開発
20151110 ドメイン駆動設計によるサービス開発
 
ドメイン駆動設計の捉え方 20150718
ドメイン駆動設計の捉え方 20150718ドメイン駆動設計の捉え方 20150718
ドメイン駆動設計の捉え方 20150718
 
20150616 dev love発表資料
20150616 dev love発表資料20150616 dev love発表資料
20150616 dev love発表資料
 

オブジェクト指向ワークショップ 201507版