$30 off During Our Annual Pro Sale. View Details »

チーム開発でデプロイ頻度を上げるための設計とタスク分割

 チーム開発でデプロイ頻度を上げるための設計とタスク分割

Object-Oriented Conference 2024 2024/03/24 14:30〜
Track E(共1-304)
ショートセッション(20分)

https://fortee.jp/oocon-2024/proposal/6a5a2805-97d6-46b4-b50e-f3edb5eb1ed5

ことみん / kotomin_m

March 20, 2024
Tweet

More Decks by ことみん / kotomin_m

Transcript

  1. X @kotomin_m #ooc_2024_e • 所属: ウィルゲート SRE • 技術: PHP,

    Laravel • 趣味: LT会とカンファレンスと カンファレンスのネイル ことみんです!こんにちは!
  2. X @kotomin_m #ooc_2024_e 開発チームの人数は、1 + 0.5 * 3人 = 2.5人

    ストーリー わたし 兼任メンバー 兼任メンバー インターン生
  3. X @kotomin_m #ooc_2024_e なぜ、デプロイ頻度を上げて開発したいか? • デプロイ頻度は、開発生産性の指標である ◦ (d/d/d)、(deploys/ a day

    / a developer) ◦ → 1開発者あたり1日あたりのデプロイ回数 ◦ = エンジニア組織の健全さの指標 考えたこと
  4. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()


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


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


    function 消費税取得()
 function 合計お支払い金額取得()
 }
 報酬リストクラス 中身を見てみよう!
  7. X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if

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

    ('2022-04-01' < $年月日) {
 return 0;
 }
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 システム利用料取得メソッド 日付で分岐してる!
  9. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()


    function 消費税取得()
 function 合計お支払い金額取得()
 }
 報酬リストクラス こっちも中身を見てみよう!
  10. X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {


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


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


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


    return $this->初期のお支払い金額計算ロジック();
 }
 return $this->新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 
 private function 新しいお支払い金額計算ロジック()
 
 合計お支払い金額計算メソッド 分岐した先の計算ロジック が結構複雑🤯
  14. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()


    function 消費税取得()
 function 合計お支払い金額取得()
 }
 単純に改修しちゃう場合 ロジック改修しよう!
  15. X @kotomin_m #ooc_2024_e public function システム利用料取得($年月日) {
 // 2022年4月以前は利用料無かったので0円を返す
 if

    ('2022-04-01' > $年月日) {
 return 0;
 }
 return $this->お仕事の合計利用金額取得() * 0.20;
 }
 Before
  16. 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
  17. 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分岐!!
  18. 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分岐!! 🤮
  19. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()


    function 消費税取得()
 function 合計お支払い金額取得()
 }
 単純に改修しちゃう場合 こっちもロジック改修しよう!
  20. X @kotomin_m #ooc_2024_e public function 合計お支払い金額取得($年月日) {
 if ($this->2022年4月よりも前ならTRUE($年月日)) {


    return $this->初期のお支払い金額計算ロジック();
 }
 return $this->新しいお支払い金額計算ロジック();
 }
 
 private function 初期のお支払い金額計算ロジック()
 private function 新しいお支払い金額計算ロジック()
 
 Before
  21. 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
  22. 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分岐!!
  23. 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メソッド!!
  24. 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メソッド!! 🤮
  25. X @kotomin_m #ooc_2024_e 設計:日付単位のクラスを利用する $this->報酬計算クラス = 報酬計算ファクトリ('2021-01-01'); // 報酬計算クラスV1のメソッドが呼び出される $金額

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

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

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

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

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

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

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

    = $this->報酬計算クラス->合計お支払い金額取得(); $this->報酬計算クラス = 報酬計算ファクトリ('2022-04-01'); // 報酬計算クラスV2のメソッドが呼び出される $金額 = $this->報酬計算クラス->合計お支払い金額取得(); ここポイント! 全く同じ書き方で別のメソッドを利用できる!
  33. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function お仕事の利用金額取得()
 function システム利用料取得()


    function 消費税取得()
 function 合計お支払い金額取得()
 }
 旧: 報酬リストクラス
  34. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function 報酬計算クラスを選ぶ()
 function お仕事の利用金額取得()


    function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 新: 報酬リストクラス Newメソッド!!
  35. X @kotomin_m #ooc_2024_e class 報酬リスト {
 /** @var 報酬計算インタフェース */


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


    public $報酬計算クラス;
 
 public function 報酬計算クラスを選ぶ($年月日) {
 $this->報酬計算クラス =
 報酬計算ファクトリ->factory($年月日);
 }
 }
 
 新: 報酬リストクラス このメソッドを適切な場所で呼ぶと 報酬計算クラスが利用可能に
  37. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function 報酬計算クラスを選ぶ()
 function お仕事の利用金額取得()


    function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 新: 報酬リストクラス 報酬計算クラスを利用して ロジックを改善しよう!
  38. 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文を使う実装
  39. X @kotomin_m #ooc_2024_e class 報酬リスト {
 function 報酬計算クラスを選ぶ()
 function お仕事の利用金額取得()


    function システム利用料取得()
 function 消費税取得()
 function 合計お支払い金額取得()
 }
 新: 報酬リストクラス こっちも報酬計算クラスを利用して ロジックを改善しよう!
  40. 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文を使う実装
  41. X @kotomin_m #ooc_2024_e • 既存クラスにHogeメソッド追加 • Hogeメソッドを利用したいところで呼び出す • 既存のデータ構造への必要な変更 •

    ユーザごとのシステム利用料を登録するためのDBカラム追加 • 追加したカラムをモデルのプロパティに追加 • メソッド名やモデル名を変更するリファクタリング • etc・・・ その他タスク分割の方法例
  42. X @kotomin_m #ooc_2024_e • チーム開発でタスクの割り振りがしやすい • コンフリクトも起きにくい • デプロイ頻度を保てる •

    影響範囲が小さいor無いのでリリースが怖くない 細かくタスク分割するメリット