Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,522 views

Published on

Published in: Software
  • Be the first to comment

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

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

×