Tôi thấy hai câu hỏi quan trọng quyết định câu trả lời cho điều này:
- Hàm của bạn có thể trả về bất cứ điều gì có ý nghĩa và logic khi thông qua một bộ sưu tập trống (bao gồm null ) không?
- Phong cách lập trình chung trong ứng dụng / thư viện / nhóm này là gì? (Cụ thể, bạn thế nào?)
1. Trả lại có ý nghĩa
Về cơ bản, nếu bạn có thể trả lại một cái gì đó có ý nghĩa, thì đừng ném ngoại lệ. Hãy để người gọi giải quyết kết quả. Vì vậy, nếu chức năng của bạn ...
- Đếm số lượng phần tử trong bộ sưu tập, trả về 0. Điều đó thật dễ dàng.
- Tìm kiếm các yếu tố phù hợp với tiêu chí cụ thể, trả về một bộ sưu tập trống. Xin đừng ném bất cứ thứ gì. Người gọi có thể có một bộ sưu tập lớn các bộ sưu tập, một số trong đó trống, một số thì không. Người gọi muốn bất kỳ yếu tố phù hợp trong bất kỳ bộ sưu tập. Ngoại lệ chỉ làm cho cuộc gọi của người gọi cuộc sống khó khăn hơn.
- Đang tìm kiếm các tiêu chí lớn nhất / nhỏ nhất / phù hợp nhất với tiêu chí trong danh sách. Rất tiếc. Tùy thuộc vào câu hỏi về kiểu, bạn có thể ném ngoại lệ vào đây hoặc bạn có thể trả về null . Tôi ghét null (rất nhiều người FP) nhưng nó có ý nghĩa hơn ở đây và nó cho phép bạn bảo lưu ngoại lệ cho các lỗi không mong muốn trong mã của riêng bạn. Nếu người gọi không kiểm tra null, thì một ngoại lệ khá rõ ràng sẽ xảy ra. Nhưng bạn để lại cho họ.
- Yêu cầu cho mục thứ n trong bộ sưu tập hoặc n mục đầu tiên / cuối cùng. Đây là trường hợp tốt nhất cho một ngoại lệ và là trường hợp ít có khả năng gây nhầm lẫn và khó khăn nhất cho người gọi. Một trường hợp vẫn có thể được thực hiện cho vô nếu bạn và nhóm của bạn được sử dụng để kiểm tra cho rằng, đối với tất cả những lý do được đưa ra trong thời điểm trước, nhưng đây là trường hợp có giá trị nhất nào cho ném một DudeYou Biết YouShouldCheckTheSizeFirst ngoại lệ. Nếu kiểu của bạn có nhiều chức năng hơn, thì hãy bỏ qua hoặc đọc câu trả lời Kiểu của tôi .
Nói chung, thiên vị FP của tôi nói với tôi ¨ từ bỏ một cái gì đó có ý nghĩa¨ và null có thể có ý nghĩa hợp lệ trong trường hợp này.
2. Phong cách
Mã chung của bạn (hoặc mã của dự án hay mã nhóm của nhóm) có thích kiểu chức năng không? Nếu không, các trường hợp ngoại lệ sẽ được dự kiến và xử lý. Nếu có, sau đó xem xét trả lại Loại tùy chọn . Với một loại tùy chọn, bạn có thể trả về một câu trả lời có ý nghĩa hoặc Không / Không có gì . Trong ví dụ thứ ba của tôi từ trên xuống, Không có gì có thể là một câu trả lời tốt trong phong cách FP. Thực tế là hàm trả về một loại Tùy chọn báo hiệu rõ ràng cho người gọi hơn là một câu trả lời có ý nghĩa có thể không thể thực hiện được và người gọi nên được chuẩn bị để đối phó với điều đó. Tôi cảm thấy nó mang lại cho người gọi nhiều lựa chọn hơn (nếu bạn sẽ tha thứ cho trò chơi chữ).
F # là nơi tất cả những đứa trẻ .Net tuyệt vời làm điều này nhưng C # không hỗ trợ phong cách này.
tl; dr
Giữ ngoại lệ cho các lỗi không mong muốn trong đường dẫn mã của riêng bạn, không hoàn toàn có thể thấy trước (và hợp pháp) từ người khác.