Chào anh Dũng và mọi người
Em đang thực hiện task: tích hợp Twilio vào dự án backend của công ty.
Em định nghĩa 1 class tên MessageClient trong Service layer
như sau:
import TwilioClient class MessageClient: def __init__(self): self.twilio_client = TwilioClient(twilio_account_sid, twilio_auth_token) def send_message(body, from, to): self.twilio_client.send_message(body, from, to)
send_message có thể successful hoặc failed, nếu fail twilio
sẽ raise exception, em đang phân vân liệu mình sẽ handle exception trong service layer hay trong view (API) layer?
Mong anh giải đáp giúp !
Em cảm ơn ạ.
Trong nguyên 5 nguyên tác S.O.L.I.D thì nguyên tách liskov substitution nói rằng khi lập trình chúng ta nên thiết kế làm sao để lớp có thể bị thay thế mà không làm ảnh hưởng đến tính đúng đắn của chương trình giống như trước khi thay thế.
Vậy nếu em bắt exception ở view thì giả sử em không dùng
TwilioClient
nữa và em muốn thay thế nó, thì em sẽ phải update cả tầng service lẫn view, việc này gây ra tác động lớn, và dễ bị ảnh hướng đến tính đúng đắn.Nhưng khi em bắt exception ở service, em có thể convert về 1 dạng exception do em tạo ra, để tầng view cũng có thể handle được, hoặc em có thể xử lý lỗi ở tầng service này và trả về kết quả cho view, vậy thì khi em không dùng
TwilioClient
nữa, em thay bằng 1 cái khác, thì em chỉ cần update tầng service mà thôi.Vậy câu trả lời cho câu hỏi của em là nên xử lý exception ở tầng service nhé.
Bản thân em cũng nghĩ là handle ở tầng service nhưng thấy các project khác của cty lại handle ở tầng view nên bèn hỏi anh ạ.
Mặt khác, em cũng nghĩ return value của method
send_message
sẽ là boolean, nhưng anh có đề cập về việc `convert về 1 dạng exception do em tạo ra` , vậy thì return value của method có thể trông như thế này:MessageInstance/MessageSendError
phải ko anh ?Có thể ở cty em mọi người cần hoàn thiện nhanh dự án nên bỏ qua các nguyên tắc em ạ.
Em có thể define 1 exception của riêng em kiểu này:
Và sau đó em sẽ wrap lại việc send message thế này: