Ở 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àmcalcSalaryvàsalaryTransfer - Trường hợp ta có hướng xử lý cho một
Exceptioncụ thể thì ta sẽ thực hiệntry/catchvà handle như ởMoneyTransfer.moneyTransfer