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

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

Upload: mao-ohnishi

Post on 16-Aug-2015

114 views

Category:

Software


1 download

TRANSCRIPT

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

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

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

目次

リファクタリング ワークショップ (全1問)

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

ポイントサービス (全2問)

旅行代理店サービス (全3問)

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

パッケージ構成

リファクタリング ワークショップ

ポイントサービス ワークショップ

旅行代理店サービス ワークショップ

_*answerが各ワークショップの答え

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

リファクタリング ワークショップ

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

狙い

コードを整理する 第一歩は メソッド抽出

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

狙い

メソッドの粒度が細かければ、再利用の可能性が増加

コードの可読性が高まる(メソッド名がコメントの役割)

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

メソッド抽出の候補 例1

空行で区切られた数行のかたまり

リファクタリング前 リファクタリング後

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

メソッド抽出の候補 例2

コメントで説明されている数行のかたまり

リファクタリング前 リファクタリング後

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

メソッド抽出の候補 例3

ifの条件式

リファクタリング前 リファクタリング後

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

メソッド抽出の候補 例4

if、for文のブロック文

リファクタリング前 リファクタリング後

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

メソッド抽出時の重要なこと

「何をしたいのか(目的)」 と

「どう実現するか(手段)」 を分離

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

メソッド抽出時の重要なこと

メソッド名で、目的を表現

メソッド内の処理で、手段を表現

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

DDD本で言うと

第10章しなやかな設計の

意図の明白なインターフェース

のこと。

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

メソッド抽出時の重要なこと

リファクタリング前 リファクタリング後

手段と目的が同一

目的:年齢がほしい(業務上の関心ごと) 手段:DateUtil**

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

ワークショップの進め方

1. 事前にテストコードとダメなプロダクトコードを用意済み

2. プロダクトコードをリファクタリング

3. 周りの人と意見交換

4. 回答例説明(ライブコーティング)

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

お題

給与計算するメソッドのリファクタ

サービス仕様

役職 時給

担当 1000円

主任 2000円

マネージャー 3000円

グループマネージャ 4000円

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

演習タイム:10分

意見交換タイム:5分

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

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

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

ワークショップの流れ

1. ポイントサービス

1. 最初のお題を実装

2. 仕様変更に対応

2. 旅行代理店サービス

1. 最初のお題を実装

2. 機能強化

3. 機能強化

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

オブジェクト指向でやりたいこと

関連する データとロジックは 同じクラスに集める

まずは、コレだけ

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

ポイントサービス

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

ポイントサービスの概要

入会仕様

氏名と誕生日の情報が必要。

未成年(19歳以下)は入会不可。

ポイント付与仕様

購入した商品の金額の10%分をポイント付与。

小数点は切り捨て。

高齢者(60歳以上)の場合は、ポイント付与率が2倍。

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

作るもの

1. 入会チェック機能

氏名と誕生日をもらって、入会可否(boolean)を返却する

2. 付与するポイントを計算する機能

購入する商品の金額と誕生日をもらって、付与ポイントを返却する

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

ワークショップの進め方

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)

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

演習タイム:20分

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

ポイントサービス

~仕様変更~

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

仕様変更

入会仕様

未成年の年齢を19歳以下から17歳以下に変更。

ポイント付与仕様

高齢者の年齢を60歳以上から65歳以上に変更。

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

おさらい : オブジェクト指向でやりたいこと

関連する データとロジックは 同じクラスに集める

まずは、コレだけ

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

同じクラスに集める利点

変更対象と

影響範囲が

限定しやすくなる

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

演習タイム:10分

意見交換タイム:15分

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

不吉なにおい

データをgetした後に

ロジックがある場合は

危険信号

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

不吉なにおい

・未成年の判定 ・高齢者の判定

別々のクラスなら、不吉なにおい

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

不吉なにおい

誕生日クラス

getValue()

AntiPattern1クラス

未成年か()

AntiPattern2クラス

高齢者か()

同じようなロジックを持ったクラスが散らばっていく

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

改善案

誕生日クラス

String value

getValue() 未成年か() 高齢者か()

関連するデータとロジックは同じクラスに集める

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

旅行代理店サービス

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

旅行サービス 背景

「小池ツーリスト」という旅行代理店のベンチャー企業を設立

沖縄旅行限定のツアーに専念

最初のツアーは、「沖縄弾丸ツアー」のみを提供

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

ワークショップ2 旅行サービス概要

ツアー仕様

ツアー申し込み時は、出発日と参加人数が必要。

季節に応じて、ツアーの基本料金が変動。

参加人数に応じて、ツアーの合計料金が変動。

季節 基本料金

夏(6月~8月) 基本料金の1.5倍

冬(12月~2月) 基本料金の0.75倍

春(3月~5月)、秋(9月~11月) 基本料金のまま

参加人数 合計料金

1名 合計金額のまま

2名~4名 合計金額から10%オフ

5名以上 合計金額から20%オフ

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

ワークショップ2 作るもの

ツアー料金計算機能

申し込むツアーの出発日と参加人数をもらって、ツアー料金を返却する。

沖縄弾丸ツアーの基本料金は、10,000円/円とする。

季節 基本料金

夏(6月~8月) 基本料金の1.5倍

冬(12月~2月) 基本料金の0.75倍

春(3月~5月)、秋(9月~11月) 基本料金のまま

参加人数 合計料金

1名 合計金額のまま

2名~4名 合計金額から10%オフ

5名以上 合計金額から20%オフ

季節の基本料金 参加人数の料金

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

ワークショップの進め方

easy/normal/hardの3レベルを用意。

easy : オブジェクト指向チックで書かれたコード・テストコードあり。

normal : 手続き型で書かれたコード・テストコードあり。

hard : 空のクラスと失敗するテストコードあり。

基本料金の計算時にintからdoubleになるケースは、強制的にintにしてもいいよ。

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

演習タイム:20分

意見交換タイム:10分

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

注目ポイント

・季節の基本料金の判定

・合計金額の判定

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

回答案

出発月クラス

季節の料金を計算する

関連するデータとロジックは同じクラスに集める

参加人数クラス

合計金額を計算する

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

旅行代理店サービス

~環境変化 その1~

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

旅行サービス 環境変化

提供していた「沖縄弾丸ツアー」だけではこれ以上顧客拡大ができない。

今後は、沖縄ツアーのバリエーションを増やすことにより、顧客層を拡大させる。

バリエーション追加の第一弾として、 「沖縄ゆったりツアー」を追加する。

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

作るもの

ツアー料金計算機能

申し込むツアーと出発日と参加人数をもらって、ツアー料金を返却する。

季節 基本料金

夏 基本料金の1.5倍

冬 基本料金の0.75倍

春、秋 基本料金のまま

参加人数 合計料金

1名 合計金額のまま

2名~4名 合計金額から10%オフ

5名以上 合計金額から20%オフ

季節の基本料金の割合 参加人数の料金

ツアーの種類 基本料金

沖縄弾丸ツアー 10,000円/人

沖縄ゆったりツアー 20,000円/人

ツアーの基本料金

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

お願い事項

機能強化時に 対応しづらければ、 既存のリファクタリング

を実施

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

お願い事項

機能強化時と

既存のリファクタリング

を同時にやらない

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

ワークショップの進め方

先ほど実装した「travel¥_1」パッケージに、機能強化を実施。

手が止まってしまう人は、手続き型でもいいので、とりあえず動くコードを!動くコードができてからリファクタリングを実施。

「_1answer」が前回の答え、[_2answer」が今回の答え。

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

演習タイム:20分

意見交換タイム:10分

(演習タイム:10分)

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

注目ポイント

沖縄ツアーのバリエーションが簡単に追加できる実装

になっているか?

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

回答案

追加するツアーを定義するだけ。

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

回答案

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

旅行代理店サービス

~環境変化 その2~

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

旅行サービス 環境変化

「小池ツーリスト」が沖縄旅行者のシェア70%を占めるまで、成長!!

これから会社を成長させるためには、沖縄以外の都道府県のツアーを積極的に拡大していく必要がある。

まずは、沖縄同様にリゾート感がある北海道の開拓を始める。

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

作るもの

ツアー料金計算機能

申し込むツアーと出発日と参加人数をもらって、ツアー料金を返却する。

行き先 季節 基本料金

沖縄 夏 基本料金の1.5倍

冬 基本料金の0.75倍

春、秋 基本料金のまま

北海道 夏 基本料金の0.75倍

冬 基本料金の1.5倍

春、秋 基本料金のまま

参加人数 合計料金

1名 合計金額のまま

2名~4名 合計金額から10%オフ

5名以上 合計金額から20%オフ

季節の基本料金の割合

参加人数の料金

ツアーの種類 基本料金

沖縄弾丸ツアー 10,000円/人

沖縄ゆったりツアー 20,000円/人

北海道弾丸ツアー 10,000円/人

ツアーの基本料金

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

ワークショップの進め方

先ほど実装した「travel¥_1」パッケージに、機能強化を実施。

手が止まってしまう人は、手続き型でもいいので、とりあえず動くコードを!動くコードができてからリファクタリングを実施。

「_3answer」が今回の答え

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

演習タイム:50分

意見交換タイム:15分

演習タイム:20分

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

注目ポイント

京都ツアー・東京ツアーが簡単に追加できる実装に

なっているか?

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

回答案 割合を

追加していく

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

回答案

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

クロージング

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

振り返り

・参加してよかったこと ・続けてほしいこと

・同じテーマを再演したときに 改善したほうがよいこと

・次回に期待すること

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

補足

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

補足

補足情報は、以下にまとめています。

「社内でオブジェクト指向ワークショップを開催」

http://nocturne-life-restoration.hatenablog.com/entry/2015/08/01/124015