Ở bài Clean Code with Exception
mình có nói về cách dùng Exception
để giúp code được đẹp hơn nhưng quả thật thiếu sót khi không có một ví dụ hoàn chỉnh cũng như hướng dẫn sử dụng custom Exception
để giúp cho Exception
rõ nghĩa và cung cấp nhiều thông tin hơn.
Yêu cầu cũng giống như bài Clean Code with Exception. Mình copy qua đây cho tiện khỏi phải xem lại ;))
Viết chương trình tính và chuyển lương cho nhân viên công ty. Từ yêu cầu này cần làm 3 việc sau:
- Tính lương cho nhân viên
- Chuyển lương tới nhân viên
- Điều phối việc tính và chuyển lương
#1 mình đã làm rồi ở bài Clean Code with Exception nhưng nếu xét tổng quát thì #3 cần biết loại lỗi ở #1 và #2. Giả sử #1 cần yêu cần người dùng nhập lại và dừng chương trình, còn #2 thì có thể retry (công ty chuyển lương qua 2 ngân hàng VCB và VTB, VCB lỗi thì thử VTB) ;))
1. Tính lương cho nhân viên
Từ phân tích trên Exception sẽ không thể đáp ứng yêu cầu. Ta cần custom lại Exception
|
|
Với enum define các loại lỗi:
|
|
Từ đây ta sửa lại hàm tính lương một chút:
|
|
2. Chuyển lương tới nhân viên
Bây giờ ta viết những class hỗ trợ chuyển tiền. Giả sử ta tích hợp với 2 ngân hàng VietcomBank và VietinBank. 2 ngân hàng này sẽ phải implement bởi interface
|
|
Mình có implement thêm hành kiểm tra tham số cho việc chuyển tiền qua hàm checkTransferParams
Implement cho VietcomBank
|
|
Để giả lập lỗi ngân hàng. Mình sẽ cho VietcomBank bị lỗi khi số tiền lớn hơn 10M
Tương tự với VietinBank nhưng không lỗi
|
|
3. Điều phối việc tính và chuyển lương
Và cuối cùng là #3 điều phối việc tính và chuyển lương
|
|
Ở đây mình viết luôn hàm main
để thử chạy luôn. Các bạn có thể xem full ví dụ ở repo này
4. Build và test
Ta chạy command sau để build
./gradlew clean build
và test thử:
java -cp build/libs/*.jar dev.trile.customexception.SalaryTransfer 11 1000000 EM1
Transfer 11000000 to EM1
VCB only support transfer amount less than 10M
Retry with VTB
VTB transfer success
Transfer Salary success
java -cp build/libs/*.jar dev.trile.customexception.SalaryTransfer -1 1000000 EM1
WorkingDay less than or equal zero
java -cp build/libs/*.jar dev.trile.customexception.SalaryTransfer 10 -1000000 EM1
SalaryPerDay less than or equal zero
java -cp build/libs/*.jar dev.trile.customexception.SalaryTransfer 15 1000000 EM1
Transfer 15000000 to EM1
VCB only support transfer amount less than 10M
Retry with VTB
VTB transfer success
Transfer Salary success
Kết luận: bằng việc sử dụng custom Exception
giúp code trở nên rõ ràng và nhất quán trong việc xử lý nếu có lỗi xảy ra
- Trường hợp thông thường khi có 1
Exception
được throw ra thì flow sẽ bị break như ở hàmcalcSalary
vàsalaryTransfer
- Trường hợp ta có hướng xử lý cho một
Exception
cụ thể thì ta sẽ thực hiệntry/catch
và handle như ởMoneyTransfer.moneyTransfer