SRP公司的財務每週結算工資,計算方式如下
- 時薪 200 元 (星期一到星期五,最多8小時)
- 加班時薪 350 元(星期一到星期五超過8小時的部份算加班,六日整天都算加班時數)
因為勞動局有規定每週工時不能超過60小時
如果有違反規定的話會有罰款
而且每週要把工時報告上傳給勞動局
這週星期三是 SOLID 國的國慶日
勞動局突然公佈這天工作的工資計算要把工時以兩倍計算
財務找了工程師調整了計算的方式,並且測試沒問題後上線了
幾天後,營運長突然收到了勞動局的罰款通知
才發現工時報告和打卡記錄的工時完全對不起來...
參考 Clean Architecture 第 7 章 SRP
把 Employee 的 工資計算
和 工時報表
拆成 PayCalculator
和 HourReporter
避免因為 regularHours 計算方式不同互相影響
範例原始碼可以參考 https://github.com/MingJen/srp-exercise/blob/master/php/src/Employee.php
- 重構出
PayCalculator
和HourReporter
並確認通過測試 - 看能不能讓 regularHours 的計算只存在一個地方
星期 | 工時 | 假日 |
---|---|---|
星期日 | 4 | Y |
星期一 | 9 | N |
星期二 | 8 | N |
星期三 | 5 | N |
星期四 | 9 | N |
星期五 | 9 | N |
星期六 | 7 | Y |
RegularHours = 8 + 8 + 5 + 8 + 8 = 37
OvertimeHours = 4 + (9-8) + 0 + 0 + (9-8) + (9-8) + 7 = 14
Pay = 37 * 200 + 14 * 350 = 12,300
RegularHours = 8 + 8 + (5 * 2 - 2) + 8 + 8 = 40 // 星期三工時變2倍,但是仍保持單日最多 8 小時
OvertimeHours = 4 + (9-8) + 0 + 2 + (9-8) + (9-8) + 7 = 16
Pay = 40 * 200 + 16 * 350 = 13,600
注意 HourReporter 一樣保持 RegularHours 37 小時