Upload
mao-ohnishi
View
114
Download
1
Embed Size (px)
Citation preview
オブジェクト指向 ワークショップ
目次
リファクタリング ワークショップ (全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