Tôi đang phát triển một thư viện dành cho phát hành công khai. Nó chứa các phương thức khác nhau để vận hành trên các bộ đối tượng - tạo, kiểm tra, phân vùng và chiếu các bộ thành các biểu mẫu mới. Trong trường hợp có liên quan, đó là thư viện lớp C # có chứa các tiện ích mở rộng kiểu LINQ IEnumerable
, sẽ được phát hành dưới dạng gói NuGet.
Một số phương thức trong thư viện này có thể được cung cấp các tham số đầu vào không thỏa mãn. Ví dụ, trong các phương thức tổ hợp, có một phương thức để tạo ra tất cả các bộ n mục có thể được xây dựng từ một tập hợp nguồn của các mục m . Ví dụ: đưa ra tập hợp:
1, 2, 3, 4, 5
và yêu cầu kết hợp 2 sẽ tạo ra:
1, 2
1, 3
1, 4
v.v ...
5, 3
5, 4
Bây giờ, rõ ràng có thể yêu cầu những thứ không thể thực hiện được, như đưa cho nó một bộ 3 vật phẩm và sau đó yêu cầu kết hợp 4 vật phẩm trong khi đặt tùy chọn cho biết nó chỉ có thể sử dụng mỗi vật phẩm một lần.
Trong trường hợp này, mỗi tham số là hợp lệ riêng :
- Bộ sưu tập nguồn không phải là null và không chứa các mục
- Kích thước được yêu cầu của các kết hợp là một số nguyên khác không dương
- Chế độ được yêu cầu (chỉ sử dụng mỗi mục một lần) là một lựa chọn hợp lệ
Tuy nhiên, trạng thái của các tham số khi được thực hiện cùng nhau gây ra vấn đề.
Trong kịch bản này, bạn có muốn phương thức đưa ra một ngoại lệ (ví dụ InvalidOperationException
:) hoặc trả về một bộ sưu tập trống không? Hoặc có vẻ hợp lệ với tôi:
- Do đó, bạn không thể tạo kết hợp n mục từ một nhóm m trong đó n> m nếu bạn chỉ được phép sử dụng mỗi mục một lần, do đó thao tác này có thể được coi là không thể, do đó
InvalidOperationException
. - Tập hợp các kết hợp có kích thước n có thể được tạo từ các mục m khi n> m là một tập hợp trống; không có kết hợp có thể được sản xuất.
Đối số cho một tập hợp trống
Mối quan tâm đầu tiên của tôi là một ngoại lệ ngăn chặn các chuỗi phương thức theo kiểu LINQ khi bạn xử lý các bộ dữ liệu có thể có kích thước không xác định. Nói cách khác, bạn có thể muốn làm một cái gì đó như thế này:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
Nếu bộ đầu vào của bạn có kích thước thay đổi, hành vi của mã này là không thể đoán trước. Nếu .CombinationsOf()
ném một ngoại lệ khi someInputSet
có ít hơn 4 phần tử, thì mã này đôi khi sẽ thất bại khi chạy mà không có một số kiểm tra trước. Trong ví dụ trên, việc kiểm tra này là không quan trọng, nhưng nếu bạn gọi nó là một nửa chuỗi LINQ dài hơn thì điều này có thể trở nên tẻ nhạt. Nếu nó trả về một tập hợp trống, thì nó result
sẽ trống, mà bạn có thể hoàn toàn hài lòng.
Đối số cho một ngoại lệ
Mối quan tâm thứ hai của tôi là việc trả lại một tập hợp trống có thể ẩn các vấn đề - nếu bạn đang gọi phương thức này ở giữa một chuỗi LINQ và nó lặng lẽ trả về một tập hợp trống, sau đó bạn có thể gặp phải các vấn đề sau đó hoặc thấy mình bị trống tập kết quả, và có thể không rõ ràng điều đó đã xảy ra như thế nào khi bạn chắc chắn có thứ gì đó trong bộ đầu vào.
Bạn mong đợi điều gì, và lý lẽ của bạn cho nó là gì?