Slide 1

Slide 1 text

チーム開発でデプロイ頻度を 上げるための設計とタスク分割 ことみん @kotomin_m Object-Oriented Conference 2024

Slide 2

Slide 2 text

X @kotomin_m #ooc_2024_e ● 所属: ウィルゲート SRE ● 技術: PHP, Laravel ● 趣味: LT会とカンファレンスと カンファレンスのネイル ことみんです!こんにちは!

Slide 3

Slide 3 text

X @kotomin_m #ooc_2024_e ● エンジニア歴2〜3年目ぐらい ● ある程度なら設計〜リリースまで1人で担当できる ● ちょっとずつ社内でも頼られるエンジニアに ● ちょっと前の私 このトークの対象者

Slide 4

Slide 4 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 5

Slide 5 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 6

Slide 6 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 7

Slide 7 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 8

Slide 8 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 9

Slide 9 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 10

Slide 10 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 11

Slide 11 text

X @kotomin_m #ooc_2024_e 今回の対象システム概要

Slide 12

Slide 12 text

X @kotomin_m #ooc_2024_e ストーリー Nヶ月後(Xデー)からシステム利用料を ユーザごとに変更できるようにしたい 事業サイドの人

Slide 13

Slide 13 text

X @kotomin_m #ooc_2024_e ストーリー Nヶ月後(Xデー)からシステム利用料を ユーザごとに変更できるようにしたい わかりました システム改修します 事業サイドの人

Slide 14

Slide 14 text

X @kotomin_m #ooc_2024_e 今回のロジック変更の難しいポイント! ストーリー すでに金額周りの実装が複雑😖 お金周りなので特に障害を出したくない🙏

Slide 15

Slide 15 text

X @kotomin_m #ooc_2024_e 開発チームの人数は、1 + 0.5 * 3人 = 2.5人 ストーリー わたし 兼任メンバー 兼任メンバー インターン生

Slide 16

Slide 16 text

X @kotomin_m #ooc_2024_e ざっと見積もっても開発に2〜3ヶ月かかりそう ストーリー 大きめの機能開発になりそうだ

Slide 17

Slide 17 text

X @kotomin_m #ooc_2024_e ざっと見積もっても開発に2〜3ヶ月かかりそう ストーリー 大きめの機能開発になりそうだ じゃあ、どうしよう?

Slide 18

Slide 18 text

X @kotomin_m #ooc_2024_e 大きめの開発でもデプロイ頻度を上げて開発したい 考えたこと

Slide 19

Slide 19 text

X @kotomin_m #ooc_2024_e 1回のリリースが大きくなると・・・ 考えたこと

Slide 20

Slide 20 text

X @kotomin_m #ooc_2024_e 1回のリリースが大きくなると・・・ ● 変更差分が大きくなり、実装上の不具合を見落とす 考えたこと

Slide 21

Slide 21 text

X @kotomin_m #ooc_2024_e 1回のリリースが大きくなると・・・ ● 変更差分が大きくなり、実装上の不具合を見落とす ● コンフリクトが起きやすくなる 考えたこと

Slide 22

Slide 22 text

X @kotomin_m #ooc_2024_e 1回のリリースが大きくなると・・・ ● 変更差分が大きくなり、実装上の不具合を見落とす ● コンフリクトが起きやすくなる ● テストが難しい 考えたこと

Slide 23

Slide 23 text

X @kotomin_m #ooc_2024_e 1回のリリースが大きくなると・・・ ● 変更差分が大きくなり、実装上の不具合を見落とす ● コンフリクトが起きやすくなる ● テストが難しい 結果、リリースが怖くなる 考えたこと

Slide 24

Slide 24 text

X @kotomin_m #ooc_2024_e デプロイ → 開発した機能を本番環境に配置して動かすこと デプロイ頻度 → デプロイをどれだけ頻繁に行うか デプロイ頻度 とは?

Slide 25

Slide 25 text

X @kotomin_m #ooc_2024_e なぜ、デプロイ頻度を上げて開発したいか? 考えたこと

Slide 26

Slide 26 text

X @kotomin_m #ooc_2024_e なぜ、デプロイ頻度を上げて開発したいか? ● 開発リスクの軽減につながる ○ ソフトウェアの品質を担保しやすくなる 考えたこと

Slide 27

Slide 27 text

X @kotomin_m #ooc_2024_e なぜ、デプロイ頻度を上げて開発したいか? ● デプロイ頻度は、開発生産性の指標である ○ (d/d/d)、(deploys/ a day / a developer) ○ → 1開発者あたり1日あたりのデプロイ回数 ○ = エンジニア組織の健全さの指標 考えたこと

Slide 28

Slide 28 text

X @kotomin_m #ooc_2024_e 大きめの開発でもデプロイ頻度を上げて開発したい これを、どうやって解決したか? このトークで話すこと

Slide 29

Slide 29 text

X @kotomin_m #ooc_2024_e その鍵となったのは・・・ このトークで話すこと 設計 タスク分割

Slide 30

Slide 30 text

X @kotomin_m #ooc_2024_e Lets' 設計スタート!

Slide 31

Slide 31 text

X @kotomin_m #ooc_2024_e Xデーからシステム利用料の計算方法が変わる 仕様

Slide 32

Slide 32 text

X @kotomin_m #ooc_2024_e 報酬リストクラスの概念図

Slide 33

Slide 33 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 報酬リストクラス 説明に出てくるソースコードは PHPをベースにした擬似コード

Slide 34

Slide 34 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 報酬リストクラス 今回の仕様変更対象の メソッド

Slide 35

Slide 35 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 報酬リストクラス 中身を見てみよう!

Slide 36

Slide 36 text

X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if ('2022-04-01' < $年月日) {
 return 0;
 }
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 システム利用料取得メソッド

Slide 37

Slide 37 text

X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if ('2022-04-01' < $年月日) {
 return 0;
 }
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 システム利用料取得メソッド 日付で分岐してる!

Slide 38

Slide 38 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 報酬リストクラス こっちも中身を見てみよう!

Slide 39

Slide 39 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 return $this->新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 
 private function 新しいお支払い金額計算ロジック()
 
 合計お支払い金額計算取得メソッド

Slide 40

Slide 40 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 return $this->新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 
 private function 新しいお支払い金額計算ロジック()
 
 合計お支払い金額計算メソッド 日付で分岐してる! さっきと違うロジックで!

Slide 41

Slide 41 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 return $this->新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 
 private function 新しいお支払い金額計算ロジック()
 
 合計お支払い金額計算メソッド

Slide 42

Slide 42 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 return $this->新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 
 private function 新しいお支払い金額計算ロジック()
 
 合計お支払い金額計算メソッド 分岐した先の計算ロジック が結構複雑🤯

Slide 43

Slide 43 text

X @kotomin_m #ooc_2024_e 設計どうする?

Slide 44

Slide 44 text

X @kotomin_m #ooc_2024_e ● すでに日付で計算ロジック分岐してるコードが点在 設計どうする?

Slide 45

Slide 45 text

X @kotomin_m #ooc_2024_e ● すでに日付で計算ロジック分岐してるコードが点在 ● Xデーの管理どうしよう ○ 今後またXデー増えるかもしれない←これも対応したい 設計どうする?

Slide 46

Slide 46 text

X @kotomin_m #ooc_2024_e ● すでに日付で計算ロジック分岐してるコードが点在 ● Xデーの管理どうしよう ○ 今後またXデー増えるかもしれない←これも対応したい ● 今よりも複雑な実装にしたら今後辛い😖 設計どうする?

Slide 47

Slide 47 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 単純に改修しちゃう場合 ロジック改修しよう!

Slide 48

Slide 48 text

X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if ('2022-04-01' > $年月日) {
 return 0;
 }
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 Before

Slide 49

Slide 49 text

X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if ('2022-04-01' > $年月日) {
 return 0;
 }
 if ('2022-04-01' < $年月日 && $年月日 < '2023-10-01') {
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 $ユーザの利用料率 = ユーザごとの利用料率取得();
 return $this->お仕事の合計利用金額取得() * $ユーザの利用料率;
 }
 
 After

Slide 50

Slide 50 text

X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if ('2022-04-01' > $年月日) {
 return 0;
 }
 if ('2022-04-01' < $年月日 && $年月日 < '2023-10-01') {
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 $ユーザの利用料率 = ユーザごとの利用料率取得();
 return $this->お仕事の合計利用金額取得() * $ユーザの利用料率;
 }
 
 After New分岐!!

Slide 51

Slide 51 text

X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if ('2022-04-01' > $年月日) {
 return 0;
 }
 if ('2022-04-01' < $年月日 && $年月日 < '2023-10-01') {
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 $ユーザの利用料率 = ユーザごとの利用料率取得();
 return $this->お仕事の合計利用金額取得() * $ユーザの利用料率;
 }
 
 After New分岐!! 🤮

Slide 52

Slide 52 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 単純に改修しちゃう場合 こっちもロジック改修しよう!

Slide 53

Slide 53 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 return $this->新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 private function 新しいお支払い金額計算ロジック()
 
 Before

Slide 54

Slide 54 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 if ($this->2022年4月から2023年10月の間ならTRUE($年月日)) {
 return $this->新しいお支払い金額計算ロジック();
 }
 return $this->もっと新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 private function 新しいお支払い金額計算ロジック()
 private function もっと新しいお支払い金額計算ロジック()
 After

Slide 55

Slide 55 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 if ($this->2022年4月から2023年10月の間ならTRUE($年月日)) {
 return $this->新しいお支払い金額計算ロジック();
 }
 return $this->もっと新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 private function 新しいお支払い金額計算ロジック()
 private function もっと新しいお支払い金額計算ロジック()
 After New分岐!!

Slide 56

Slide 56 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 if ($this->2022年4月から2023年10月の間ならTRUE($年月日)) {
 return $this->新しいお支払い金額計算ロジック();
 }
 return $this->もっと新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 private function 新しいお支払い金額計算ロジック()
 private function もっと新しいお支払い金額計算ロジック()
 After Newメソッド!!

Slide 57

Slide 57 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 if ($this->2022年4月から2023年10月の間ならTRUE($年月日)) {
 return $this->新しいお支払い金額計算ロジック();
 }
 return $this->もっと新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 private function 新しいお支払い金額計算ロジック()
 private function もっと新しいお支払い金額計算ロジック()
 After Newメソッド!! 🤮

Slide 58

Slide 58 text

X @kotomin_m #ooc_2024_e ● すでに日付で計算ロジック分岐してるコードが点在 ● Xデーの管理どうしよう ○ 今後またXデー増えるかもしれない←これも対応したい ● 今よりも複雑な実装にしたら今後辛い😖 設計どうする?

Slide 59

Slide 59 text

X @kotomin_m #ooc_2024_e 設計どうする? ● 計算ロジックを定義したインタフェースを作る ● 日付単位で計算ロジックをまとめたクラスで管理 ● Xデーが増えてもクラスを増やせばよい😍

Slide 60

Slide 60 text

X @kotomin_m #ooc_2024_e 設計:報酬計算インタフェースの作成

Slide 61

Slide 61 text

X @kotomin_m #ooc_2024_e 設計:報酬計算クラスの作成

Slide 62

Slide 62 text

X @kotomin_m #ooc_2024_e 設計:報酬計算クラスの作成 2022年4月 2023年10月 〜 〜 〜 日付単位で計算ロジックを まとめたクラス

Slide 63

Slide 63 text

X @kotomin_m #ooc_2024_e 設計:各報酬計算クラスの中身

Slide 64

Slide 64 text

X @kotomin_m #ooc_2024_e 設計:各報酬計算クラスの中身

Slide 65

Slide 65 text

X @kotomin_m #ooc_2024_e 設計:各報酬計算クラスの中身

Slide 66

Slide 66 text

X @kotomin_m #ooc_2024_e 設計:各報酬計算クラスの中身 if文が不要になる!

Slide 67

Slide 67 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得();

Slide 68

Slide 68 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); 渡した日付に対応した報酬計算クラス のインスタンスを返してくれるクラス

Slide 69

Slide 69 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得();

Slide 70

Slide 70 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得();

Slide 71

Slide 71 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); 別の日付を渡す

Slide 72

Slide 72 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得();

Slide 73

Slide 73 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得();

Slide 74

Slide 74 text

X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); ここポイント! 全く同じ書き方で別のメソッドを利用できる!

Slide 75

Slide 75 text

X @kotomin_m #ooc_2024_e 設計:報酬計算ファクトリの作成

Slide 76

Slide 76 text

X @kotomin_m #ooc_2024_e 設計:報酬計算ファクトリの作成 これを「Factoryパターン」というらしい ※このトークは、Factoryパターンを使いましょうと いう話ではない

Slide 77

Slide 77 text

X @kotomin_m #ooc_2024_e Lets' 実装!

Slide 78

Slide 78 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 旧: 報酬リストクラス

Slide 79

Slide 79 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function 報酬計算クラスを選ぶ()
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 新: 報酬リストクラス Newメソッド!!

Slide 80

Slide 80 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 /** @var 報酬計算インタフェース */
 public $報酬計算クラス;
 
 public function 報酬計算クラスを選ぶ($年月日) {
 $this->報酬計算クラス =
 報酬計算ファクトリ->factory($年月日);
 }
 }
 
 新: 報酬リストクラス

Slide 81

Slide 81 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 /** @var 報酬計算インタフェース */
 public $報酬計算クラス;
 
 public function 報酬計算クラスを選ぶ($年月日) {
 $this->報酬計算クラス =
 報酬計算ファクトリ->factory($年月日);
 }
 }
 
 新: 報酬リストクラス このメソッドを適切な場所で呼ぶと 報酬計算クラスが利用可能に

Slide 82

Slide 82 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function 報酬計算クラスを選ぶ()
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 新: 報酬リストクラス 報酬計算クラスを利用して ロジックを改善しよう!

Slide 83

Slide 83 text

X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if ('2022-04-01' < $年月日) {
 return 0;
 }
 if ('2022-04-01' < $年月日 && $年月日 < '2023-10-01') {
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 $ユーザの利用料率 = ユーザごとの利用料率取得();
 return $this->お仕事の合計利用金額取得() * $ユーザの利用料率;
 }
 
 旧: if文を使う実装

Slide 84

Slide 84 text

X @kotomin_m #ooc_2024_e public function システム利用料取得() {
 return $this->報酬計算クラス->システム利用料取得();
 }
 新: 報酬計算クラスを使う実装

Slide 85

Slide 85 text

X @kotomin_m #ooc_2024_e public function システム利用料取得() {
 return $this->報酬計算クラス->システム利用料取得();
 }
 新: 報酬計算クラスを使う実装 😄

Slide 86

Slide 86 text

X @kotomin_m #ooc_2024_e class 報酬リスト {
 function 報酬計算クラスを選ぶ()
 function お仕事の利用金額取得()
 function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 新: 報酬リストクラス こっちも報酬計算クラスを利用して ロジックを改善しよう!

Slide 87

Slide 87 text

X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {
 return $this->初期のお支払い金額計算ロジック();
 }
 if ($this->2022年4月から2023年10月の間ならTRUE($年月日)) {
 return $this->新しいお支払い金額計算ロジック();
 }
 return $this->もっと新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 private function 新しいお支払い金額計算ロジック()
 private function もっと新しいお支払い金額計算ロジック()
 旧: if文を使う実装

Slide 88

Slide 88 text

X @kotomin_m #ooc_2024_e 新: 報酬計算クラスを使う実装 public function 合計お支払い金額取得() {
 $this->報酬計算クラス->合計お支払い金額取得();
 }
 


Slide 89

Slide 89 text

X @kotomin_m #ooc_2024_e 新: 報酬計算クラスを使う実装 public function 合計お支払い金額取得() {
 $this->報酬計算クラス->合計お支払い金額取得();
 }
 
 😄

Slide 90

Slide 90 text

X @kotomin_m #ooc_2024_e 新: 報酬計算クラスを使う実装 public function 合計お支払い金額取得() {
 $this->報酬計算クラス->合計お支払い金額取得();
 }
 
 実際には色々あるので1行にはならないけど…… 😅

Slide 91

Slide 91 text

X @kotomin_m #ooc_2024_e ● 計算ロジックを定義したインタフェースを作る ● 日付単位で計算ロジックをまとめたクラスで管理 ○ Xデーが増えても大丈夫! ● 既存の報酬リストクラスのロジックも簡潔に!🥰 設計まとめ

Slide 92

Slide 92 text

X @kotomin_m #ooc_2024_e Lets' タスク分割!

Slide 93

Slide 93 text

X @kotomin_m #ooc_2024_e 今回の設計のポイント

Slide 94

Slide 94 text

X @kotomin_m #ooc_2024_e 今回の設計のポイント インタフェースを作っ たこと

Slide 95

Slide 95 text

X @kotomin_m #ooc_2024_e インタフェースだけを作成し、先にリリースする インタフェースとタスク分割

Slide 96

Slide 96 text

X @kotomin_m #ooc_2024_e インタフェースだけを作成し、先にリリースする その後のクラス作成でタスク分割が出来る インタフェースとタスク分割

Slide 97

Slide 97 text

X @kotomin_m #ooc_2024_e インタフェースだけを作成し、先にリリースする その後のクラス作成でタスク分割が出来る → 分割して、リリースが出来る インタフェースとタスク分割

Slide 98

Slide 98 text

X @kotomin_m #ooc_2024_e インタフェースだけを作成し、先にリリースする その後のクラス作成でタスク分割が出来る → 分割して、リリースが出来る → デプロイ頻度を保てる インタフェースとタスク分割

Slide 99

Slide 99 text

X @kotomin_m #ooc_2024_e 具体的なタスク分割 今回は各クラスに対応 したテストコードも作る

Slide 100

Slide 100 text

①インタフェースを作成

Slide 101

Slide 101 text

②クラスのファイル追加 メソッドの枠だけ作成

Slide 102

Slide 102 text

③テストコードのファイル追加 テストケースだけ作成

Slide 103

Slide 103 text

④一部のテストケース実装

Slide 104

Slide 104 text

⑤一部のテストケース実装

Slide 105

Slide 105 text

⑥一部のテストケース実装

Slide 106

Slide 106 text

⑦一部のメソッド実装

Slide 107

Slide 107 text

⑧一部のメソッド実装

Slide 108

Slide 108 text

⑨一部のメソッド実装

Slide 109

Slide 109 text

①インタフェースを作成 わたし

Slide 110

Slide 110 text

②クラスのファイル追加 メソッドの枠だけ作成 兼任メンバー

Slide 111

Slide 111 text

③テストコードのファイル追加 テストケースだけ作成 わたし

Slide 112

Slide 112 text

④一部のテストケース実装 ⑦一部のメソッド実装 兼任メンバー パターン①

Slide 113

Slide 113 text

④⑤⑥テストケース実装 わたし パターン②

Slide 114

Slide 114 text

兼任メンバー 兼任メンバー インターン生 ⑦一部のメソッド実装 ⑧一部のメソッド実装 ⑨一部のメソッド実装 パターン②

Slide 115

Slide 115 text

兼任メンバー 兼任メンバー インターン生 ⑦一部のメソッド実装 ⑧一部のメソッド実装 ⑨一部のメソッド実装 パターン②

Slide 116

Slide 116 text

インターン生 兼任メンバー インターン生 ⑦一部のメソッド実装 ⑧一部のメソッド実装 ⑨一部のメソッド実装 担当入れ替え!! パターン②

Slide 117

Slide 117 text

わたし 兼任メンバー 兼任メンバー インターン生 細かくタスク分割することで、 メンバー一人ひとりへの依存が 減り、自由度が上がる

Slide 118

Slide 118 text

X @kotomin_m #ooc_2024_e ● 金額計算の手動テストを減らせる ○ 1円単位での手動テストをしなくていい テストコードを書くメリット

Slide 119

Slide 119 text

X @kotomin_m #ooc_2024_e ● 金額計算の手動テストを減らせる ○ 1円単位での手動テストをしなくていい ● 計算ロジックを担保出来るので計算ミスでの障害 を起こさない テストコードを書くメリット

Slide 120

Slide 120 text

X @kotomin_m #ooc_2024_e ● 慣れていないメンバーにも安心して実装タスクを 任せられる テストコードを書くメリット

Slide 121

Slide 121 text

X @kotomin_m #ooc_2024_e ● 慣れていないメンバーにも安心して実装タスクを 任せられる ○ 私がテストケースを作り、テストを実装する ○ そのテストが通るように実装してもらえばよい ○ → 安心 テストコードを書くメリット

Slide 122

Slide 122 text

X @kotomin_m #ooc_2024_e タスク分割のポイントは2つ! 1. リリース出来る最小単位を考えて分割する 2. 分割したタスクをリリースする順番を考える

Slide 123

Slide 123 text

X @kotomin_m #ooc_2024_e ● 既存クラスにHogeメソッド追加 ● Hogeメソッドを利用したいところで呼び出す ● 既存のデータ構造への必要な変更 ● ユーザごとのシステム利用料を登録するためのDBカラム追加 ● 追加したカラムをモデルのプロパティに追加 ● メソッド名やモデル名を変更するリファクタリング ● etc・・・ その他タスク分割の方法例

Slide 124

Slide 124 text

X @kotomin_m #ooc_2024_e ● チーム開発でタスクの割り振りがしやすい 細かくタスク分割するメリット

Slide 125

Slide 125 text

X @kotomin_m #ooc_2024_e ● チーム開発でタスクの割り振りがしやすい ● コンフリクトも起きにくい 細かくタスク分割するメリット

Slide 126

Slide 126 text

X @kotomin_m #ooc_2024_e ● チーム開発でタスクの割り振りがしやすい ● コンフリクトも起きにくい ● デプロイ頻度を保てる 細かくタスク分割するメリット

Slide 127

Slide 127 text

X @kotomin_m #ooc_2024_e ● チーム開発でタスクの割り振りがしやすい ● コンフリクトも起きにくい ● デプロイ頻度を保てる ● 影響範囲が小さいor無いのでリリースが怖くない 細かくタスク分割するメリット

Slide 128

Slide 128 text

X @kotomin_m #ooc_2024_e ● 適切な関心事でインタフェースを作成しよう ● インタフェースを先にリリースすると、タスク分割がや りやすい ● インタフェースとテストコードがあると、他の人に安心 してタスクを任せてリリースできる トークのまとめ