Tôi có nên ném ngoại lệ từ nhà xây dựng?


46

Tôi biết tôi có thể ném ngoại lệ từ constructor trong PHP nhưng tôi có nên làm điều đó không? Ví dụ: nếu giá trị của một tham số không như tôi mong đợi.

Hoặc tôi nên trì hoãn việc ném một ngoại lệ cho đến khi một phương thức được gọi. Ưu điểm và nhược điểm trong cả hai trường hợp là gì?


câu hỏi là bạn có muốn người dùng của bạn nhìn thấy các thông báo lỗi ngoại lệ xấu xí không?

15
@LawrenceCherone không, đó không phải là câu hỏi. Không có gì. Câu hỏi đặt ra là có nên đưa ra một ngoại lệ ngay lập tức khi ctor không thể đặt đối tượng thành trạng thái hợp lệ từ các đối số được truyền cho nó hoặc để trì hoãn điều đó cho đến khi một phương thức hoạt động trên thể hiện đó với trạng thái không hợp lệ có thể được gọi. Phù hợp hơn cho các lập trình viên mặc dù.

4
@LawrenceCherone Bạn nói đúng. Không có phần mềm nào cố tình thất bại bao giờ; nó chỉ nên tiếp tục và xem những gì sẽ xảy ra / s
user253751

@immibis mỉa mai tốt là tốt.
kodeart

Đây là một câu hỏi tuyệt vời !!! Tôi thậm chí không bao giờ xem xét ý tưởng này cho đến ngày hôm nay.
Rhys Johns

Câu trả lời:


75

Tại sao bạn lại hoãn ném ngoại lệ?

Nếu bạn biết rằng đối tượng không thể khởi tạo đúng với các tham số đã cho, thì bạn chắc chắn nên đưa ra một ngoại lệ.

Mặt khác, ai đó có thể kiểm tra đối tượng của bạn là null, điều đó sẽ không xảy ra và có thể cho rằng mọi thứ diễn ra như mong đợi.

Có rất nhiều thứ có thể được thực hiện cho đối tượng của bạn mà không cần gọi một phương thức trên nó: nó có thể được thêm vào danh sách, nó có thể được so sánh, nó có thể được gửi dưới dạng tham số, v.v. Tất cả đều là những thứ điều đó không nên xảy ra, coi đó không phải là một đối tượng hợp lệ.


21

Nếu hàm tạo của bạn được gọi với (các) tham số xấu thì bạn nên (phải?) Ném một ngoại lệ. Nếu bạn không thì bạn có thể nhận được một đối tượng xấu sẽ không hoạt động như mong đợi.


17

Chắc chắn rồi!!

Bạn nên ném ngoại lệ nếu các tham số để xây dựng đối tượng không hợp lệ hoặc không theo hợp đồng. Nó không phải là một ý tưởng tốt để đi trước dòng chảy khi biết rằng đối tượng được xây dựng với dữ liệu xấu có thể gây ra nhiều vấn đề nếu bạn cho phép người gọi đi trước.

Luôn luôn tốt hơn để "FAIL FAST VÀ FAIL SỚM"


7

Tôi biết tôi có thể ném ngoại lệ từ constructor trong PHP nhưng tôi có nên làm điều đó không?

Đó là cách duy nhất để thông báo rằng việc xây dựng đối tượng thất bại.


2

Tại sao bạn không xác thực bộ tham số trước khi khởi tạo đối tượng của mình? Làm như vậy sẽ đảm bảo rằng đối tượng của bạn sẽ được tạo, do đó, loại bỏ bất kỳ tác dụng phụ nào có thể xảy ra từ sự thất bại của nó.

Mặc dù tôi biết bạn có thể kiểm tra mọi thứ trong hàm tạo của mình và đưa ra các ngoại lệ, tôi thích viết các hàm tạo của mình theo cách mà chúng không bị lỗi. Tôi thực hiện xác nhận tham số trước khi khởi tạo các đối tượng mà sau đó tôi có thể ném ngoại lệ mà không khiến các hàm tạo của tôi thất bại. Nói chung, tôi cũng không cố gắng khởi tạo các đối tượng mới trong các hàm tạo của mình, thay vào đó, chọn khởi tạo chúng khi tôi cần chúng.

Chỉ là ý kiến ​​của tôi. PHP cung cấp rất nhiều sự tự do - hãy tận hưởng!


Tôi không chắc tại sao câu trả lời này bị hạ thấp. Nó cung cấp một cách tiếp cận hợp lệ bằng cách sử dụng xác thực tham số trước khi xây dựng đối tượng ( phương thức "bảo vệ" ), đây là một cách tốt để thiết kế các lớp / hàm của bạn cho các quy tắc cụ thể (thường là kinh doanh). Nếu cũng không trả lời trực tiếp câu hỏi của OP, nhưng đó vẫn là một lời khuyên tốt :)
kodeart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.